aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-07-10 15:56:42 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-07-10 15:56:42 +0200
commit5868cc3972e59b2b73a6b9bfd45711bba2422517 (patch)
tree40f94603dc2140705f3a2187ebcc432195096b90
parent1ac83d1ed053aa95f9ac86323d2e5d2f49d4677d (diff)
Recursive read
-rw-r--r--meta/info.go34
1 files changed, 19 insertions, 15 deletions
diff --git a/meta/info.go b/meta/info.go
index b9e1f5d..9dd1178 100644
--- a/meta/info.go
+++ b/meta/info.go
@@ -114,22 +114,26 @@ 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) {
- n, offset := i.findFirstFile(off)
- var done int
- for k := n; done < len(b); k++ {
- fd, err := i.Open(k)
- if err != nil {
- return done, err
- }
- nn, err := fd.ReadAt(b[done:], offset)
- if err != nil {
- return done, err
- }
- done += nn
- fd.Close()
- off = 0
+ n, foff := i.findFirstFile(off)
+
+ fd, err := i.Open(n)
+ if err != nil {
+ return 0, err
+ }
+ defer fd.Close()
+
+ flen := i.Files[n].Length
+
+ if int64(len(b)) <= i.Files[n].Length {
+ return fd.ReadAt(b, foff)
+ }
+
+ nn, err := fd.ReadAt(b[:flen], foff)
+ if err != nil {
+ return nn, err
}
- return done, nil
+ nnn, err := i.ReadAt(b[flen:], foff+flen)
+ return nn + nnn, err
}
func (i Info) String() string {