aboutsummaryrefslogtreecommitdiff
path: root/meta/info.go
diff options
context:
space:
mode:
Diffstat (limited to 'meta/info.go')
-rw-r--r--meta/info.go21
1 files changed, 16 insertions, 5 deletions
diff --git a/meta/info.go b/meta/info.go
index d4b19bc..4b3d28a 100644
--- a/meta/info.go
+++ b/meta/info.go
@@ -21,6 +21,15 @@ type Info struct {
RootHash []byte `bencode:"root hash"` // BEP-0030
}
+// NPieces returns number of all pieces
+func (i Info) NPieces() int {
+ full, last := i.Full(), i.Last()
+ if last > 0 {
+ return full + 1
+ }
+ return full
+}
+
// Full returns count of full pieces
func (i Info) Full() int {
return int(i.TotalLength() / int64(i.PieceLength))
@@ -121,6 +130,9 @@ func (i Info) WriteAt(b []byte, off int64) (n int, err error) {
// FIXME ReadAt ...
func (i Info) ReadAt(b []byte, off int64) (n int, err error) {
+ if off >= i.TotalLength() {
+ return 0, nil
+ }
n, foff := i.findFirstFile(off)
fd, err := i.Open(n)
@@ -131,18 +143,17 @@ func (i Info) ReadAt(b []byte, off int64) (n int, err error) {
flen := i.FileLength(n)
- // does it fit?
- if int64(len(b))+foff <= flen {
+ // does it fit? read ahead
+ if int64(len(b))+foff < flen {
return fd.ReadAt(b, foff)
}
- end := flen + foff
-
+ end := flen - foff
done, err := fd.ReadAt(b[:end], foff)
if err != nil {
return done, err
}
- next, err := i.ReadAt(b[end:], end)
+ next, err := i.ReadAt(b[end:], off+end)
return done + next, err
}