]> Sergey Matveev's repositories - btrtrc.git/blob - fs/filenode.go
fs: Move fileNode stuff into its own file
[btrtrc.git] / fs / filenode.go
1 package torrentfs
2
3 import (
4         "fmt"
5
6         "bazil.org/fuse"
7         fusefs "bazil.org/fuse/fs"
8         "golang.org/x/net/context"
9 )
10
11 type fileNode struct {
12         node
13         size          uint64
14         TorrentOffset int64
15 }
16
17 var _ fusefs.HandleReader = fileNode{}
18
19 func (fn fileNode) Attr(ctx context.Context, attr *fuse.Attr) error {
20         attr.Size = fn.size
21         attr.Mode = defaultMode
22         return nil
23 }
24
25 func (fn fileNode) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
26         torrentfsReadRequests.Add(1)
27         if req.Dir {
28                 panic("read on directory")
29         }
30         size := req.Size
31         fileLeft := int64(fn.size) - req.Offset
32         if fileLeft < 0 {
33                 fileLeft = 0
34         }
35         if fileLeft < int64(size) {
36                 size = int(fileLeft)
37         }
38         resp.Data = resp.Data[:size]
39         if len(resp.Data) == 0 {
40                 return nil
41         }
42         torrentOff := fn.TorrentOffset + req.Offset
43         n, err := readFull(ctx, fn.FS, fn.t, torrentOff, resp.Data)
44         if err != nil {
45                 return err
46         }
47         if n != size {
48                 panic(fmt.Sprintf("%d < %d", n, size))
49         }
50         return nil
51 }