package unix
import (
)
func () ( []int, error) {
, := getgroups(0, nil)
if != nil {
return nil,
}
if == 0 {
return nil, nil
}
if < 0 || > 1000 {
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
shift = 8
exited = 0
killed = 9
stopped = 0x7F
)
func ( WaitStatus) () bool { return &mask == exited }
func ( WaitStatus) () int {
if &mask != exited {
return -1
}
return int( >> shift)
}
func ( WaitStatus) () bool { return &mask != stopped && &mask != 0 }
func ( WaitStatus) () syscall.Signal {
:= syscall.Signal( & mask)
if == stopped || == 0 {
return -1
}
return
}
func ( WaitStatus) () bool { return .Signaled() && &core != 0 }
func ( WaitStatus) () bool { return &mask == stopped && syscall.Signal(>>shift) != SIGSTOP }
func ( WaitStatus) () bool { return &mask == killed && syscall.Signal(>>shift) != SIGKILL }
func ( WaitStatus) () bool { return &mask == stopped && syscall.Signal(>>shift) == SIGSTOP }
func ( WaitStatus) () syscall.Signal {
if !.Stopped() {
return -1
}
return syscall.Signal(>>shift) & 0xFF
}
func ( WaitStatus) () int { return -1 }
func ( int, *WaitStatus, int, *Rusage) ( int, error) {
var _C_int
, = wait4(, &, , )
if != nil {
* = WaitStatus()
}
return
}
func ( *SockaddrInet4) () (unsafe.Pointer, _Socklen, error) {
if .Port < 0 || .Port > 0xFFFF {
return nil, 0, EINVAL
}
.raw.Len = SizeofSockaddrInet4
.raw.Family = AF_INET
:= (*[2]byte)(unsafe.Pointer(&.raw.Port))
[0] = byte(.Port >> 8)
[1] = byte(.Port)
for := 0; < len(.Addr); ++ {
.raw.Addr[] = .Addr[]
}
return unsafe.Pointer(&.raw), _Socklen(.raw.Len), nil
}
func ( *SockaddrInet6) () (unsafe.Pointer, _Socklen, error) {
if .Port < 0 || .Port > 0xFFFF {
return nil, 0, EINVAL
}
.raw.Len = SizeofSockaddrInet6
.raw.Family = AF_INET6
:= (*[2]byte)(unsafe.Pointer(&.raw.Port))
[0] = byte(.Port >> 8)
[1] = byte(.Port)
.raw.Scope_id = .ZoneId
for := 0; < len(.Addr); ++ {
.raw.Addr[] = .Addr[]
}
return unsafe.Pointer(&.raw), _Socklen(.raw.Len), nil
}
func ( *SockaddrUnix) () (unsafe.Pointer, _Socklen, error) {
:= .Name
:= len()
if >= len(.raw.Path) || == 0 {
return nil, 0, EINVAL
}
.raw.Len = byte(3 + )
.raw.Family = AF_UNIX
for := 0; < ; ++ {
.raw.Path[] = int8([])
}
return unsafe.Pointer(&.raw), _Socklen(.raw.Len), nil
}
func ( *SockaddrDatalink) () (unsafe.Pointer, _Socklen, error) {
if .Index == 0 {
return nil, 0, EINVAL
}
.raw.Len = .Len
.raw.Family = AF_LINK
.raw.Index = .Index
.raw.Type = .Type
.raw.Nlen = .Nlen
.raw.Alen = .Alen
.raw.Slen = .Slen
for := 0; < len(.raw.Data); ++ {
.raw.Data[] = .Data[]
}
return unsafe.Pointer(&.raw), SizeofSockaddrDatalink, nil
}
func ( int, *RawSockaddrAny) (Sockaddr, error) {
switch .Addr.Family {
case AF_LINK:
:= (*RawSockaddrDatalink)(unsafe.Pointer())
:= new(SockaddrDatalink)
.Len = .Len
.Family = .Family
.Index = .Index
.Type = .Type
.Nlen = .Nlen
.Alen = .Alen
.Slen = .Slen
for := 0; < len(.Data); ++ {
.Data[] = .Data[]
}
return , nil
case AF_UNIX:
:= (*RawSockaddrUnix)(unsafe.Pointer())
if .Len < 2 || .Len > SizeofSockaddrUnix {
return nil, EINVAL
}
:= new(SockaddrUnix)
:= int(.Len) - 2
for := 0; < ; ++ {
if .Path[] == 0 {
=
break
}
}
:= (*[len(.Path)]byte)(unsafe.Pointer(&.Path[0]))[0:]
.Name = string()
return , nil
case AF_INET:
:= (*RawSockaddrInet4)(unsafe.Pointer())
:= new(SockaddrInet4)
:= (*[2]byte)(unsafe.Pointer(&.Port))
.Port = int([0])<<8 + int([1])
for := 0; < len(.Addr); ++ {
.Addr[] = .Addr[]
}
return , nil
case AF_INET6:
:= (*RawSockaddrInet6)(unsafe.Pointer())
:= new(SockaddrInet6)
:= (*[2]byte)(unsafe.Pointer(&.Port))
.Port = int([0])<<8 + int([1])
.ZoneId = .Scope_id
for := 0; < len(.Addr); ++ {
.Addr[] = .Addr[]
}
return , nil
}
return nil, EAFNOSUPPORT
}
func ( int) ( int, Sockaddr, error) {
var RawSockaddrAny
var _Socklen = SizeofSockaddrAny
, = accept(, &, &)
if != nil {
return
}
if runtime.GOOS == "darwin" && == 0 {
Close()
return 0, nil, ECONNABORTED
}
, = anyToSockaddr(, &)
if != nil {
Close()
= 0
}
return
}
func ( int) ( Sockaddr, error) {
var RawSockaddrAny
var _Socklen = SizeofSockaddrAny
if = getsockname(, &, &); != nil {
return
}
if runtime.GOOS == "dragonfly" && .Addr.Family == AF_UNSPEC && .Addr.Len == 0 {
.Addr.Family = AF_UNIX
.Addr.Len = SizeofSockaddrUnix
}
return anyToSockaddr(, &)
}
func (, , int) (string, error) {
:= make([]byte, 256)
:= _Socklen(len())
:= getsockopt(, , , unsafe.Pointer(&[0]), &)
if != nil {
return "",
}
return string([:-1]), nil
}
func ( int, , []byte, int) (, int, int, Sockaddr, error) {
var Msghdr
var RawSockaddrAny
.Name = (*byte)(unsafe.Pointer(&))
.Namelen = uint32(SizeofSockaddrAny)
var Iovec
if len() > 0 {
.Base = (*byte)(unsafe.Pointer(&[0]))
.SetLen(len())
}
var byte
if len() > 0 {
if len() == 0 {
.Base = &
.SetLen(1)
}
.Control = (*byte)(unsafe.Pointer(&[0]))
.SetControllen(len())
}
.Iov = &
.Iovlen = 1
if , = recvmsg(, &, ); != nil {
return
}
= int(.Controllen)
= int(.Flags)
if .Addr.Family != AF_UNSPEC {
, = anyToSockaddr(, &)
}
return
}
func ( int, , []byte, Sockaddr, int) ( error) {
_, = SendmsgN(, , , , )
return
}
func ( int, , []byte, Sockaddr, int) ( int, error) {
var unsafe.Pointer
var _Socklen
if != nil {
, , = .sockaddr()
if != nil {
return 0,
}
}
var Msghdr
.Name = (*byte)(unsafe.Pointer())
.Namelen = uint32()
var Iovec
if len() > 0 {
.Base = (*byte)(unsafe.Pointer(&[0]))
.SetLen(len())
}
var byte
if len() > 0 {
if len() == 0 {
.Base = &
.SetLen(1)
}
.Control = (*byte)(unsafe.Pointer(&[0]))
.SetControllen(len())
}
.Iov = &
.Iovlen = 1
if , = sendmsg(, &, ); != nil {
return 0,
}
if len() > 0 && len() == 0 {
= 0
}
return , nil
}
func ( int, , []Kevent_t, *Timespec) ( int, error) {
var , unsafe.Pointer
if len() > 0 {
= unsafe.Pointer(&[0])
}
if len() > 0 {
= unsafe.Pointer(&[0])
}
return kevent(, , len(), , len(), )
}
func ( string, ...int) ([]_C_int, error) {
, := nametomib()
if != nil {
return nil,
}
for , := range {
= append(, _C_int())
}
return , nil
}
func ( string) (string, error) {
return SysctlArgs()
}
func ( string, ...int) (string, error) {
, := SysctlRaw(, ...)
if != nil {
return "",
}
:= len()
if > 0 && [-1] == '\x00' {
--
}
return string([0:]), nil
}
func ( string) (uint32, error) {
return SysctlUint32Args()
}
func ( string, ...int) (uint32, error) {
, := sysctlmib(, ...)
if != nil {
return 0,
}
:= uintptr(4)
:= make([]byte, 4)
if := sysctl(, &[0], &, nil, 0); != nil {
return 0,
}
if != 4 {
return 0, EIO
}
return *(*uint32)(unsafe.Pointer(&[0])), nil
}
func ( string, ...int) (uint64, error) {
, := sysctlmib(, ...)
if != nil {
return 0,
}
:= uintptr(8)
:= make([]byte, 8)
if := sysctl(, &[0], &, nil, 0); != nil {
return 0,
}
if != 8 {
return 0, EIO
}
return *(*uint64)(unsafe.Pointer(&[0])), nil
}
func ( string, ...int) ([]byte, error) {
, := sysctlmib(, ...)
if != nil {
return nil,
}
:= uintptr(0)
if := sysctl(, nil, &, nil, 0); != nil {
return nil,
}
if == 0 {
return nil, nil
}
:= make([]byte, )
if := sysctl(, &[0], &, nil, 0); != nil {
return nil,
}
return [:], nil
}
func ( string) (*Clockinfo, error) {
, := sysctlmib()
if != nil {
return nil,
}
:= uintptr(SizeofClockinfo)
var Clockinfo
if := sysctl(, (*byte)(unsafe.Pointer(&)), &, nil, 0); != nil {
return nil,
}
if != SizeofClockinfo {
return nil, EIO
}
return &, nil
}
func ( string) (*Timeval, error) {
, := sysctlmib()
if != nil {
return nil,
}
var Timeval
:= uintptr(unsafe.Sizeof())
if := sysctl(, (*byte)(unsafe.Pointer(&)), &, nil, 0); != nil {
return nil,
}
if != unsafe.Sizeof() {
return nil, EIO
}
return &, nil
}
func ( string, []Timeval) error {
if == nil {
return utimes(, nil)
}
if len() != 2 {
return EINVAL
}
return utimes(, (*[2]Timeval)(unsafe.Pointer(&[0])))
}
func ( string, []Timespec) error {
if == nil {
:= utimensat(AT_FDCWD, , nil, 0)
if != ENOSYS {
return
}
return utimes(, nil)
}
if len() != 2 {
return EINVAL
}
:= setattrlistTimes(, , 0)
if != ENOSYS {
return
}
= utimensat(AT_FDCWD, , (*[2]Timespec)(unsafe.Pointer(&[0])), 0)
if != ENOSYS {
return
}
:= [2]Timeval{
NsecToTimeval(TimespecToNsec([0])),
NsecToTimeval(TimespecToNsec([1])),
}
return utimes(, (*[2]Timeval)(unsafe.Pointer(&[0])))
}
func ( int, string, []Timespec, int) error {
if == nil {
return utimensat(, , nil, )
}
if len() != 2 {
return EINVAL
}
:= setattrlistTimes(, , )
if != ENOSYS {
return
}
return utimensat(, , (*[2]Timespec)(unsafe.Pointer(&[0])), )
}
func ( int, []Timeval) error {
if == nil {
return futimes(, nil)
}
if len() != 2 {
return EINVAL
}
return futimes(, (*[2]Timeval)(unsafe.Pointer(&[0])))
}
func ( []PollFd, int) ( int, error) {
if len() == 0 {
return poll(nil, 0, )
}
return poll(&[0], len(), )
}
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()
}