]> Sergey Matveev's repositories - btrtrc.git/blobdiff - fs/filenode.go
fs: Use a new torrent file reader per handled request
[btrtrc.git] / fs / filenode.go
index f59e5b0d1c7649d75a69f56ffaa097d4248ecf6a..28a433e18d086d29f97941ff507370d8afa37d69 100644 (file)
@@ -1,51 +1,27 @@
 package torrentfs
 
 import (
-       "fmt"
+       "context"
 
-       "bazil.org/fuse"
-       fusefs "bazil.org/fuse/fs"
-       "golang.org/x/net/context"
+       "github.com/anacrolix/fuse"
+       fusefs "github.com/anacrolix/fuse/fs"
+
+       "github.com/anacrolix/torrent"
 )
 
 type fileNode struct {
        node
-       size          uint64
-       TorrentOffset int64
+       f *torrent.File
 }
 
-var _ fusefs.HandleReader = fileNode{}
+var _ fusefs.NodeOpener = fileNode{}
 
 func (fn fileNode) Attr(ctx context.Context, attr *fuse.Attr) error {
-       attr.Size = fn.size
+       attr.Size = uint64(fn.f.Length())
        attr.Mode = defaultMode
        return nil
 }
 
-func (fn fileNode) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
-       torrentfsReadRequests.Add(1)
-       if req.Dir {
-               panic("read on directory")
-       }
-       size := req.Size
-       fileLeft := int64(fn.size) - req.Offset
-       if fileLeft < 0 {
-               fileLeft = 0
-       }
-       if fileLeft < int64(size) {
-               size = int(fileLeft)
-       }
-       resp.Data = resp.Data[:size]
-       if len(resp.Data) == 0 {
-               return nil
-       }
-       torrentOff := fn.TorrentOffset + req.Offset
-       n, err := readFull(ctx, fn.FS, fn.t, torrentOff, resp.Data)
-       if err != nil {
-               return err
-       }
-       if n != size {
-               panic(fmt.Sprintf("%d < %d", n, size))
-       }
-       return nil
+func (fn fileNode) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (fusefs.Handle, error) {
+       return fileHandle{fn, fn.f}, nil
 }