Some logic improvements to torrentfs.fileNode.Read

This commit is contained in:
Matt Joiner 2014-08-25 22:15:18 +10:00
parent d17a2958a6
commit 1bb5ee9006
1 changed files with 12 additions and 9 deletions

View File

@ -59,18 +59,21 @@ func (fn fileNode) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fus
}
log.Printf("read request for %s: offset=%d size=%d", fn.fsPath(), req.Offset, req.Size)
size := req.Size
if int64(fn.size)-req.Offset < int64(size) {
size = int(int64(fn.size) - req.Offset)
fileLeft := int64(fn.size) - req.Offset
if fileLeft < int64(size) {
size = int(fileLeft)
}
if size < 0 {
size = 0
resp.Data = resp.Data[:size]
if len(resp.Data) == 0 {
return nil
}
infoHash := fn.InfoHash
torrentOff := fn.TorrentOffset + req.Offset
if err := fn.FS.Client.PrioritizeDataRegion(infoHash, torrentOff, int64(size)); err != nil {
panic(err)
}
resp.Data = resp.Data[:size]
go func() {
if err := fn.FS.Client.PrioritizeDataRegion(infoHash, torrentOff, int64(size)); err != nil {
panic(err)
}
}()
for {
dataWaiter := fn.FS.Client.DataWaiter()
n, err := fn.FS.Client.TorrentReadAt(infoHash, torrentOff, resp.Data)
@ -88,7 +91,7 @@ func (fn fileNode) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fus
}
default:
log.Print(err)
return fuse.EIO
return err // bazil.org/fuse will convert generic errors appropriately.
}
}
}