44 lines
795 B
Go
44 lines
795 B
Go
![]() |
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
|
||
|
}
|