From c3fcaa348c5d47d45551939d49c3b7106399850b Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Tue, 12 Jul 2016 20:35:54 +0200 Subject: WriteAt --- meta/info.go | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) (limited to 'meta') diff --git a/meta/info.go b/meta/info.go index 251bc22..eba5318 100644 --- a/meta/info.go +++ b/meta/info.go @@ -123,12 +123,39 @@ func (i Info) findFirstFile(off int64) (int, int64) { * 0 1 2 3 4 5 6 7 #file */ -// FIXME WriteAt ... +// WriteAt offset func (i Info) WriteAt(b []byte, off int64) (n int, err error) { - return 0, ErrNotImplemented + if len(b) == 0 || off >= i.TotalLength() { + return 0, nil + } + + n, foff := i.findFirstFile(off) + + fd, err := i.Open(n) + if err != nil { + return 0, err + } + defer fd.Close() + + end := i.FileLength(n) - foff + if blen := int64(len(b)); end > blen { + end = blen + } + + done, err := fd.WriteAt(b[:end], foff) + if err != nil { + return 0, err + } + + next, err := i.WriteAt(b[end:], off+end) + if err != nil { + return 0, err + } + + return done + next, nil } -// FIXME ReadAt ... +// ReadAt offset func (i Info) ReadAt(b []byte, off int64) (n int, err error) { if len(b) == 0 || off >= i.TotalLength() { return 0, nil @@ -156,7 +183,7 @@ func (i Info) ReadAt(b []byte, off int64) (n int, err error) { return 0, err } - return done + next, err + return done + next, nil } func (i Info) String() string { -- cgit v1.2.3