vendor/golang.org/x/sys/unix/syscall_bsd.go
changeset 256 6d9efbef00a9
parent 251 1c52a0eeb952
child 260 445e01aede7e
equal deleted inserted replaced
255:4f153a23adab 256:6d9efbef00a9
     1 // Copyright 2009 The Go Authors. All rights reserved.
     1 // Copyright 2009 The Go Authors. All rights reserved.
     2 // Use of this source code is governed by a BSD-style
     2 // Use of this source code is governed by a BSD-style
     3 // license that can be found in the LICENSE file.
     3 // license that can be found in the LICENSE file.
     4 
     4 
       
     5 //go:build darwin || dragonfly || freebsd || netbsd || openbsd
     5 // +build darwin dragonfly freebsd netbsd openbsd
     6 // +build darwin dragonfly freebsd netbsd openbsd
     6 
     7 
     7 // BSD system call wrappers shared by *BSD based systems
     8 // BSD system call wrappers shared by *BSD based systems
     8 // including OS X (Darwin) and FreeBSD.  Like the other
     9 // including OS X (Darwin) and FreeBSD.  Like the other
     9 // syscall_*.go files it is compiled as Go code but also
    10 // syscall_*.go files it is compiled as Go code but also
    15 import (
    16 import (
    16 	"runtime"
    17 	"runtime"
    17 	"syscall"
    18 	"syscall"
    18 	"unsafe"
    19 	"unsafe"
    19 )
    20 )
       
    21 
       
    22 const ImplementsGetwd = true
       
    23 
       
    24 func Getwd() (string, error) {
       
    25 	var buf [PathMax]byte
       
    26 	_, err := Getcwd(buf[0:])
       
    27 	if err != nil {
       
    28 		return "", err
       
    29 	}
       
    30 	n := clen(buf[:])
       
    31 	if n < 1 {
       
    32 		return "", EINVAL
       
    33 	}
       
    34 	return string(buf[:n]), nil
       
    35 }
    20 
    36 
    21 /*
    37 /*
    22  * Wrapped
    38  * Wrapped
    23  */
    39  */
    24 
    40 
   260 		for i := 0; i < len(sa.Addr); i++ {
   276 		for i := 0; i < len(sa.Addr); i++ {
   261 			sa.Addr[i] = pp.Addr[i]
   277 			sa.Addr[i] = pp.Addr[i]
   262 		}
   278 		}
   263 		return sa, nil
   279 		return sa, nil
   264 	}
   280 	}
   265 	return nil, EAFNOSUPPORT
   281 	return anyToSockaddrGOOS(fd, rsa)
   266 }
   282 }
   267 
   283 
   268 func Accept(fd int) (nfd int, sa Sockaddr, err error) {
   284 func Accept(fd int) (nfd int, sa Sockaddr, err error) {
   269 	var rsa RawSockaddrAny
   285 	var rsa RawSockaddrAny
   270 	var len _Socklen = SizeofSockaddrAny
   286 	var len _Socklen = SizeofSockaddrAny
   271 	nfd, err = accept(fd, &rsa, &len)
   287 	nfd, err = accept(fd, &rsa, &len)
   272 	if err != nil {
   288 	if err != nil {
   273 		return
   289 		return
   274 	}
   290 	}
   275 	if runtime.GOOS == "darwin" && len == 0 {
   291 	if (runtime.GOOS == "darwin" || runtime.GOOS == "ios") && len == 0 {
   276 		// Accepted socket has no address.
   292 		// Accepted socket has no address.
   277 		// This is likely due to a bug in xnu kernels,
   293 		// This is likely due to a bug in xnu kernels,
   278 		// where instead of ECONNABORTED error socket
   294 		// where instead of ECONNABORTED error socket
   279 		// is accepted, but has no address.
   295 		// is accepted, but has no address.
   280 		Close(nfd)
   296 		Close(nfd)
   301 		rsa.Addr.Len = SizeofSockaddrUnix
   317 		rsa.Addr.Len = SizeofSockaddrUnix
   302 	}
   318 	}
   303 	return anyToSockaddr(fd, &rsa)
   319 	return anyToSockaddr(fd, &rsa)
   304 }
   320 }
   305 
   321 
   306 //sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
   322 //sysnb	socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
   307 
   323 
   308 // GetsockoptString returns the string value of the socket option opt for the
   324 // GetsockoptString returns the string value of the socket option opt for the
   309 // socket associated with fd at the given socket level.
   325 // socket associated with fd at the given socket level.
   310 func GetsockoptString(fd, level, opt int) (string, error) {
   326 func GetsockoptString(fd, level, opt int) (string, error) {
   311 	buf := make([]byte, 256)
   327 	buf := make([]byte, 256)
   315 		return "", err
   331 		return "", err
   316 	}
   332 	}
   317 	return string(buf[:vallen-1]), nil
   333 	return string(buf[:vallen-1]), nil
   318 }
   334 }
   319 
   335 
   320 //sys   recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
   336 //sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
   321 //sys   sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
   337 //sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
   322 //sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
   338 //sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
   323 
   339 
   324 func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
   340 func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
   325 	var msg Msghdr
   341 	var msg Msghdr
   326 	var rsa RawSockaddrAny
   342 	var rsa RawSockaddrAny
   525 		return nil, EIO
   541 		return nil, EIO
   526 	}
   542 	}
   527 	return &ci, nil
   543 	return &ci, nil
   528 }
   544 }
   529 
   545 
       
   546 func SysctlTimeval(name string) (*Timeval, error) {
       
   547 	mib, err := sysctlmib(name)
       
   548 	if err != nil {
       
   549 		return nil, err
       
   550 	}
       
   551 
       
   552 	var tv Timeval
       
   553 	n := uintptr(unsafe.Sizeof(tv))
       
   554 	if err := sysctl(mib, (*byte)(unsafe.Pointer(&tv)), &n, nil, 0); err != nil {
       
   555 		return nil, err
       
   556 	}
       
   557 	if n != unsafe.Sizeof(tv) {
       
   558 		return nil, EIO
       
   559 	}
       
   560 	return &tv, nil
       
   561 }
       
   562 
   530 //sys	utimes(path string, timeval *[2]Timeval) (err error)
   563 //sys	utimes(path string, timeval *[2]Timeval) (err error)
   531 
   564 
   532 func Utimes(path string, tv []Timeval) error {
   565 func Utimes(path string, tv []Timeval) error {
   533 	if tv == nil {
   566 	if tv == nil {
   534 		return utimes(path, nil)
   567 		return utimes(path, nil)
   592 		return EINVAL
   625 		return EINVAL
   593 	}
   626 	}
   594 	return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
   627 	return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
   595 }
   628 }
   596 
   629 
   597 //sys   poll(fds *PollFd, nfds int, timeout int) (n int, err error)
   630 //sys	poll(fds *PollFd, nfds int, timeout int) (n int, err error)
   598 
   631 
   599 func Poll(fds []PollFd, timeout int) (n int, err error) {
   632 func Poll(fds []PollFd, timeout int) (n int, err error) {
   600 	if len(fds) == 0 {
   633 	if len(fds) == 0 {
   601 		return poll(nil, 0, timeout)
   634 		return poll(nil, 0, timeout)
   602 	}
   635 	}