From 5868cc3972e59b2b73a6b9bfd45711bba2422517 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 10 Jul 2016 15:56:42 +0200 Subject: Recursive read --- meta/info.go | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) (limited to 'meta') 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 { -- cgit v1.2.3