import (
"context"
"io"
- "os"
- "github.com/anacrolix/missinggo"
- "github.com/anacrolix/torrent"
+ "github.com/anacrolix/fuse"
+ "github.com/anacrolix/fuse/fs"
+ "github.com/anacrolix/missinggo/v2"
- "bazil.org/fuse"
- "bazil.org/fuse/fs"
+ "github.com/anacrolix/torrent"
)
type fileHandle struct {
fn fileNode
- r *torrent.Reader
+ r torrent.Reader
}
var _ interface {
if req.Dir {
panic("read on directory")
}
- pos, err := me.r.Seek(me.fn.TorrentOffset+req.Offset, os.SEEK_SET)
+ r := me.r
+ pos, err := r.Seek(req.Offset, io.SeekStart)
if err != nil {
panic(err)
}
- if pos != me.fn.TorrentOffset+req.Offset {
+ if pos != req.Offset {
panic("seek failed")
}
resp.Data = resp.Data[:req.Size]
me.fn.FS.event.Broadcast()
me.fn.FS.mu.Unlock()
var n int
- r := missinggo.ContextedReader{me.r, ctx}
- n, readErr = r.Read(resp.Data)
- if readErr == io.EOF {
- readErr = nil
+ r := missinggo.ContextedReader{r, ctx}
+ // log.Printf("reading %v bytes at %v", len(resp.Data), req.Offset)
+ if true {
+ // A user reported on that on freebsd 12.2, the system requires that reads are
+ // completely filled. Their system only asks for 64KiB at a time. I've seen systems that
+ // can demand up to 16MiB at a time, so this gets tricky. For now, I'll restore the old
+ // behaviour from before 2a7352a, which nobody reported problems with.
+ n, readErr = io.ReadFull(r, resp.Data)
+ } else {
+ n, readErr = r.Read(resp.Data)
+ if readErr == io.EOF {
+ readErr = nil
+ }
}
resp.Data = resp.Data[:n]
}()