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 }