aboutsummaryrefslogtreecommitdiff
path: root/meta/info.go
diff options
context:
space:
mode:
Diffstat (limited to 'meta/info.go')
-rw-r--r--meta/info.go17
1 files changed, 9 insertions, 8 deletions
diff --git a/meta/info.go b/meta/info.go
index 4b3d28a..251bc22 100644
--- a/meta/info.go
+++ b/meta/info.go
@@ -130,7 +130,7 @@ 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() {
+ if len(b) == 0 || off >= i.TotalLength() {
return 0, nil
}
n, foff := i.findFirstFile(off)
@@ -141,19 +141,20 @@ func (i Info) ReadAt(b []byte, off int64) (n int, err error) {
}
defer fd.Close()
- flen := i.FileLength(n)
-
- // does it fit? read ahead
- if int64(len(b))+foff < flen {
- return fd.ReadAt(b, foff)
+ end := i.FileLength(n) - foff
+ if blen := int64(len(b)); end > blen {
+ end = blen
}
- end := flen - foff
done, err := fd.ReadAt(b[:end], foff)
if err != nil {
- return done, err
+ return 0, err
}
+
next, err := i.ReadAt(b[end:], off+end)
+ if err != nil {
+ return 0, err
+ }
return done + next, err
}