Files
wazero/internal/sysfs/sock_supported.go
2024-01-02 08:20:11 -08:00

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
}