func (f *open) test(path string, t *testing.T) { // node: mode only matters with O_CREATE fil, err := os.OpenFile(path, os.O_WRONLY|os.O_APPEND, 0) if err == nil { t.Error("Open err == nil, expected ENAMETOOLONG") fil.Close() return } switch err2 := err.(type) { case *os.PathError: if err2.Err == syscall.ENAMETOOLONG { break } t.Errorf("unexpected inner error: %#v", err2) default: t.Errorf("unexpected error: %v", err) } want := openSeen{dir: false, flags: fuse.OpenFlags(os.O_WRONLY | os.O_APPEND)} if runtime.GOOS == "darwin" { // osxfuse does not let O_APPEND through at all // // https://code.google.com/p/macfuse/issues/detail?id=233 // https://code.google.com/p/macfuse/issues/detail?id=132 // https://code.google.com/p/macfuse/issues/detail?id=133 want.flags &^= fuse.OpenFlags(os.O_APPEND) } if g, e := <-f.seen, want; g != e { t.Errorf("open saw %v, want %v", g, e) return } }
func (f *create1) Create(req *fuse.CreateRequest, resp *fuse.CreateResponse, intr fs.Intr) (fs.Node, fs.Handle, fuse.Error) { if req.Name != "foo" { log.Printf("ERROR create1.Create unexpected name: %q\n", req.Name) return nil, nil, fuse.EPERM } flags := req.Flags // OS X does not pass O_TRUNC here, Linux does; as this is a // Create, that's acceptable flags &^= fuse.OpenTruncate if runtime.GOOS == "linux" { // Linux <3.7 accidentally leaks O_CLOEXEC through to FUSE; // avoid spurious test failures flags &^= fuse.OpenFlags(syscall.O_CLOEXEC) } if g, e := flags, fuse.OpenReadWrite|fuse.OpenCreate; g != e { log.Printf("ERROR create1.Create unexpected flags: %v != %v\n", g, e) return nil, nil, fuse.EPERM } if g, e := req.Mode, os.FileMode(0644); g != e { log.Printf("ERROR create1.Create unexpected mode: %v != %v\n", g, e) return nil, nil, fuse.EPERM } return &f.f, &f.f, nil }
func (f *create1) Create(req *fuse.CreateRequest, resp *fuse.CreateResponse, intr Intr) (Node, Handle, fuse.Error) { if req.Name != "foo" { log.Printf("ERROR create1.Create unexpected name: %q\n", req.Name) return nil, nil, fuse.EPERM } flags := req.Flags // OS X does not pass O_TRUNC here, Linux does; as this is a // Create, that's acceptable flags &^= fuse.OpenFlags(os.O_TRUNC) if g, e := flags, fuse.OpenFlags(os.O_CREATE|os.O_RDWR); g != e { log.Printf("ERROR create1.Create unexpected flags: %v != %v\n", g, e) return nil, nil, fuse.EPERM } if g, e := req.Mode, os.FileMode(0644); g != e { log.Printf("ERROR create1.Create unexpected mode: %v != %v\n", g, e) return nil, nil, fuse.EPERM } return &f.f, &f.f, nil }
func TestOpen(t *testing.T) { t.Parallel() f := &open{} mnt, err := fstestutil.MountedT(t, childMapFS{"child": f}) if err != nil { t.Fatal(err) } defer mnt.Close() // node: mode only matters with O_CREATE fil, err := os.OpenFile(mnt.Dir+"/child", os.O_WRONLY|os.O_APPEND, 0) if err == nil { t.Error("Open err == nil, expected ENAMETOOLONG") fil.Close() return } switch err2 := err.(type) { case *os.PathError: if err2.Err == syscall.ENAMETOOLONG { break } t.Errorf("unexpected inner error: %#v", err2) default: t.Errorf("unexpected error: %v", err) } want := fuse.OpenRequest{Dir: false, Flags: fuse.OpenWriteOnly | fuse.OpenAppend} if runtime.GOOS == "darwin" { // osxfuse does not let O_APPEND through at all // // https://code.google.com/p/macfuse/issues/detail?id=233 // https://code.google.com/p/macfuse/issues/detail?id=132 // https://code.google.com/p/macfuse/issues/detail?id=133 want.Flags &^= fuse.OpenAppend } got := f.RecordedOpen() if runtime.GOOS == "linux" { // Linux <3.7 accidentally leaks O_CLOEXEC through to FUSE; // avoid spurious test failures got.Flags &^= fuse.OpenFlags(syscall.O_CLOEXEC) } if g, e := got, want; g != e { t.Errorf("open saw %v, want %v", g, e) return } }
func TestOpenFlagsAccmodeMask(t *testing.T) { var f = fuse.OpenFlags(os.O_RDWR | os.O_SYNC) if g, e := f&fuse.OpenAccessModeMask, fuse.OpenReadWrite; g != e { t.Fatalf("OpenAccessModeMask behaves wrong: %v: %o != %o", f, g, e) } if f.IsReadOnly() { t.Fatalf("IsReadOnly is wrong: %v", f) } if f.IsWriteOnly() { t.Fatalf("IsWriteOnly is wrong: %v", f) } if !f.IsReadWrite() { t.Fatalf("IsReadWrite is wrong: %v", f) } }
func TestOpenFlagsString(t *testing.T) { var f = fuse.OpenFlags(os.O_RDWR | os.O_SYNC | os.O_APPEND) if g, e := f.String(), "OpenReadWrite+OpenAppend+OpenSync"; g != e { t.Fatalf("OpenFlags.String: %q != %q", g, e) } }
func isWriteFlags(flags fuse.OpenFlags) bool { // TODO read/writeness are not flags, use O_ACCMODE return flags&fuse.OpenFlags(os.O_WRONLY|os.O_RDWR|os.O_APPEND|os.O_CREATE) != 0 }