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