github.com/dennwc/btrfs@v0.0.0-20221026161108-3097362dc072/receive.go (about) 1 package btrfs 2 3 import ( 4 "bytes" 5 "errors" 6 "io" 7 "os" 8 "os/exec" 9 "path/filepath" 10 "syscall" 11 ) 12 13 const nativeReceive = false 14 15 func Receive(r io.Reader, dstDir string) error { 16 if !nativeReceive { 17 buf := bytes.NewBuffer(nil) 18 cmd := exec.Command("btrfs", "receive", dstDir) 19 cmd.Stdin = r 20 cmd.Stderr = buf 21 if err := cmd.Run(); err != nil { 22 if buf.Len() != 0 { 23 return errors.New(buf.String()) 24 } 25 return err 26 } 27 return nil 28 } 29 var err error 30 dstDir, err = filepath.Abs(dstDir) 31 if err != nil { 32 return err 33 } 34 realMnt, err := findMountRoot(dstDir) 35 if err != nil { 36 return err 37 } 38 dir, err := os.OpenFile(dstDir, os.O_RDONLY|syscall.O_NOATIME, 0755) 39 if err != nil { 40 return err 41 } 42 mnt, err := os.OpenFile(realMnt, os.O_RDONLY|syscall.O_NOATIME, 0755) 43 if err != nil { 44 return err 45 } 46 // We want to resolve the path to the subvolume we're sitting in 47 // so that we can adjust the paths of any subvols we want to receive in. 48 subvolID, err := getFileRootID(mnt) 49 if err != nil { 50 return err 51 } 52 //sr, err := send.NewStreamReader(r) 53 //if err != nil { 54 // return err 55 //} 56 _, _ = dir, subvolID 57 panic("not implemented") 58 }