30 lines
1015 B
Go
30 lines
1015 B
Go
//go:build linux || darwin || windows
|
|
|
|
package sysfs
|
|
|
|
import (
|
|
"syscall"
|
|
|
|
experimentalsys "github.com/tetratelabs/wazero/experimental/sys"
|
|
)
|
|
|
|
// syscallConnControl extracts a syscall.RawConn from the given syscall.Conn and applies
|
|
// the given fn to a file descriptor, returning an integer or a nonzero syscall.Errno on failure.
|
|
//
|
|
// syscallConnControl streamlines the pattern of extracting the syscall.Rawconn,
|
|
// invoking its syscall.RawConn.Control method, then handling properly the errors that may occur
|
|
// within fn or returned by syscall.RawConn.Control itself.
|
|
func syscallConnControl(conn syscall.Conn, fn func(fd uintptr) (int, experimentalsys.Errno)) (n int, errno experimentalsys.Errno) {
|
|
syscallConn, err := conn.SyscallConn()
|
|
if err != nil {
|
|
return 0, experimentalsys.UnwrapOSError(err)
|
|
}
|
|
// Prioritize the inner errno over Control
|
|
if controlErr := syscallConn.Control(func(fd uintptr) {
|
|
n, errno = fn(fd)
|
|
}); errno == 0 {
|
|
errno = experimentalsys.UnwrapOSError(controlErr)
|
|
}
|
|
return
|
|
}
|