aboutsummaryrefslogtreecommitdiff
path: root/meta/info.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-07-12 20:31:44 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-07-12 20:31:44 +0200
commit011051c0cb5efc50a83a0967725bd9ba196fc4cd (patch)
treec83b80f23b9eccea51f71976c820a32bb490459a /meta/info.go
parente1e897cd7c27d7c598de52be83e3b4764a5c7861 (diff)
Simplify ReadAt
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
}