func TestMountOnExisting(t *testing.T) { ts := NewTestCase(t) defer ts.Cleanup() err := os.Mkdir(ts.mnt+"/mnt", 0777) if err != nil { t.Fatalf("Mkdir failed: %v", err) } nfs := nodefs.NewDefaultFileSystem() code := ts.connector.Mount(ts.rootNode(), "mnt", nfs, nil) if code != fuse.EBUSY { t.Fatal("expect EBUSY:", code) } err = os.Remove(ts.mnt + "/mnt") if err != nil { t.Fatalf("Remove failed: %v", err) } code = ts.connector.Mount(ts.rootNode(), "mnt", nfs, nil) if !code.Ok() { t.Fatal("expect OK:", code) } code = ts.pathFs.Unmount("mnt") if !code.Ok() { t.Errorf("Unmount failed: %v", code) } }
// DeviceFs is a simple filesystem interface to an MTP device. It // should be wrapped in a Locking(Raw)FileSystem to make sure it is // threadsafe. The file system assumes the device does not touch the // storage. Arguments are the opened mtp device and a directory for the // backing store. func NewDeviceFs(d *mtp.Device, storages []uint32, options DeviceFsOptions) (*DeviceFs, error) { root := rootNode{Node: nodefs.NewDefaultNode()} fs := &DeviceFs{ FileSystem: nodefs.NewDefaultFileSystem(), root: &root, dev: d, options: &options, } root.fs = fs fs.storages = storages err := d.GetDeviceInfo(&fs.devInfo) if err != nil { return fs, nil } if !strings.Contains(fs.devInfo.MTPExtension, "android.com") { fs.options.Android = false } if !options.Android { err = fs.setupClassic() if err != nil { return nil, err } } fs.mungeVfat = make(map[uint32]bool) for _, sid := range fs.storages { var info mtp.StorageInfo if err != nil { return nil, err } fs.mungeVfat[sid] = info.IsRemovable() && fs.options.RemovableVFat } return fs, nil }
func NewMemTreeFs() *MemTreeFs { return &MemTreeFs{ FileSystem: nodefs.NewDefaultFileSystem(), root: memNode{Node: nodefs.NewDefaultNode()}, } }