]> Sergey Matveev's repositories - btrtrc.git/commitdiff
fs: Move file Read behaviour onto a new handle type
authorMatt Joiner <anacrolix@gmail.com>
Sun, 27 Aug 2017 04:19:58 +0000 (14:19 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Sun, 27 Aug 2017 04:19:58 +0000 (14:19 +1000)
fs/file_handle.go [new file with mode: 0644]
fs/filenode.go
fs/torrentfs_test.go

diff --git a/fs/file_handle.go b/fs/file_handle.go
new file mode 100644 (file)
index 0000000..11a5d74
--- /dev/null
@@ -0,0 +1,43 @@
+package torrentfs
+
+import (
+       "context"
+       "fmt"
+
+       "bazil.org/fuse"
+       "bazil.org/fuse/fs"
+)
+
+type fileHandle struct {
+       fn fileNode
+}
+
+var _ fs.HandleReader = fileHandle{}
+
+func (me fileHandle) 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(me.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 := me.fn.TorrentOffset + req.Offset
+       n, err := readFull(ctx, me.fn.FS, me.fn.t, torrentOff, resp.Data)
+       if err != nil {
+               return err
+       }
+       if n != size {
+               panic(fmt.Sprintf("%d < %d", n, size))
+       }
+       return nil
+}
index f59e5b0d1c7649d75a69f56ffaa097d4248ecf6a..2c83fbf1946435cb405277dd7979c0dad98b188c 100644 (file)
@@ -1,8 +1,6 @@
 package torrentfs
 
 import (
-       "fmt"
-
        "bazil.org/fuse"
        fusefs "bazil.org/fuse/fs"
        "golang.org/x/net/context"
@@ -14,7 +12,9 @@ type fileNode struct {
        TorrentOffset int64
 }
 
-var _ fusefs.HandleReader = fileNode{}
+var (
+       _ fusefs.NodeOpener = fileNode{}
+)
 
 func (fn fileNode) Attr(ctx context.Context, attr *fuse.Attr) error {
        attr.Size = fn.size
@@ -22,30 +22,6 @@ func (fn fileNode) Attr(ctx context.Context, attr *fuse.Attr) error {
        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}, nil
 }
index 19d5b1f18743ca4fbcfb134f173a396c3ca119aa..2625cc3c71316fdb3c9cd33362184ac09dca7286 100644 (file)
@@ -210,7 +210,9 @@ func TestDownloadOnDemand(t *testing.T) {
        resp := &fuse.ReadResponse{
                Data: make([]byte, size),
        }
-       node.(fusefs.HandleReader).Read(netContext.Background(), &fuse.ReadRequest{
+       h, err := node.(fusefs.NodeOpener).Open(nil, nil, nil)
+       require.NoError(t, err)
+       h.(fusefs.HandleReader).Read(netContext.Background(), &fuse.ReadRequest{
                Size: int(size),
        }, resp)
        assert.EqualValues(t, testutil.GreetingFileContents, resp.Data)