mirror of https://github.com/k3s-io/k3s
54 lines
959 B
Go
54 lines
959 B
Go
package eagain
|
|
|
|
import (
|
|
"io"
|
|
|
|
"golang.org/x/sys/unix"
|
|
|
|
"github.com/lxc/lxd/shared"
|
|
)
|
|
|
|
// Reader represents an io.Reader that handles EAGAIN
|
|
type Reader struct {
|
|
Reader io.Reader
|
|
}
|
|
|
|
// Read behaves like io.Reader.Read but will retry on EAGAIN
|
|
func (er Reader) Read(p []byte) (int, error) {
|
|
again:
|
|
n, err := er.Reader.Read(p)
|
|
if err == nil {
|
|
return n, nil
|
|
}
|
|
|
|
// keep retrying on EAGAIN
|
|
errno, ok := shared.GetErrno(err)
|
|
if ok && (errno == unix.EAGAIN || errno == unix.EINTR) {
|
|
goto again
|
|
}
|
|
|
|
return n, err
|
|
}
|
|
|
|
// Writer represents an io.Writer that handles EAGAIN
|
|
type Writer struct {
|
|
Writer io.Writer
|
|
}
|
|
|
|
// Write behaves like io.Writer.Write but will retry on EAGAIN
|
|
func (ew Writer) Write(p []byte) (int, error) {
|
|
again:
|
|
n, err := ew.Writer.Write(p)
|
|
if err == nil {
|
|
return n, nil
|
|
}
|
|
|
|
// keep retrying on EAGAIN
|
|
errno, ok := shared.GetErrno(err)
|
|
if ok && (errno == unix.EAGAIN || errno == unix.EINTR) {
|
|
goto again
|
|
}
|
|
|
|
return n, err
|
|
}
|