From 6d459435f3c99ce2048baa775a6140fd559d69ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 18 Oct 2017 20:10:22 +0200 Subject: [PATCH 1/2] gateway: fix seeker can't seek on specific files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera --- io/pbdagreader.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/io/pbdagreader.go b/io/pbdagreader.go index 0b75fd916..7ba63649f 100644 --- a/io/pbdagreader.go +++ b/io/pbdagreader.go @@ -243,7 +243,16 @@ func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { return dr.Seek(noffset, io.SeekStart) case io.SeekEnd: noffset := int64(dr.pbdata.GetFilesize()) - offset - return dr.Seek(noffset, io.SeekStart) + n, err := dr.Seek(noffset, io.SeekStart) + + // Return negative number if we can't figure out the file size. Using io.EOF + // for this seems to be good(-enough) solution as it's only returned by + // precalcNextBuf when we step out of file range. + // This is needed for gateway to function properly + if err == io.EOF && *dr.pbdata.Type == ftpb.Data_File { + return -1, nil + } + return n, err default: return 0, errors.New("invalid whence") } From f98d19ae1bb1e1b973787b9504b569c0e961ff2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 18 Oct 2017 22:25:36 +0200 Subject: [PATCH 2/2] gateway: custom seeker for files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera --- io/pbdagreader.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/io/pbdagreader.go b/io/pbdagreader.go index 7ba63649f..dcd383460 100644 --- a/io/pbdagreader.go +++ b/io/pbdagreader.go @@ -188,6 +188,9 @@ func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { if offset < 0 { return -1, errors.New("Invalid offset") } + if offset == dr.offset { + return offset, nil + } // Grab cached protobuf object (solely to make code look cleaner) pb := dr.pbdata @@ -239,6 +242,10 @@ func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { return offset, nil case io.SeekCurrent: // TODO: be smarter here + if offset == 0 { + return dr.offset, nil + } + noffset := dr.offset + offset return dr.Seek(noffset, io.SeekStart) case io.SeekEnd: