11package btrfs
22
33import (
4+ "fmt"
45 "github.com/dennwc/btrfs/ioctl"
6+ "io"
57 "os"
8+ "path/filepath"
69)
710
8- //go:generate go run cmd/hgen.go -p btrfs -o btrfs_tree_hc.go btrfs_tree.h
9- //go:generate go fmt -w btrfs_tree_hc.go
10-
1111const SuperMagic = 0x9123683E
1212
1313func Open (path string ) (* FS , error ) {
@@ -19,6 +19,12 @@ func Open(path string) (*FS, error) {
1919 dir , err := os .Open (path )
2020 if err != nil {
2121 return nil , err
22+ } else if st , err := dir .Stat (); err != nil {
23+ dir .Close ()
24+ return nil , err
25+ } else if ! st .IsDir () {
26+ dir .Close ()
27+ return nil , fmt .Errorf ("not a directory: %s" , path )
2228 }
2329 return & FS {f : dir }, nil
2430}
@@ -139,3 +145,39 @@ func (f *FS) Sync() (err error) {
139145 }
140146 return ioctl .Do (f .f , _BTRFS_IOC_WAIT_SYNC , nil )
141147}
148+
149+ func (f * FS ) CreateSubVolume (name string ) error {
150+ return CreateSubVolume (filepath .Join (f .f .Name (), name ))
151+ }
152+
153+ func (f * FS ) DeleteSubVolume (name string ) error {
154+ return DeleteSubVolume (filepath .Join (f .f .Name (), name ))
155+ }
156+
157+ func (f * FS ) Snapshot (dst string , ro bool ) error {
158+ return SnapshotSubVolume (f .f .Name (), filepath .Join (f .f .Name (), dst ), ro )
159+ }
160+
161+ func (f * FS ) SnapshotSubVolume (name string , dst string , ro bool ) error {
162+ return SnapshotSubVolume (filepath .Join (f .f .Name (), name ),
163+ filepath .Join (f .f .Name (), dst ), ro )
164+ }
165+
166+ func (f * FS ) Send (w io.Writer , parent string , subvols ... string ) error {
167+ if parent != "" {
168+ parent = filepath .Join (f .f .Name (), parent )
169+ }
170+ sub := make ([]string , 0 , len (subvols ))
171+ for _ , s := range subvols {
172+ sub = append (sub , filepath .Join (f .f .Name (), s ))
173+ }
174+ return Send (w , parent , sub ... )
175+ }
176+
177+ func (f * FS ) Receive (r io.Reader ) error {
178+ return Receive (r , f .f .Name ())
179+ }
180+
181+ func (f * FS ) ReceiveTo (r io.Reader , mount string ) error {
182+ return Receive (r , filepath .Join (f .f .Name (), mount ))
183+ }
0 commit comments