github.com/ruishantech/selfupdate@v1.0.3/internal/binarydist/seek.go (about) 1 package binarydist 2 3 import ( 4 "errors" 5 ) 6 7 type seekBuffer struct { 8 buf []byte 9 pos int 10 } 11 12 func (b *seekBuffer) Write(p []byte) (n int, err error) { 13 n = copy(b.buf[b.pos:], p) 14 if n == len(p) { 15 b.pos += n 16 return n, nil 17 } 18 b.buf = append(b.buf, p[n:]...) 19 b.pos += len(p) 20 return len(p), nil 21 } 22 23 func (b *seekBuffer) Seek(offset int64, whence int) (ret int64, err error) { 24 var abs int64 25 switch whence { 26 case 0: 27 abs = offset 28 case 1: 29 abs = int64(b.pos) + offset 30 case 2: 31 abs = int64(len(b.buf)) + offset 32 default: 33 return 0, errors.New("binarydist: invalid whence") 34 } 35 if abs < 0 { 36 return 0, errors.New("binarydist: negative position") 37 } 38 if abs >= 1<<31 { 39 return 0, errors.New("binarydist: position out of range") 40 } 41 b.pos = int(abs) 42 return abs, nil 43 }