forked from RepoMirrors/btrfs
59 lines
1.1 KiB
Go
59 lines
1.1 KiB
Go
package btrfs
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"io"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"syscall"
|
|
)
|
|
|
|
const nativeReceive = false
|
|
|
|
func Receive(r io.Reader, dstDir string) error {
|
|
if !nativeReceive {
|
|
buf := bytes.NewBuffer(nil)
|
|
cmd := exec.Command("btrfs", "receive", dstDir)
|
|
cmd.Stdin = r
|
|
cmd.Stderr = buf
|
|
if err := cmd.Run(); err != nil {
|
|
if buf.Len() != 0 {
|
|
return errors.New(buf.String())
|
|
}
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
var err error
|
|
dstDir, err = filepath.Abs(dstDir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
realMnt, err := findMountRoot(dstDir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
dir, err := os.OpenFile(dstDir, os.O_RDONLY|syscall.O_NOATIME, 0755)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
mnt, err := os.OpenFile(realMnt, os.O_RDONLY|syscall.O_NOATIME, 0755)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
// We want to resolve the path to the subvolume we're sitting in
|
|
// so that we can adjust the paths of any subvols we want to receive in.
|
|
subvolID, err := getFileRootID(mnt)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
//sr, err := send.NewStreamReader(r)
|
|
//if err != nil {
|
|
// return err
|
|
//}
|
|
_, _ = dir, subvolID
|
|
panic("not implemented")
|
|
}
|