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  }