package unix
import (
)
func ( string, uint32) ( error) {
return Faccessat(AT_FDCWD, , , 0)
}
func ( string, uint32) ( error) {
return Fchmodat(AT_FDCWD, , , 0)
}
func ( string, int, int) ( error) {
return Fchownat(AT_FDCWD, , , , 0)
}
func ( string, uint32) ( int, error) {
return Open(, O_CREAT|O_WRONLY|O_TRUNC, )
}
func ( int) ( int, error) {
if <= 0 {
return -1, EINVAL
}
return EpollCreate1(0)
}
func ( int, uint, uint64, int, string) ( error) {
if == "" {
return fanotifyMark(, , , , nil)
}
, := BytePtrFromString()
if != nil {
return
}
return fanotifyMark(, , , , )
}
func ( int, string, uint32, int) ( error) {
if &^AT_SYMLINK_NOFOLLOW != 0 {
return EINVAL
} else if &AT_SYMLINK_NOFOLLOW != 0 {
return EOPNOTSUPP
}
return fchmodat(, , )
}
func () ( int, error) {
return InotifyInit1(0)
}
func ( string, string) ( error) {
return Linkat(AT_FDCWD, , AT_FDCWD, , 0)
}
func ( string, uint32) ( error) {
return Mkdirat(AT_FDCWD, , )
}
func ( string, uint32, int) ( error) {
return Mknodat(AT_FDCWD, , , )
}
func ( string, int, uint32) ( int, error) {
return openat(AT_FDCWD, , |O_LARGEFILE, )
}
func ( int, string, int, uint32) ( int, error) {
return openat(, , |O_LARGEFILE, )
}
func ( int, string, *OpenHow) ( int, error) {
return openat2(, , , SizeofOpenHow)
}
func ( []int) error {
return Pipe2(, 0)
}
func ( []int, int) error {
if len() != 2 {
return EINVAL
}
var [2]_C_int
:= pipe2(&, )
if == nil {
[0] = int([0])
[1] = int([1])
}
return
}
func ( []PollFd, *Timespec, *Sigset_t) ( int, error) {
if len() == 0 {
return ppoll(nil, 0, , )
}
return ppoll(&[0], len(), , )
}
func ( []PollFd, int) ( int, error) {
var *Timespec
if >= 0 {
= new(Timespec)
* = NsecToTimespec(int64() * 1e6)
}
return Ppoll(, , nil)
}
func ( string, []byte) ( int, error) {
return Readlinkat(AT_FDCWD, , )
}
func ( string, string) ( error) {
return Renameat(AT_FDCWD, , AT_FDCWD, )
}
func ( string) error {
return Unlinkat(AT_FDCWD, , AT_REMOVEDIR)
}
func ( string, string) ( error) {
return Symlinkat(, AT_FDCWD, )
}
func ( string) error {
return Unlinkat(AT_FDCWD, , 0)
}
func ( string, []Timeval) error {
if == nil {
:= utimensat(AT_FDCWD, , nil, 0)
if != ENOSYS {
return
}
return utimes(, nil)
}
if len() != 2 {
return EINVAL
}
var [2]Timespec
[0] = NsecToTimespec(TimevalToNsec([0]))
[1] = NsecToTimespec(TimevalToNsec([1]))
:= utimensat(AT_FDCWD, , (*[2]Timespec)(unsafe.Pointer(&[0])), 0)
if != ENOSYS {
return
}
return utimes(, (*[2]Timeval)(unsafe.Pointer(&[0])))
}
func ( string, []Timespec) error {
return UtimesNanoAt(AT_FDCWD, , , 0)
}
func ( int, string, []Timespec, int) error {
if == nil {
return utimensat(, , nil, )
}
if len() != 2 {
return EINVAL
}
return utimensat(, , (*[2]Timespec)(unsafe.Pointer(&[0])), )
}
func ( int, string, []Timeval) error {
if == nil {
return futimesat(, , nil)
}
if len() != 2 {
return EINVAL
}
return futimesat(, , (*[2]Timeval)(unsafe.Pointer(&[0])))
}
func ( int, []Timeval) ( error) {
return Utimes("/proc/self/fd/"+strconv.Itoa(), )
}
const ImplementsGetwd = true
func () ( string, error) {
var [PathMax]byte
, := Getcwd([0:])
if != nil {
return "",
}
if < 1 || > len() || [-1] != 0 {
return "", EINVAL
}
if [0] != '/' {
return "", ENOENT
}
return string([0 : -1]), nil
}
func () ( []int, error) {
, := getgroups(0, nil)
if != nil {
return nil,
}
if == 0 {
return nil, nil
}
if < 0 || > 1<<20 {
return nil, EINVAL
}
:= make([]_Gid_t, )
, = getgroups(, &[0])
if != nil {
return nil,
}
= make([]int, )
for , := range [0:] {
[] = int()
}
return
}
func ( []int) ( error) {
if len() == 0 {
return setgroups(0, nil)
}
:= make([]_Gid_t, len())
for , := range {
[] = _Gid_t()
}
return setgroups(len(), &[0])
}
type WaitStatus uint32
const (
mask = 0x7F
core = 0x80
exited = 0x00
stopped = 0x7F
shift = 8
)
func ( WaitStatus) () bool { return &mask == exited }
func ( WaitStatus) () bool { return &mask != stopped && &mask != exited }
func ( WaitStatus) () bool { return &0xFF == stopped }
func ( WaitStatus) () bool { return == 0xFFFF }
func ( WaitStatus) () bool { return .Signaled() && &core != 0 }
func ( WaitStatus) () int {
if !.Exited() {
return -1
}
return int(>>shift) & 0xFF
}
func ( WaitStatus) () syscall.Signal {
if !.Signaled() {
return -1
}
return syscall.Signal( & mask)
}
func ( WaitStatus) () syscall.Signal {
if !.Stopped() {
return -1
}
return syscall.Signal(>>shift) & 0xFF
}
func ( WaitStatus) () int {
if .StopSignal() != SIGTRAP {
return -1
}
return int(>>shift) >> 8
}
func ( int, *WaitStatus, int, *Rusage) ( int, error) {
var _C_int
, = wait4(, &, , )
if != nil {
* = WaitStatus()
}
return
}
func ( string, uint32) error {
return Mknod(, |S_IFIFO, 0)
}
func ( int, string, uint32) error {
return Mknodat(, , |S_IFIFO, 0)
}
func ( *SockaddrInet4) () (unsafe.Pointer, _Socklen, error) {
if .Port < 0 || .Port > 0xFFFF {
return nil, 0, EINVAL
}
.raw.Family = AF_INET
:= (*[2]byte)(unsafe.Pointer(&.raw.Port))
[0] = byte(.Port >> 8)
[1] = byte(.Port)
.raw.Addr = .Addr
return unsafe.Pointer(&.raw), SizeofSockaddrInet4, nil
}
func ( *SockaddrInet6) () (unsafe.Pointer, _Socklen, error) {
if .Port < 0 || .Port > 0xFFFF {
return nil, 0, EINVAL
}
.raw.Family = AF_INET6
:= (*[2]byte)(unsafe.Pointer(&.raw.Port))
[0] = byte(.Port >> 8)
[1] = byte(.Port)
.raw.Scope_id = .ZoneId
.raw.Addr = .Addr
return unsafe.Pointer(&.raw), SizeofSockaddrInet6, nil
}
func ( *SockaddrUnix) () (unsafe.Pointer, _Socklen, error) {
:= .Name
:= len()
if >= len(.raw.Path) {
return nil, 0, EINVAL
}
.raw.Family = AF_UNIX
for := 0; < ; ++ {
.raw.Path[] = int8([])
}
:= _Socklen(2)
if > 0 {
+= _Socklen() + 1
}
if .raw.Path[0] == '@' {
.raw.Path[0] = 0
--
}
return unsafe.Pointer(&.raw), , nil
}
type SockaddrLinklayer struct {
Protocol uint16
Ifindex int
Hatype uint16
Pkttype uint8
Halen uint8
Addr [8]byte
raw RawSockaddrLinklayer
}
func ( *SockaddrLinklayer) () (unsafe.Pointer, _Socklen, error) {
if .Ifindex < 0 || .Ifindex > 0x7fffffff {
return nil, 0, EINVAL
}
.raw.Family = AF_PACKET
.raw.Protocol = .Protocol
.raw.Ifindex = int32(.Ifindex)
.raw.Hatype = .Hatype
.raw.Pkttype = .Pkttype
.raw.Halen = .Halen
.raw.Addr = .Addr
return unsafe.Pointer(&.raw), SizeofSockaddrLinklayer, nil
}
type SockaddrNetlink struct {
Family uint16
Pad uint16
Pid uint32
Groups uint32
raw RawSockaddrNetlink
}
func ( *SockaddrNetlink) () (unsafe.Pointer, _Socklen, error) {
.raw.Family = AF_NETLINK
.raw.Pad = .Pad
.raw.Pid = .Pid
.raw.Groups = .Groups
return unsafe.Pointer(&.raw), SizeofSockaddrNetlink, nil
}
type SockaddrHCI struct {
Dev uint16
Channel uint16
raw RawSockaddrHCI
}
func ( *SockaddrHCI) () (unsafe.Pointer, _Socklen, error) {
.raw.Family = AF_BLUETOOTH
.raw.Dev = .Dev
.raw.Channel = .Channel
return unsafe.Pointer(&.raw), SizeofSockaddrHCI, nil
}
type SockaddrL2 struct {
PSM uint16
CID uint16
Addr [6]uint8
AddrType uint8
raw RawSockaddrL2
}
func ( *SockaddrL2) () (unsafe.Pointer, _Socklen, error) {
.raw.Family = AF_BLUETOOTH
:= (*[2]byte)(unsafe.Pointer(&.raw.Psm))
[0] = byte(.PSM)
[1] = byte(.PSM >> 8)
for := 0; < len(.Addr); ++ {
.raw.Bdaddr[] = .Addr[len(.Addr)-1-]
}
:= (*[2]byte)(unsafe.Pointer(&.raw.Cid))
[0] = byte(.CID)
[1] = byte(.CID >> 8)
.raw.Bdaddr_type = .AddrType
return unsafe.Pointer(&.raw), SizeofSockaddrL2, nil
}
type SockaddrRFCOMM struct {
Addr [6]uint8
Channel uint8
raw RawSockaddrRFCOMM
}
func ( *SockaddrRFCOMM) () (unsafe.Pointer, _Socklen, error) {
.raw.Family = AF_BLUETOOTH
.raw.Channel = .Channel
.raw.Bdaddr = .Addr
return unsafe.Pointer(&.raw), SizeofSockaddrRFCOMM, nil
}
type SockaddrCAN struct {
Ifindex int
RxID uint32
TxID uint32
raw RawSockaddrCAN
}
func ( *SockaddrCAN) () (unsafe.Pointer, _Socklen, error) {
if .Ifindex < 0 || .Ifindex > 0x7fffffff {
return nil, 0, EINVAL
}
.raw.Family = AF_CAN
.raw.Ifindex = int32(.Ifindex)
:= (*[4]byte)(unsafe.Pointer(&.RxID))
for := 0; < 4; ++ {
.raw.Addr[] = []
}
:= (*[4]byte)(unsafe.Pointer(&.TxID))
for := 0; < 4; ++ {
.raw.Addr[+4] = []
}
return unsafe.Pointer(&.raw), SizeofSockaddrCAN, nil
}
type SockaddrCANJ1939 struct {
Ifindex int
Name uint64
PGN uint32
Addr uint8
raw RawSockaddrCAN
}
func ( *SockaddrCANJ1939) () (unsafe.Pointer, _Socklen, error) {
if .Ifindex < 0 || .Ifindex > 0x7fffffff {
return nil, 0, EINVAL
}
.raw.Family = AF_CAN
.raw.Ifindex = int32(.Ifindex)
:= (*[8]byte)(unsafe.Pointer(&.Name))
for := 0; < 8; ++ {
.raw.Addr[] = []
}
:= (*[4]byte)(unsafe.Pointer(&.PGN))
for := 0; < 4; ++ {
.raw.Addr[+8] = []
}
.raw.Addr[12] = .Addr
return unsafe.Pointer(&.raw), SizeofSockaddrCAN, nil
}
type SockaddrALG struct {
Type string
Name string
Feature uint32
Mask uint32
raw RawSockaddrALG
}
func ( *SockaddrALG) () (unsafe.Pointer, _Socklen, error) {
if len(.Type) > 13 {
return nil, 0, EINVAL
}
if len(.Name) > 63 {
return nil, 0, EINVAL
}
.raw.Family = AF_ALG
.raw.Feat = .Feature
.raw.Mask = .Mask
, := ByteSliceFromString(.Type)
if != nil {
return nil, 0,
}
, := ByteSliceFromString(.Name)
if != nil {
return nil, 0,
}
copy(.raw.Type[:], )
copy(.raw.Name[:], )
return unsafe.Pointer(&.raw), SizeofSockaddrALG, nil
}
type SockaddrVM struct {
CID uint32
Port uint32
Flags uint8
raw RawSockaddrVM
}
func ( *SockaddrVM) () (unsafe.Pointer, _Socklen, error) {
.raw.Family = AF_VSOCK
.raw.Port = .Port
.raw.Cid = .CID
.raw.Flags = .Flags
return unsafe.Pointer(&.raw), SizeofSockaddrVM, nil
}
type SockaddrXDP struct {
Flags uint16
Ifindex uint32
QueueID uint32
SharedUmemFD uint32
raw RawSockaddrXDP
}
func ( *SockaddrXDP) () (unsafe.Pointer, _Socklen, error) {
.raw.Family = AF_XDP
.raw.Flags = .Flags
.raw.Ifindex = .Ifindex
.raw.Queue_id = .QueueID
.raw.Shared_umem_fd = .SharedUmemFD
return unsafe.Pointer(&.raw), SizeofSockaddrXDP, nil
}
const px_proto_oe = 0
type SockaddrPPPoE struct {
SID uint16
Remote []byte
Dev string
raw RawSockaddrPPPoX
}
func ( *SockaddrPPPoE) () (unsafe.Pointer, _Socklen, error) {
if len(.Remote) != 6 {
return nil, 0, EINVAL
}
if len(.Dev) > IFNAMSIZ-1 {
return nil, 0, EINVAL
}
*(*uint16)(unsafe.Pointer(&.raw[0])) = AF_PPPOX
binary.BigEndian.PutUint32(.raw[2:6], px_proto_oe)
binary.BigEndian.PutUint16(.raw[6:8], .SID)
copy(.raw[8:14], .Remote)
for := 14; < 14+IFNAMSIZ; ++ {
.raw[] = 0
}
copy(.raw[14:], .Dev)
return unsafe.Pointer(&.raw), SizeofSockaddrPPPoX, nil
}
type SockaddrTIPC struct {
Scope int
Addr TIPCAddr
raw RawSockaddrTIPC
}
type TIPCAddr interface {
tipcAddrtype() uint8
tipcAddr() [12]byte
}
func ( *TIPCSocketAddr) () [12]byte {
var [12]byte
copy([:], (*(*[unsafe.Sizeof(TIPCSocketAddr{})]byte)(unsafe.Pointer()))[:])
return
}
func ( *TIPCSocketAddr) () uint8 { return TIPC_SOCKET_ADDR }
func ( *TIPCServiceRange) () [12]byte {
var [12]byte
copy([:], (*(*[unsafe.Sizeof(TIPCServiceRange{})]byte)(unsafe.Pointer()))[:])
return
}
func ( *TIPCServiceRange) () uint8 { return TIPC_SERVICE_RANGE }
func ( *TIPCServiceName) () [12]byte {
var [12]byte
copy([:], (*(*[unsafe.Sizeof(TIPCServiceName{})]byte)(unsafe.Pointer()))[:])
return
}
func ( *TIPCServiceName) () uint8 { return TIPC_SERVICE_ADDR }
func ( *SockaddrTIPC) () (unsafe.Pointer, _Socklen, error) {
if .Addr == nil {
return nil, 0, EINVAL
}
.raw.Family = AF_TIPC
.raw.Scope = int8(.Scope)
.raw.Addrtype = .Addr.tipcAddrtype()
.raw.Addr = .Addr.tipcAddr()
return unsafe.Pointer(&.raw), SizeofSockaddrTIPC, nil
}
type SockaddrL2TPIP struct {
Addr [4]byte
ConnId uint32
raw RawSockaddrL2TPIP
}
func ( *SockaddrL2TPIP) () (unsafe.Pointer, _Socklen, error) {
.raw.Family = AF_INET
.raw.Conn_id = .ConnId
.raw.Addr = .Addr
return unsafe.Pointer(&.raw), SizeofSockaddrL2TPIP, nil
}
type SockaddrL2TPIP6 struct {
Addr [16]byte
ZoneId uint32
ConnId uint32
raw RawSockaddrL2TPIP6
}
func ( *SockaddrL2TPIP6) () (unsafe.Pointer, _Socklen, error) {
.raw.Family = AF_INET6
.raw.Conn_id = .ConnId
.raw.Scope_id = .ZoneId
.raw.Addr = .Addr
return unsafe.Pointer(&.raw), SizeofSockaddrL2TPIP6, nil
}
type SockaddrIUCV struct {
UserID string
Name string
raw RawSockaddrIUCV
}
func ( *SockaddrIUCV) () (unsafe.Pointer, _Socklen, error) {
.raw.Family = AF_IUCV
for := 0; < 8; ++ {
.raw.Nodeid[] = ' '
.raw.User_id[] = ' '
.raw.Name[] = ' '
}
if len(.UserID) > 8 || len(.Name) > 8 {
return nil, 0, EINVAL
}
for , := range []byte(.UserID[:]) {
.raw.User_id[] = int8()
}
for , := range []byte(.Name[:]) {
.raw.Name[] = int8()
}
return unsafe.Pointer(&.raw), SizeofSockaddrIUCV, nil
}
type SockaddrNFC struct {
DeviceIdx uint32
TargetIdx uint32
NFCProtocol uint32
raw RawSockaddrNFC
}
func ( *SockaddrNFC) () (unsafe.Pointer, _Socklen, error) {
.raw.Sa_family = AF_NFC
.raw.Dev_idx = .DeviceIdx
.raw.Target_idx = .TargetIdx
.raw.Nfc_protocol = .NFCProtocol
return unsafe.Pointer(&.raw), SizeofSockaddrNFC, nil
}
type SockaddrNFCLLCP struct {
DeviceIdx uint32
TargetIdx uint32
NFCProtocol uint32
DestinationSAP uint8
SourceSAP uint8
ServiceName string
raw RawSockaddrNFCLLCP
}
func ( *SockaddrNFCLLCP) () (unsafe.Pointer, _Socklen, error) {
.raw.Sa_family = AF_NFC
.raw.Dev_idx = .DeviceIdx
.raw.Target_idx = .TargetIdx
.raw.Nfc_protocol = .NFCProtocol
.raw.Dsap = .DestinationSAP
.raw.Ssap = .SourceSAP
if len(.ServiceName) > len(.raw.Service_name) {
return nil, 0, EINVAL
}
copy(.raw.Service_name[:], .ServiceName)
.raw.SetServiceNameLen(len(.ServiceName))
return unsafe.Pointer(&.raw), SizeofSockaddrNFCLLCP, nil
}
var socketProtocol = func( int) (int, error) {
return GetsockoptInt(, SOL_SOCKET, SO_PROTOCOL)
}
func ( int, *RawSockaddrAny) (Sockaddr, error) {
switch .Addr.Family {
case AF_NETLINK:
:= (*RawSockaddrNetlink)(unsafe.Pointer())
:= new(SockaddrNetlink)
.Family = .Family
.Pad = .Pad
.Pid = .Pid
.Groups = .Groups
return , nil
case AF_PACKET:
:= (*RawSockaddrLinklayer)(unsafe.Pointer())
:= new(SockaddrLinklayer)
.Protocol = .Protocol
.Ifindex = int(.Ifindex)
.Hatype = .Hatype
.Pkttype = .Pkttype
.Halen = .Halen
.Addr = .Addr
return , nil
case AF_UNIX:
:= (*RawSockaddrUnix)(unsafe.Pointer())
:= new(SockaddrUnix)
if .Path[0] == 0 {
.Path[0] = '@'
}
:= 0
for < len(.Path) && .Path[] != 0 {
++
}
:= (*[len(.Path)]byte)(unsafe.Pointer(&.Path[0]))[0:]
.Name = string()
return , nil
case AF_INET:
, := socketProtocol()
if != nil {
return nil,
}
switch {
case IPPROTO_L2TP:
:= (*RawSockaddrL2TPIP)(unsafe.Pointer())
:= new(SockaddrL2TPIP)
.ConnId = .Conn_id
.Addr = .Addr
return , nil
default:
:= (*RawSockaddrInet4)(unsafe.Pointer())
:= new(SockaddrInet4)
:= (*[2]byte)(unsafe.Pointer(&.Port))
.Port = int([0])<<8 + int([1])
.Addr = .Addr
return , nil
}
case AF_INET6:
, := socketProtocol()
if != nil {
return nil,
}
switch {
case IPPROTO_L2TP:
:= (*RawSockaddrL2TPIP6)(unsafe.Pointer())
:= new(SockaddrL2TPIP6)
.ConnId = .Conn_id
.ZoneId = .Scope_id
.Addr = .Addr
return , nil
default:
:= (*RawSockaddrInet6)(unsafe.Pointer())
:= new(SockaddrInet6)
:= (*[2]byte)(unsafe.Pointer(&.Port))
.Port = int([0])<<8 + int([1])
.ZoneId = .Scope_id
.Addr = .Addr
return , nil
}
case AF_VSOCK:
:= (*RawSockaddrVM)(unsafe.Pointer())
:= &SockaddrVM{
CID: .Cid,
Port: .Port,
Flags: .Flags,
}
return , nil
case AF_BLUETOOTH:
, := socketProtocol()
if != nil {
return nil,
}
switch {
case BTPROTO_L2CAP:
:= (*RawSockaddrL2)(unsafe.Pointer())
:= &SockaddrL2{
PSM: .Psm,
CID: .Cid,
Addr: .Bdaddr,
AddrType: .Bdaddr_type,
}
return , nil
case BTPROTO_RFCOMM:
:= (*RawSockaddrRFCOMM)(unsafe.Pointer())
:= &SockaddrRFCOMM{
Channel: .Channel,
Addr: .Bdaddr,
}
return , nil
}
case AF_XDP:
:= (*RawSockaddrXDP)(unsafe.Pointer())
:= &SockaddrXDP{
Flags: .Flags,
Ifindex: .Ifindex,
QueueID: .Queue_id,
SharedUmemFD: .Shared_umem_fd,
}
return , nil
case AF_PPPOX:
:= (*RawSockaddrPPPoX)(unsafe.Pointer())
if binary.BigEndian.Uint32([2:6]) != px_proto_oe {
return nil, EINVAL
}
:= &SockaddrPPPoE{
SID: binary.BigEndian.Uint16([6:8]),
Remote: [8:14],
}
for := 14; < 14+IFNAMSIZ; ++ {
if [] == 0 {
.Dev = string([14:])
break
}
}
return , nil
case AF_TIPC:
:= (*RawSockaddrTIPC)(unsafe.Pointer())
:= &SockaddrTIPC{
Scope: int(.Scope),
}
switch .Addrtype {
case TIPC_SERVICE_RANGE:
.Addr = (*TIPCServiceRange)(unsafe.Pointer(&.Addr))
case TIPC_SERVICE_ADDR:
.Addr = (*TIPCServiceName)(unsafe.Pointer(&.Addr))
case TIPC_SOCKET_ADDR:
.Addr = (*TIPCSocketAddr)(unsafe.Pointer(&.Addr))
default:
return nil, EINVAL
}
return , nil
case AF_IUCV:
:= (*RawSockaddrIUCV)(unsafe.Pointer())
var [8]byte
var [8]byte
for := 0; < 8; ++ {
[] = byte(.User_id[])
[] = byte(.Name[])
}
:= &SockaddrIUCV{
UserID: string([:]),
Name: string([:]),
}
return , nil
case AF_CAN:
, := socketProtocol()
if != nil {
return nil,
}
:= (*RawSockaddrCAN)(unsafe.Pointer())
switch {
case CAN_J1939:
:= &SockaddrCANJ1939{
Ifindex: int(.Ifindex),
}
:= (*[8]byte)(unsafe.Pointer(&.Name))
for := 0; < 8; ++ {
[] = .Addr[]
}
:= (*[4]byte)(unsafe.Pointer(&.PGN))
for := 0; < 4; ++ {
[] = .Addr[+8]
}
:= (*[1]byte)(unsafe.Pointer(&.Addr))
[0] = .Addr[12]
return , nil
default:
:= &SockaddrCAN{
Ifindex: int(.Ifindex),
}
:= (*[4]byte)(unsafe.Pointer(&.RxID))
for := 0; < 4; ++ {
[] = .Addr[]
}
:= (*[4]byte)(unsafe.Pointer(&.TxID))
for := 0; < 4; ++ {
[] = .Addr[+4]
}
return , nil
}
case AF_NFC:
, := socketProtocol()
if != nil {
return nil,
}
switch {
case NFC_SOCKPROTO_RAW:
:= (*RawSockaddrNFC)(unsafe.Pointer())
:= &SockaddrNFC{
DeviceIdx: .Dev_idx,
TargetIdx: .Target_idx,
NFCProtocol: .Nfc_protocol,
}
return , nil
case NFC_SOCKPROTO_LLCP:
:= (*RawSockaddrNFCLLCP)(unsafe.Pointer())
if uint64(.Service_name_len) > uint64(len(.Service_name)) {
return nil, EINVAL
}
:= &SockaddrNFCLLCP{
DeviceIdx: .Dev_idx,
TargetIdx: .Target_idx,
NFCProtocol: .Nfc_protocol,
DestinationSAP: .Dsap,
SourceSAP: .Ssap,
ServiceName: string(.Service_name[:.Service_name_len]),
}
return , nil
default:
return nil, EINVAL
}
}
return nil, EAFNOSUPPORT
}
func ( int) ( int, Sockaddr, error) {
var RawSockaddrAny
var _Socklen = SizeofSockaddrAny
, = accept4(, &, &, 0)
if != nil {
return
}
, = anyToSockaddr(, &)
if != nil {
Close()
= 0
}
return
}
func ( int, int) ( int, Sockaddr, error) {
var RawSockaddrAny
var _Socklen = SizeofSockaddrAny
, = accept4(, &, &, )
if != nil {
return
}
if > SizeofSockaddrAny {
panic("RawSockaddrAny too small")
}
, = anyToSockaddr(, &)
if != nil {
Close()
= 0
}
return
}
func ( int) ( Sockaddr, error) {
var RawSockaddrAny
var _Socklen = SizeofSockaddrAny
if = getsockname(, &, &); != nil {
return
}
return anyToSockaddr(, &)
}
func (, , int) (*IPMreqn, error) {
var IPMreqn
:= _Socklen(SizeofIPMreqn)
:= getsockopt(, , , unsafe.Pointer(&), &)
return &,
}
func (, , int) (*Ucred, error) {
var Ucred
:= _Socklen(SizeofUcred)
:= getsockopt(, , , unsafe.Pointer(&), &)
return &,
}
func (, , int) (*TCPInfo, error) {
var TCPInfo
:= _Socklen(SizeofTCPInfo)
:= getsockopt(, , , unsafe.Pointer(&), &)
return &,
}
func (, , int) (string, error) {
:= make([]byte, 256)
:= _Socklen(len())
:= getsockopt(, , , unsafe.Pointer(&[0]), &)
if != nil {
if == ERANGE {
= make([]byte, )
= getsockopt(, , , unsafe.Pointer(&[0]), &)
}
if != nil {
return "",
}
}
return string([:-1]), nil
}
func (, , int) (*TpacketStats, error) {
var TpacketStats
:= _Socklen(SizeofTpacketStats)
:= getsockopt(, , , unsafe.Pointer(&), &)
return &,
}
func (, , int) (*TpacketStatsV3, error) {
var TpacketStatsV3
:= _Socklen(SizeofTpacketStatsV3)
:= getsockopt(, , , unsafe.Pointer(&), &)
return &,
}
func (, , int, *IPMreqn) ( error) {
return setsockopt(, , , unsafe.Pointer(), unsafe.Sizeof(*))
}
func (, , int, *PacketMreq) error {
return setsockopt(, , , unsafe.Pointer(), unsafe.Sizeof(*))
}
func (, , int, *SockFprog) error {
return setsockopt(, , , unsafe.Pointer(), unsafe.Sizeof(*))
}
func (, , int, []CanFilter) error {
var unsafe.Pointer
if len() > 0 {
= unsafe.Pointer(&[0])
}
return setsockopt(, , , , uintptr(len()*SizeofCanFilter))
}
func (, , int, *TpacketReq) error {
return setsockopt(, , , unsafe.Pointer(), unsafe.Sizeof(*))
}
func (, , int, *TpacketReq3) error {
return setsockopt(, , , unsafe.Pointer(), unsafe.Sizeof(*))
}
func (, , int, []TCPRepairOpt) ( error) {
if len() == 0 {
return EINVAL
}
return setsockopt(, , , unsafe.Pointer(&[0]), uintptr(SizeofTCPRepairOpt*len()))
}
func ( int, int) (string, error) {
var []byte
for {
, := KeyctlBuffer(, , , 0)
if != nil {
return "",
}
if <= len() {
return string([:-1]), nil
}
= make([]byte, )
}
}
func ( int, bool) ( int, error) {
:= 0
if {
= 1
}
return KeyctlInt(KEYCTL_GET_KEYRING_ID, , , 0, 0)
}
func ( int, uint32) error {
, := KeyctlInt(KEYCTL_SETPERM, , int(), 0, 0)
return
}
func ( string) ( int, error) {
return keyctlJoin(KEYCTL_JOIN_SESSION_KEYRING, )
}
func ( int, , string, int) ( int, error) {
return keyctlSearch(KEYCTL_SEARCH, , , , )
}
func ( int, []Iovec, int) error {
return keyctlIOV(KEYCTL_INSTANTIATE_IOV, , , )
}
func ( *KeyctlDHParams, []byte) ( int, error) {
return keyctlDH(KEYCTL_DH_COMPUTE, , )
}
func ( int, string, string) error {
if == "" {
return keyctlRestrictKeyring(KEYCTL_RESTRICT_KEYRING, )
}
return keyctlRestrictKeyringByType(KEYCTL_RESTRICT_KEYRING, , , )
}
func ( int, []Iovec, []byte, int, *RawSockaddrAny) (, int, int, error) {
var Msghdr
.Name = (*byte)(unsafe.Pointer())
.Namelen = uint32(SizeofSockaddrAny)
var byte
if len() > 0 {
if emptyIovecs() {
var int
, = GetsockoptInt(, SOL_SOCKET, SO_TYPE)
if != nil {
return
}
if != SOCK_DGRAM {
var [1]Iovec
[0].Base = &
[0].SetLen(1)
= [:]
}
}
.Control = &[0]
.SetControllen(len())
}
if len() > 0 {
.Iov = &[0]
.SetIovlen(len())
}
if , = recvmsg(, &, ); != nil {
return
}
= int(.Controllen)
= int(.Flags)
return
}
func ( int, []Iovec, []byte, unsafe.Pointer, _Socklen, int) ( int, error) {
var Msghdr
.Name = (*byte)()
.Namelen = uint32()
var byte
var bool
if len() > 0 {
= emptyIovecs()
if {
var int
, = GetsockoptInt(, SOL_SOCKET, SO_TYPE)
if != nil {
return 0,
}
if != SOCK_DGRAM {
var [1]Iovec
[0].Base = &
[0].SetLen(1)
= [:]
}
}
.Control = &[0]
.SetControllen(len())
}
if len() > 0 {
.Iov = &[0]
.SetIovlen(len())
}
if , = sendmsg(, &, ); != nil {
return 0,
}
if len() > 0 && {
= 0
}
return , nil
}
func ( int, string) ( error) {
return SetsockoptString(, SOL_SOCKET, SO_BINDTODEVICE, )
}
func ( int, int, uintptr, []byte) ( int, error) {
var [SizeofPtr]byte
:= 0
if %SizeofPtr != 0 {
= ptrace(, , -%SizeofPtr, uintptr(unsafe.Pointer(&[0])))
if != nil {
return 0,
}
+= copy(, [%SizeofPtr:])
= [:]
}
for len() > 0 {
= ptrace(, , +uintptr(), uintptr(unsafe.Pointer(&[0])))
if != nil {
return ,
}
:= copy(, [0:])
+=
= [:]
}
return , nil
}
func ( int, uintptr, []byte) ( int, error) {
return ptracePeek(PTRACE_PEEKTEXT, , , )
}
func ( int, uintptr, []byte) ( int, error) {
return ptracePeek(PTRACE_PEEKDATA, , , )
}
func ( int, uintptr, []byte) ( int, error) {
return ptracePeek(PTRACE_PEEKUSR, , , )
}
func ( int, int, int, uintptr, []byte) ( int, error) {
:= 0
if %SizeofPtr != 0 {
var [SizeofPtr]byte
= ptrace(, , -%SizeofPtr, uintptr(unsafe.Pointer(&[0])))
if != nil {
return 0,
}
+= copy([%SizeofPtr:], )
:= *((*uintptr)(unsafe.Pointer(&[0])))
= ptrace(, , -%SizeofPtr, )
if != nil {
return 0,
}
= [:]
}
for len() > SizeofPtr {
:= *((*uintptr)(unsafe.Pointer(&[0])))
= ptrace(, , +uintptr(), )
if != nil {
return ,
}
+= SizeofPtr
= [SizeofPtr:]
}
if len() > 0 {
var [SizeofPtr]byte
= ptrace(, , +uintptr(), uintptr(unsafe.Pointer(&[0])))
if != nil {
return ,
}
copy([0:], )
:= *((*uintptr)(unsafe.Pointer(&[0])))
= ptrace(, , +uintptr(), )
if != nil {
return ,
}
+= len()
}
return , nil
}
func ( int, uintptr, []byte) ( int, error) {
return ptracePoke(PTRACE_POKETEXT, PTRACE_PEEKTEXT, , , )
}
func ( int, uintptr, []byte) ( int, error) {
return ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, , , )
}
func ( int, uintptr, []byte) ( int, error) {
return ptracePoke(PTRACE_POKEUSR, PTRACE_PEEKUSR, , , )
}
func ( int, *PtraceRegs) ( error) {
return ptrace(PTRACE_GETREGS, , 0, uintptr(unsafe.Pointer()))
}
func ( int, *PtraceRegs) ( error) {
return ptrace(PTRACE_SETREGS, , 0, uintptr(unsafe.Pointer()))
}
func ( int, int) ( error) {
return ptrace(PTRACE_SETOPTIONS, , 0, uintptr())
}
func ( int) ( uint, error) {
var _C_long
= ptrace(PTRACE_GETEVENTMSG, , 0, uintptr(unsafe.Pointer(&)))
= uint()
return
}
func ( int, int) ( error) {
return ptrace(PTRACE_CONT, , 0, uintptr())
}
func ( int, int) ( error) {
return ptrace(PTRACE_SYSCALL, , 0, uintptr())
}
func ( int) ( error) { return ptrace(PTRACE_SINGLESTEP, , 0, 0) }
func ( int) ( error) { return ptrace(PTRACE_INTERRUPT, , 0, 0) }
func ( int) ( error) { return ptrace(PTRACE_ATTACH, , 0, 0) }
func ( int) ( error) { return ptrace(PTRACE_SEIZE, , 0, 0) }
func ( int) ( error) { return ptrace(PTRACE_DETACH, , 0, 0) }
func ( int) ( error) {
return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, , "")
}
func ( []byte) (uint64, bool) {
return readInt(, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
}
func ( []byte) (uint64, bool) {
return readInt(, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
}
func ( []byte) (uint64, bool) {
, := direntReclen()
if ! {
return 0, false
}
return - uint64(unsafe.Offsetof(Dirent{}.Name)), true
}
func ( string, string, string, uintptr, string) ( error) {
if == "" {
return mount(, , , , nil)
}
, := BytePtrFromString()
if != nil {
return
}
return mount(, , , , )
}
func ( int, string, uint, *MountAttr) error {
return mountSetattr(, , , , unsafe.Sizeof(*))
}
func ( int, int, *int64, int) ( int, error) {
if raceenabled {
raceReleaseMerge(unsafe.Pointer(&ioSync))
}
return sendfile(, , , )
}
func (, int) error {
return Dup3(, , 0)
}
func () ( int) {
, _ = Getpgid(0)
return
}
func ( int, uintptr, uintptr, uintptr, uintptr) (int, error) {
, , := Syscall6(SYS_PRCTL, uintptr(), uintptr(), uintptr(), uintptr(), uintptr(), 0)
if != 0 {
return 0,
}
return int(), nil
}
func ( int) ( error) {
return syscall.Setuid()
}
func ( int) ( error) {
return syscall.Setgid()
}
func (, int) ( error) {
return syscall.Setreuid(, )
}
func (, int) ( error) {
return syscall.Setregid(, )
}
func (, , int) ( error) {
return syscall.Setresuid(, , )
}
func (, , int) ( error) {
return syscall.Setresgid(, , )
}
func ( int) (int, error) {
return setfsgid()
}
func ( int) (int, error) {
return setfsuid()
}
func ( int) error {
, := setfsgid()
return
}
func ( int) error {
, := setfsuid()
return
}
func ( int, *Sigset_t, int) ( int, error) {
return signalfd(, , _C__NSIG/8, )
}
const minIovec = 8
func ( []Iovec, [][]byte) []Iovec {
for , := range {
var Iovec
.SetLen(len())
if len() > 0 {
.Base = &[0]
} else {
.Base = (*byte)(unsafe.Pointer(&_zero))
}
= append(, )
}
return
}
func ( int64) (, uintptr) {
const = SizeofLong * 8
return uintptr(), uintptr(uint64() >> ( - 1) >> 1)
}
func ( int, [][]byte) ( int, error) {
:= make([]Iovec, 0, minIovec)
= appendBytes(, )
, = readv(, )
readvRacedetect(, , )
return ,
}
func ( int, [][]byte, int64) ( int, error) {
:= make([]Iovec, 0, minIovec)
= appendBytes(, )
, := offs2lohi()
, = preadv(, , , )
readvRacedetect(, , )
return ,
}
func ( int, [][]byte, int64, int) ( int, error) {
:= make([]Iovec, 0, minIovec)
= appendBytes(, )
, := offs2lohi()
, = preadv2(, , , , )
readvRacedetect(, , )
return ,
}
func ( []Iovec, int, error) {
if !raceenabled {
return
}
for := 0; > 0 && < len(); ++ {
:= int([].Len)
if > {
=
}
-=
if > 0 {
raceWriteRange(unsafe.Pointer([].Base), )
}
}
if == nil {
raceAcquire(unsafe.Pointer(&ioSync))
}
}
func ( int, [][]byte) ( int, error) {
:= make([]Iovec, 0, minIovec)
= appendBytes(, )
if raceenabled {
raceReleaseMerge(unsafe.Pointer(&ioSync))
}
, = writev(, )
writevRacedetect(, )
return ,
}
func ( int, [][]byte, int64) ( int, error) {
:= make([]Iovec, 0, minIovec)
= appendBytes(, )
if raceenabled {
raceReleaseMerge(unsafe.Pointer(&ioSync))
}
, := offs2lohi()
, = pwritev(, , , )
writevRacedetect(, )
return ,
}
func ( int, [][]byte, int64, int) ( int, error) {
:= make([]Iovec, 0, minIovec)
= appendBytes(, )
if raceenabled {
raceReleaseMerge(unsafe.Pointer(&ioSync))
}
, := offs2lohi()
, = pwritev2(, , , , )
writevRacedetect(, )
return ,
}
func ( []Iovec, int) {
if !raceenabled {
return
}
for := 0; > 0 && < len(); ++ {
:= int([].Len)
if > {
=
}
-=
if > 0 {
raceReadRange(unsafe.Pointer([].Base), )
}
}
}
var mapper = &mmapper{
active: make(map[*byte][]byte),
mmap: mmap,
munmap: munmap,
}
func ( int, int64, int, int, int) ( []byte, error) {
return mapper.Mmap(, , , , )
}
func ( []byte) ( error) {
return mapper.Munmap()
}
func ( int, []Iovec, int) (int, error) {
var unsafe.Pointer
if len() > 0 {
= unsafe.Pointer(&[0])
}
, , := Syscall6(SYS_VMSPLICE, uintptr(), uintptr(), uintptr(len()), uintptr(), 0, 0)
if != 0 {
return 0, syscall.Errno()
}
return int(), nil
}
func ( int) bool {
, := Getgroups()
if != nil {
return false
}
for , := range {
if == {
return true
}
}
return false
}
func ( int, string, uint32, int) ( error) {
if == 0 {
return faccessat(, , )
}
if := Faccessat2(, , , ); != ENOSYS && != EPERM {
return
}
if & ^(AT_SYMLINK_NOFOLLOW|AT_EACCESS) != 0 {
return EINVAL
}
var Stat_t
if := Fstatat(, , &, &AT_SYMLINK_NOFOLLOW); != nil {
return
}
&= 7
if == 0 {
return nil
}
var int
if &AT_EACCESS != 0 {
= Geteuid()
} else {
= Getuid()
}
if == 0 {
if &1 == 0 {
return nil
}
if .Mode&0111 != 0 {
return nil
}
return EACCES
}
var uint32
if uint32() == .Uid {
= (.Mode >> 6) & 7
} else {
var int
if &AT_EACCESS != 0 {
= Getegid()
} else {
= Getgid()
}
if uint32() == .Gid || isGroupMember(int(.Gid)) {
= (.Mode >> 3) & 7
} else {
= .Mode & 7
}
}
if & == {
return nil
}
return EACCES
}
type fileHandle struct {
Bytes uint32
Type int32
}
type FileHandle struct {
*fileHandle
}
func ( int32, []byte) FileHandle {
const = unsafe.Sizeof(fileHandle{})
:= make([]byte, +uintptr(len()))
copy([:], )
:= (*fileHandle)(unsafe.Pointer(&[0]))
.Type =
.Bytes = uint32(len())
return FileHandle{}
}
func ( *FileHandle) () int { return int(.fileHandle.Bytes) }
func ( *FileHandle) () int32 { return .fileHandle.Type }
func ( *FileHandle) () []byte {
:= .Size()
if == 0 {
return nil
}
return unsafe.Slice((*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(&.fileHandle.Type))+4)), )
}
func ( int, string, int) ( FileHandle, int, error) {
var _C_int
:= uint32(32 + unsafe.Sizeof(fileHandle{}))
:= false
for {
:= make([]byte, )
:= (*fileHandle)(unsafe.Pointer(&[0]))
.Bytes = - uint32(unsafe.Sizeof(fileHandle{}))
= nameToHandleAt(, , , &, )
if == EOVERFLOW {
if {
return
}
= true
= .Bytes + uint32(unsafe.Sizeof(fileHandle{}))
continue
}
if != nil {
return
}
return FileHandle{}, int(), nil
}
}
func ( int, FileHandle, int) ( int, error) {
return openByHandleAt(, .fileHandle, )
}
func ( int, int) ( error) {
var unsafe.Pointer
, , := Syscall(SYS_SYSLOG, uintptr(), uintptr(), uintptr())
if != 0 {
return errnoErr()
}
return nil
}
type RemoteIovec struct {
Base uintptr
Len int
}
func (, time.Duration) Itimerval {
return Itimerval{
Interval: NsecToTimeval(.Nanoseconds()),
Value: NsecToTimeval(.Nanoseconds()),
}
}
type ItimerWhich int
const (
ItimerReal ItimerWhich = ITIMER_REAL
ItimerVirtual ItimerWhich = ITIMER_VIRTUAL
ItimerProf ItimerWhich = ITIMER_PROF
)
func ( ItimerWhich) (Itimerval, error) {
var Itimerval
if := getitimer(int(), &); != nil {
return Itimerval{},
}
return , nil
}
func ( ItimerWhich, Itimerval) (Itimerval, error) {
var Itimerval
if := setitimer(int(), &, &); != nil {
return Itimerval{},
}
return , nil
}
func ( int, , *Sigset_t) error {
if != nil {
* = Sigset_t{}
}
return rtSigprocmask(, , , _C__NSIG/8)
}