Copyright 2009 The Go Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+build darwin dragonfly freebsd netbsd openbsd
BSD system call wrappers shared by *BSD based systems including OS X (Darwin) and FreeBSD. Like the other syscall_*.go files it is compiled as Go code but also used as input to mksyscall which parses the //sys lines and generates system call stubs.

package unix

import (
	
	
	
)

const ImplementsGetwd = true

func () (string, error) {
	var  [PathMax]byte
	,  := Getcwd([0:])
	if  != nil {
		return "", 
	}
	 := clen([:])
	if  < 1 {
		return "", EINVAL
	}
	return string([:]), nil
}
* Wrapped
sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error)sysnb setgroups(ngid int, gid *_Gid_t) (err error)

func () ( []int,  error) {
	,  := getgroups(0, nil)
	if  != nil {
		return nil, 
	}
	if  == 0 {
		return nil, nil
	}
Sanity check group count. Max is 16 on BSD.
	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])
}
Wait status is 7 bits at bottom, either 0 (exited), 0x7F (stopped), or a signal number that caused an exit. The 0x80 bit is whether there was a core dump. An extra number (exit code, signal causing a stop) is in the high bits.

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 }
sys wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error)

func ( int,  *WaitStatus,  int,  *Rusage) ( int,  error) {
	var  _C_int
	,  = wait4(, &, , )
	if  != nil {
		* = WaitStatus()
	}
	return
}
sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)sysnb socket(domain int, typ int, proto int) (fd int, err error)sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)sys Shutdown(s int, how int) (err error)

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 + ) // 2 for Family, Len; 1 for NUL
	.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)
Some BSDs include the trailing NUL in the length, whereas others do not. Work around this by subtracting the leading family and len. The path is then scanned to see if a NUL terminator still exists within the length.
		 := int(.Len) - 2 // subtract leading Family, Len
		for  := 0;  < ; ++ {
found early NUL; assume Len included the NUL or was overestimating.
				 = 
				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 anyToSockaddrGOOS(, )
}

func ( int) ( int,  Sockaddr,  error) {
	var  RawSockaddrAny
	var  _Socklen = SizeofSockaddrAny
	,  = accept(, &, &)
	if  != nil {
		return
	}
Accepted socket has no address. This is likely due to a bug in xnu kernels, where instead of ECONNABORTED error socket is accepted, but has no address.
		Close()
		return 0, nil, ECONNABORTED
	}
	,  = anyToSockaddr(, &)
	if  != nil {
		Close()
		 = 0
	}
	return
}

func ( int) ( Sockaddr,  error) {
	var  RawSockaddrAny
	var  _Socklen = SizeofSockaddrAny
	if  = getsockname(, &, &);  != nil {
		return
TODO(jsing): DragonFly has a "bug" (see issue 3349), which should be reported upstream.
	if runtime.GOOS == "dragonfly" && .Addr.Family == AF_UNSPEC && .Addr.Len == 0 {
		.Addr.Family = AF_UNIX
		.Addr.Len = SizeofSockaddrUnix
	}
	return anyToSockaddr(, &)
}
sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
GetsockoptString returns the string value of the socket option opt for the socket associated with fd at the given socket level.
func (, ,  int) (string, error) {
	 := make([]byte, 256)
	 := _Socklen(len())
	 := getsockopt(, , , unsafe.Pointer(&[0]), &)
	if  != nil {
		return "", 
	}
	return string([:-1]), nil
}
sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error)

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
receive at least one normal byte
		if len() == 0 {
			.Base = &
			.SetLen(1)
		}
		.Control = (*byte)(unsafe.Pointer(&[0]))
		.SetControllen(len())
	}
	.Iov = &
	.Iovlen = 1
	if ,  = recvmsg(, &, );  != nil {
		return
	}
	 = int(.Controllen)
source address is only specified if the socket is unconnected
	if .Addr.Family != AF_UNSPEC {
		,  = anyToSockaddr(, &)
	}
	return
}
sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error)

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
send at least one normal byte
		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
}
sys kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error)

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(), )
}
sysctlmib translates name to mib number and appends any additional args.
Translate name to mib number.
	,  := 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()
Throw away terminating NUL.
	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, 
	}
Find size.
	 := uintptr(0)
	if  := sysctl(, nil, &, nil, 0);  != nil {
		return nil, 
	}
	if  == 0 {
		return nil, nil
	}
Read into buffer of that size.
	 := make([]byte, )
	if  := sysctl(, &[0], &, nil, 0);  != nil {
		return nil, 
	}
The actual call may return less than the original reported required size so ensure we deal with that.
	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
}
sys utimes(path string, timeval *[2]Timeval) (err error)

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
Darwin setattrlist can set nanosecond timestamps
	 := setattrlistTimes(, , 0)
	if  != ENOSYS {
		return 
	}
	 = utimensat(AT_FDCWD, , (*[2]Timespec)(unsafe.Pointer(&[0])), 0)
	if  != ENOSYS {
		return 
Not as efficient as it could be because Timespec and Timeval have different types in the different OSes
	 := [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])), )
}
sys futimes(fd int, timeval *[2]Timeval) (err error)

func ( int,  []Timeval) error {
	if  == nil {
		return futimes(, nil)
	}
	if len() != 2 {
		return EINVAL
	}
	return futimes(, (*[2]Timeval)(unsafe.Pointer(&[0])))
}
sys poll(fds *PollFd, nfds int, timeout int) (n int, err error)

func ( []PollFd,  int) ( int,  error) {
	if len() == 0 {
		return poll(nil, 0, )
	}
	return poll(&[0], len(), )
}
TODO: wrap Acct(name nil-string) (err error) Gethostuuid(uuid *byte, timeout *Timespec) (err error) Ptrace(req int, pid int, addr uintptr, data int) (ret uintptr, err error)

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()
}
sys Madvise(b []byte, behav int) (err error)sys Mlock(b []byte) (err error)sys Mlockall(flags int) (err error)sys Mprotect(b []byte, prot int) (err error)sys Msync(b []byte, flags int) (err error)sys Munlock(b []byte) (err error)