summaryrefslogtreecommitdiff
path: root/vendor/github.com/tdewolff/parse/v2/binary_unix.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/tdewolff/parse/v2/binary_unix.go')
-rw-r--r--vendor/github.com/tdewolff/parse/v2/binary_unix.go28
1 files changed, 16 insertions, 12 deletions
diff --git a/vendor/github.com/tdewolff/parse/v2/binary_unix.go b/vendor/github.com/tdewolff/parse/v2/binary_unix.go
index 70bb8767f..4a8979fda 100644
--- a/vendor/github.com/tdewolff/parse/v2/binary_unix.go
+++ b/vendor/github.com/tdewolff/parse/v2/binary_unix.go
@@ -5,7 +5,6 @@ package parse
import (
"errors"
"fmt"
- "io"
"os"
"runtime"
"syscall"
@@ -13,6 +12,7 @@ import (
type binaryReaderMmap struct {
data []byte
+ size int64
}
func newBinaryReaderMmap(filename string) (*binaryReaderMmap, error) {
@@ -47,7 +47,7 @@ func newBinaryReaderMmap(filename string) (*binaryReaderMmap, error) {
if err != nil {
return nil, err
}
- r := &binaryReaderMmap{data}
+ r := &binaryReaderMmap{data, size}
runtime.SetFinalizer(r, (*binaryReaderMmap).Close)
return r, nil
}
@@ -67,25 +67,29 @@ func (r *binaryReaderMmap) Close() error {
}
// Len returns the length of the underlying memory-mapped file.
-func (r *binaryReaderMmap) Len() int {
- return len(r.data)
+func (r *binaryReaderMmap) Len() int64 {
+ return r.size
}
-func (r *binaryReaderMmap) Bytes(n int, off int64) ([]byte, error) {
+func (r *binaryReaderMmap) Bytes(b []byte, n, off int64) ([]byte, error) {
if r.data == nil {
return nil, errors.New("mmap: closed")
- } else if off < 0 || int64(len(r.data)) < off {
- return nil, fmt.Errorf("mmap: invalid offset %d", off)
- } else if int64(len(r.data)-n) < off {
- return r.data[off:len(r.data):len(r.data)], io.EOF
+ } else if off < 0 || n < 0 || int64(len(r.data)) < off || int64(len(r.data))-off < n {
+ return nil, fmt.Errorf("mmap: invalid range %d--%d", off, off+n)
}
- return r.data[off : off+int64(n) : off+int64(n)], nil
+
+ data := r.data[off : off+n : off+n]
+ if b == nil {
+ return data, nil
+ }
+ copy(b, data)
+ return b, nil
}
-func NewBinaryReader2Mmap(filename string) (*BinaryReader2, error) {
+func NewBinaryReaderMmap(filename string) (*BinaryReader, error) {
f, err := newBinaryReaderMmap(filename)
if err != nil {
return nil, err
}
- return NewBinaryReader2(f), nil
+ return NewBinaryReader(f), nil
}