mirror of
https://github.com/siderolabs/talos.git
synced 2025-10-26 14:01:39 +01:00
This time use `eg` from `x/tools` repo tool to do this. Signed-off-by: Dmitriy Matrenichev <dmitry.matrenichev@siderolabs.com>
48 lines
1.0 KiB
Go
48 lines
1.0 KiB
Go
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
package extensions
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
)
|
|
|
|
// discarder is used to implement ReadAt from a Reader
|
|
// by reading, and discarding, data until the offset
|
|
// is reached. It can only go forward. It is designed
|
|
// for pipe-like files.
|
|
type discarder struct {
|
|
r io.Reader
|
|
pos int64
|
|
}
|
|
|
|
// ReadAt implements ReadAt for a discarder.
|
|
// It is an error for the offset to be negative.
|
|
func (r *discarder) ReadAt(p []byte, off int64) (int, error) {
|
|
if off-r.pos < 0 {
|
|
return 0, errors.New("negative seek on discarder not allowed")
|
|
}
|
|
|
|
if off != r.pos {
|
|
i, err := io.Copy(io.Discard, io.LimitReader(r.r, off-r.pos))
|
|
if err != nil || i != off-r.pos {
|
|
return 0, err
|
|
}
|
|
|
|
r.pos += i
|
|
}
|
|
|
|
n, err := io.ReadFull(r.r, p)
|
|
if err != nil {
|
|
return n, err
|
|
}
|
|
|
|
r.pos += int64(n)
|
|
|
|
return n, err
|
|
}
|
|
|
|
var _ io.ReaderAt = &discarder{}
|