From f61237a1f0f14281b3c0c05e9a7120d79fdaa08c Mon Sep 17 00:00:00 2001 From: Caleb Gardner Date: Thu, 22 Dec 2022 02:00:42 -0600 Subject: [PATCH] Added ReaderAtOffset --- internal/toreader/offsetreader.go | 19 +++++++++++++++++++ internal/toreader/readerat.go | 3 ++- reader.go | 4 ++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 internal/toreader/offsetreader.go diff --git a/internal/toreader/offsetreader.go b/internal/toreader/offsetreader.go new file mode 100644 index 0000000..0192177 --- /dev/null +++ b/internal/toreader/offsetreader.go @@ -0,0 +1,19 @@ +package toreader + +import "io" + +type OffsetReader struct { + r io.ReaderAt + off int64 +} + +func NewOffsetReader(r io.ReaderAt, off int64) *OffsetReader { + return &OffsetReader{ + r: r, + off: off, + } +} + +func (r OffsetReader) ReadAt(p []byte, off int64) (n int, e error) { + return r.r.ReadAt(p, off+r.off) +} diff --git a/internal/toreader/readerat.go b/internal/toreader/readerat.go index be26ac9..b556ca7 100644 --- a/internal/toreader/readerat.go +++ b/internal/toreader/readerat.go @@ -6,7 +6,8 @@ type ReaderAt struct { d []byte } -func NewReaderAt(r io.Reader) (ra ReaderAt, err error) { +func NewReaderAt(r io.Reader) (ra *ReaderAt, err error) { + ra = new(ReaderAt) ra.d, err = io.ReadAll(r) return } diff --git a/reader.go b/reader.go index 55f5ab7..b2547fa 100644 --- a/reader.go +++ b/reader.go @@ -40,6 +40,10 @@ const ( ZSTDCompression ) +func NewReaderAtOffset(r io.ReaderAt, off int64) (*Reader, error) { + return NewReader(toreader.NewOffsetReader(r, off)) +} + // Creates a new squashfs.Reader from the given io.Reader. NOTE: All data from the io.Reader will be read and stored in memory. func NewReaderFromReader(r io.Reader) (*Reader, error) { rdr, err := toreader.NewReaderAt(r)