mirror of
				https://github.com/siderolabs/talos.git
				synced 2025-11-04 02:11:12 +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{}
 |