package unix
import (
)
var (
Stdin = 0
Stdout = 1
Stderr = 2
)
var (
errEAGAIN error = syscall.EAGAIN
errEINVAL error = syscall.EINVAL
errENOENT error = syscall.ENOENT
)
var (
signalNameMapOnce sync.Once
signalNameMap map[string]syscall.Signal
)
func ( syscall.Errno) error {
switch {
case 0:
return nil
case EAGAIN:
return errEAGAIN
case EINVAL:
return errEINVAL
case ENOENT:
return errENOENT
}
return
}
func ( syscall.Errno) string {
:= sort.Search(len(errorList), func( int) bool {
return errorList[].num >=
})
if < len(errorList) && errorList[].num == {
return errorList[].name
}
return ""
}
func ( syscall.Signal) string {
:= sort.Search(len(signalList), func( int) bool {
return signalList[].num >=
})
if < len(signalList) && signalList[].num == {
return signalList[].name
}
return ""
}
func ( string) syscall.Signal {
signalNameMapOnce.Do(func() {
signalNameMap = make(map[string]syscall.Signal, len(signalList))
for , := range signalList {
signalNameMap[.name] = .num
}
})
return signalNameMap[]
}
func ( []byte) int {
:= bytes.IndexByte(, 0)
if == -1 {
= len()
}
return
}
type mmapper struct {
sync.Mutex
active map[*byte][]byte
mmap func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error)
munmap func(addr uintptr, length uintptr) error
}
func ( *mmapper) ( int, int64, int, int, int) ( []byte, error) {
if <= 0 {
return nil, EINVAL
}
, := .mmap(0, uintptr(), , , , )
if != nil {
return nil,
}
:= unsafe.Slice((*byte)(unsafe.Pointer()), )
:= &[cap()-1]
.Lock()
defer .Unlock()
.active[] =
return , nil
}
func ( *mmapper) ( []byte) ( error) {
if len() == 0 || len() != cap() {
return EINVAL
}
:= &[cap()-1]
.Lock()
defer .Unlock()
:= .active[]
if == nil || &[0] != &[0] {
return EINVAL
}
if := .munmap(uintptr(unsafe.Pointer(&[0])), uintptr(len())); != nil {
return
}
delete(.active, )
return nil
}
func ( int, []byte) ( int, error) {
, = read(, )
if raceenabled {
if > 0 {
raceWriteRange(unsafe.Pointer(&[0]), )
}
if == nil {
raceAcquire(unsafe.Pointer(&ioSync))
}
}
return
}
func ( int, []byte) ( int, error) {
if raceenabled {
raceReleaseMerge(unsafe.Pointer(&ioSync))
}
, = write(, )
if raceenabled && > 0 {
raceReadRange(unsafe.Pointer(&[0]), )
}
return
}
func ( int, []byte, int64) ( int, error) {
, = pread(, , )
if raceenabled {
if > 0 {
raceWriteRange(unsafe.Pointer(&[0]), )
}
if == nil {
raceAcquire(unsafe.Pointer(&ioSync))
}
}
return
}
func ( int, []byte, int64) ( int, error) {
if raceenabled {
raceReleaseMerge(unsafe.Pointer(&ioSync))
}
, = pwrite(, , )
if raceenabled && > 0 {
raceReadRange(unsafe.Pointer(&[0]), )
}
return
}
var SocketDisableIPv6 bool
type Sockaddr interface {
sockaddr() (ptr unsafe.Pointer, len _Socklen, err error)
}
type SockaddrInet4 struct {
Port int
Addr [4]byte
raw RawSockaddrInet4
}
type SockaddrInet6 struct {
Port int
ZoneId uint32
Addr [16]byte
raw RawSockaddrInet6
}
type SockaddrUnix struct {
Name string
raw RawSockaddrUnix
}
func ( int, Sockaddr) ( error) {
, , := .sockaddr()
if != nil {
return
}
return bind(, , )
}
func ( int, Sockaddr) ( error) {
, , := .sockaddr()
if != nil {
return
}
return connect(, , )
}
func ( int) ( Sockaddr, error) {
var RawSockaddrAny
var _Socklen = SizeofSockaddrAny
if = getpeername(, &, &); != nil {
return
}
return anyToSockaddr(, &)
}
func (, , int) ( byte, error) {
var byte
:= _Socklen(1)
= getsockopt(, , , unsafe.Pointer(&), &)
return ,
}
func (, , int) ( int, error) {
var int32
:= _Socklen(4)
= getsockopt(, , , unsafe.Pointer(&), &)
return int(),
}
func (, , int) ( [4]byte, error) {
:= _Socklen(4)
= getsockopt(, , , unsafe.Pointer(&[0]), &)
return ,
}
func (, , int) (*IPMreq, error) {
var IPMreq
:= _Socklen(SizeofIPMreq)
:= getsockopt(, , , unsafe.Pointer(&), &)
return &,
}
func (, , int) (*IPv6Mreq, error) {
var IPv6Mreq
:= _Socklen(SizeofIPv6Mreq)
:= getsockopt(, , , unsafe.Pointer(&), &)
return &,
}
func (, , int) (*IPv6MTUInfo, error) {
var IPv6MTUInfo
:= _Socklen(SizeofIPv6MTUInfo)
:= getsockopt(, , , unsafe.Pointer(&), &)
return &,
}
func (, , int) (*ICMPv6Filter, error) {
var ICMPv6Filter
:= _Socklen(SizeofICMPv6Filter)
:= getsockopt(, , , unsafe.Pointer(&), &)
return &,
}
func (, , int) (*Linger, error) {
var Linger
:= _Socklen(SizeofLinger)
:= getsockopt(, , , unsafe.Pointer(&), &)
return &,
}
func (, , int) (*Timeval, error) {
var Timeval
:= _Socklen(unsafe.Sizeof())
:= getsockopt(, , , unsafe.Pointer(&), &)
return &,
}
func (, , int) ( uint64, error) {
var uint64
:= _Socklen(8)
= getsockopt(, , , unsafe.Pointer(&), &)
return ,
}
func ( int, []byte, int) ( int, Sockaddr, error) {
var RawSockaddrAny
var _Socklen = SizeofSockaddrAny
if , = recvfrom(, , , &, &); != nil {
return
}
if .Addr.Family != AF_UNSPEC {
, = anyToSockaddr(, &)
}
return
}
func ( int, , []byte, int) (, int, int, Sockaddr, error) {
var [1]Iovec
if len() > 0 {
[0].Base = &[0]
[0].SetLen(len())
}
var RawSockaddrAny
, , , = recvmsgRaw(, [:], , , &)
if .Addr.Family != AF_UNSPEC {
, = anyToSockaddr(, &)
}
return
}
func ( int, [][]byte, []byte, int) (, int, int, Sockaddr, error) {
:= make([]Iovec, len())
for := range {
if len([]) > 0 {
[].Base = &[][0]
[].SetLen(len([]))
} else {
[].Base = (*byte)(unsafe.Pointer(&_zero))
}
}
var RawSockaddrAny
, , , = recvmsgRaw(, , , , &)
if == nil && .Addr.Family != AF_UNSPEC {
, = anyToSockaddr(, &)
}
return
}
func ( int, , []byte, Sockaddr, int) ( error) {
_, = SendmsgN(, , , , )
return
}
func ( int, , []byte, Sockaddr, int) ( int, error) {
var [1]Iovec
if len() > 0 {
[0].Base = &[0]
[0].SetLen(len())
}
var unsafe.Pointer
var _Socklen
if != nil {
, , = .sockaddr()
if != nil {
return 0,
}
}
return sendmsgN(, [:], , , , )
}
func ( int, [][]byte, []byte, Sockaddr, int) ( int, error) {
:= make([]Iovec, len())
for := range {
if len([]) > 0 {
[].Base = &[][0]
[].SetLen(len([]))
} else {
[].Base = (*byte)(unsafe.Pointer(&_zero))
}
}
var unsafe.Pointer
var _Socklen
if != nil {
, , = .sockaddr()
if != nil {
return 0,
}
}
return sendmsgN(, , , , , )
}
func ( int, []byte, int) ( error) {
return sendto(, , , nil, 0)
}
func ( int, []byte, int, Sockaddr) ( error) {
var unsafe.Pointer
var _Socklen
if != nil {
, , = .sockaddr()
if != nil {
return
}
}
return sendto(, , , , )
}
func (, , int, byte) ( error) {
return setsockopt(, , , unsafe.Pointer(&), 1)
}
func (, , int, int) ( error) {
var = int32()
return setsockopt(, , , unsafe.Pointer(&), 4)
}
func (, , int, [4]byte) ( error) {
return setsockopt(, , , unsafe.Pointer(&[0]), 4)
}
func (, , int, *IPMreq) ( error) {
return setsockopt(, , , unsafe.Pointer(), SizeofIPMreq)
}
func (, , int, *IPv6Mreq) ( error) {
return setsockopt(, , , unsafe.Pointer(), SizeofIPv6Mreq)
}
func (, , int, *ICMPv6Filter) error {
return setsockopt(, , , unsafe.Pointer(), SizeofICMPv6Filter)
}
func (, , int, *Linger) ( error) {
return setsockopt(, , , unsafe.Pointer(), SizeofLinger)
}
func (, , int, string) ( error) {
var unsafe.Pointer
if len() > 0 {
= unsafe.Pointer(&[]byte()[0])
}
return setsockopt(, , , , uintptr(len()))
}
func (, , int, *Timeval) ( error) {
return setsockopt(, , , unsafe.Pointer(), unsafe.Sizeof(*))
}
func (, , int, uint64) ( error) {
return setsockopt(, , , unsafe.Pointer(&), 8)
}
func (, , int) ( int, error) {
if == AF_INET6 && SocketDisableIPv6 {
return -1, EAFNOSUPPORT
}
, = socket(, , )
return
}
func (, , int) ( [2]int, error) {
var [2]int32
= socketpair(, , , &)
if == nil {
[0] = int([0])
[1] = int([1])
}
return
}
var ioSync int64
func ( int) { fcntl(, F_SETFD, FD_CLOEXEC) }
func ( int, bool) ( error) {
, := fcntl(, F_GETFL, 0)
if != nil {
return
}
if {
|= O_NONBLOCK
} else {
&= ^O_NONBLOCK
}
_, = fcntl(, F_SETFL, )
return
}
func ( string, []string, []string) error {
return syscall.Exec(, , )
}
func ( string, []Timeval) error {
if == nil {
return UtimesNanoAt(AT_FDCWD, , nil, AT_SYMLINK_NOFOLLOW)
}
if len() != 2 {
return EINVAL
}
:= []Timespec{
NsecToTimespec(TimevalToNsec([0])),
NsecToTimespec(TimevalToNsec([1])),
}
return UtimesNanoAt(AT_FDCWD, , , AT_SYMLINK_NOFOLLOW)
}
func ( []Iovec) bool {
for := range {
if [].Len > 0 {
return false
}
}
return true
}