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 |
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 } |