blob *blobs.Blob dirty dirtiness handles uint32 // when was this entry last changed // TODO: written time.Time } var _ = node(&file{}) var _ = fs.Node(&file{}) var _ = fs.NodeForgetter(&file{}) var _ = fs.NodeOpener(&file{}) var _ = fs.NodeSetattrer(&file{}) var _ = fs.NodeFsyncer(&file{}) var _ = fs.HandleFlusher(&file{}) var _ = fs.HandleReader(&file{}) var _ = fs.HandleWriter(&file{}) var _ = fs.HandleReleaser(&file{}) func (f *file) setName(name string) { f.mu.Lock() defer f.mu.Unlock() f.name = name } func (f *file) marshalInternal() (*wire.Dirent, error) { de := &wire.Dirent{ Inode: f.inode, } manifest, err := f.blob.Save() if err != nil {
"bazil.org/bazil/fs/snap/wire" "bazil.org/bazil/util/env" "bazil.org/fuse" fusefs "bazil.org/fuse/fs" "golang.org/x/net/context" ) type fuseFile struct { de *wire.Dirent rat io.ReaderAt } var _ = fusefs.Node(fuseFile{}) var _ = fusefs.NodeOpener(fuseFile{}) var _ = fusefs.Handle(fuseFile{}) var _ = fusefs.HandleReader(fuseFile{}) func (e fuseFile) Attr(ctx context.Context, a *fuse.Attr) error { a.Mode = 0444 a.Uid = env.MyUID a.Gid = env.MyGID a.Size = e.de.File.Manifest.Size // a.Mtime = e.Meta.Written.UTC() // a.Ctime = e.Meta.Written.UTC() // a.Crtime = e.Meta.Written.UTC() a.Blocks = statBlocks(e.de.File.Manifest.Size) // TODO .Space? return nil } func (e fuseFile) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (fusefs.Handle, error) { if !req.Flags.IsReadOnly() {
func (benchDir) ReadDir(intr fs.Intr) ([]fuse.Dirent, fuse.Error) { l := []fuse.Dirent{ {Inode: 2, Name: "bench", Type: fuse.DT_File}, } return l, nil } type benchFile struct { conf *benchConfig } var _ = fs.Node(benchFile{}) var _ = fs.NodeOpener(benchFile{}) var _ = fs.NodeFsyncer(benchFile{}) var _ = fs.Handle(benchFile{}) var _ = fs.HandleReader(benchFile{}) var _ = fs.HandleWriter(benchFile{}) func (benchFile) Attr() fuse.Attr { return fuse.Attr{Inode: 2, Mode: 0644, Size: 9999999999999999} } func (f benchFile) Open(req *fuse.OpenRequest, resp *fuse.OpenResponse, intr fs.Intr) (fs.Handle, fuse.Error) { if f.conf.directIO { resp.Flags |= fuse.OpenDirectIO } // TODO configurable? resp.Flags |= fuse.OpenKeepCache return f, nil }
glog.Infof("Entered Release: Artist: %s, Album: %s, Song: %s\n", fh.f.artist, fh.f.album, fh.f.name) ret_val := fh.r.Close() extension := filepath.Ext(fh.f.name) songPath, err := store.GetFilePath(fh.f.artist, fh.f.album, fh.f.name) if err != nil { return err } if extension == ".mp3" { //TODO: Use the correct artist and album musicmgr.SetMp3Tags(fh.f.artist, fh.f.album, fh.f.song, songPath) } return ret_val } var _ = fs.HandleReader(&FileHandle{}) func (fh *FileHandle) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error { glog.Infof("Entered Read.\n") //TODO: Check if we need to add something here for playlists and drop directories. if fh.r == nil { if fh.f.name == ".description" { glog.Info("Reading description file\n") if len(fh.f.artist) < 1 { return fuse.ENOENT } _, err := store.GetArtistPath(fh.f.artist) if err != nil { return err }
n, err := h.layer.Seek(0, os.SEEK_SET) if err != nil { log.Warningf("Seek failed on flush: %v", err) return fuse.ENODATA } if n != 0 { log.Warningf("Seek offset is not 0") } err = h.fsys.Store.StageFromReader(h.path, h.layer, compress.AlgoSnappy) if err != nil && err != store.ErrNoChange { log.Warningf("Add failed: %v", err) return fuse.ENODATA } if err := h.layer.Close(); err != nil { log.Warningf("Close failed: %v", err) return fuse.ENODATA } return nil } // Compiler checks to see if we got all the interfaces right: var _ = fs.HandleFlusher(&Handle{}) var _ = fs.HandleReader(&Handle{}) var _ = fs.HandleReleaser(&Handle{}) var _ = fs.HandleWriter(&Handle{})