// Empirically: // open for read: req.Flags == 0 // open for append: req.Flags == 1 // open for write: req.Flags == 1 // open for read/write (+<) == 2 (bitmask? of?) // // open flags are O_WRONLY (1), O_RDONLY (0), or O_RDWR (2). and also // bitmaks of O_SYMLINK (0x200000) maybe. (from // fuse_filehandle_xlate_to_oflags in macosx/kext/fuse_file.h) func (n *mutFile) Open(req *fuse.OpenRequest, res *fuse.OpenResponse, intr fuse.Intr) (fuse.Handle, fuse.Error) { mutFileOpen.Incr() log.Printf("mutFile.Open: %v: content: %v dir=%v flags=%v mode=%v", n.permanode, n.content, req.Dir, req.Flags, req.Mode) r, err := schema.NewFileReader(n.fs.fetcher, n.content) if err != nil { mutFileOpenError.Incr() log.Printf("mutFile.Open: %v", err) return nil, fuse.EIO } // Turn off the OpenDirectIO bit (on by default in rsc fuse server.go), // else append operations don't work for some reason. res.Flags &= ^fuse.OpenDirectIO // Read-only. if req.Flags == 0 { mutFileOpenRO.Incr() log.Printf("mutFile.Open returning read-only file") n := &node{ fs: n.fs, blobref: n.content, } return &nodeReader{n: n, fr: r}, nil } mutFileOpenRW.Incr() log.Printf("mutFile.Open returning read-write filehandle") defer r.Close() return n.newHandle(r) }
// Empirically: // open for read: req.Flags == 0 // open for append: req.Flags == 1 // open for write: req.Flags == 1 // open for read/write (+<) == 2 (bitmask? of?) // // open flags are O_WRONLY (1), O_RDONLY (0), or O_RDWR (2). and also // bitmaks of O_SYMLINK (0x200000) maybe. (from // fuse_filehandle_xlate_to_oflags in macosx/kext/fuse_file.h) func (n *roFile) Open(req *fuse.OpenRequest, res *fuse.OpenResponse, intr fuse.Intr) (fuse.Handle, fuse.Error) { roFileOpen.Incr() if isWriteFlags(req.Flags) { return nil, fuse.EPERM } log.Printf("roFile.Open: %v: content: %v dir=%v flags=%v mode=%v", n.permanode, n.content, req.Dir, req.Flags, req.Mode) r, err := schema.NewFileReader(n.fs.fetcher, n.content) if err != nil { roFileOpenError.Incr() log.Printf("roFile.Open: %v", err) return nil, fuse.EIO } // Turn off the OpenDirectIO bit (on by default in rsc fuse server.go), // else append operations don't work for some reason. res.Flags &= ^fuse.OpenDirectIO // Read-only. nod := &node{ fs: n.fs, blobref: n.content, } return &nodeReader{n: nod, fr: r}, nil }