aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-07-12 20:35:54 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-07-12 20:35:54 +0200
commitc3fcaa348c5d47d45551939d49c3b7106399850b (patch)
tree9221737279988a2f19252ca13347e5fdb027fbf4
parent011051c0cb5efc50a83a0967725bd9ba196fc4cd (diff)
WriteAt
-rw-r--r--meta/info.go35
1 files changed, 31 insertions, 4 deletions
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 {