1 // socket_bsd.go -- Socket handling specific to *BSD based systems.
3 // Copyright 2010 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
7 // +build aix darwin dragonfly freebsd openbsd netbsd
13 const SizeofSockaddrInet4
= 16
14 const SizeofSockaddrInet6
= 28
15 const SizeofSockaddrUnix
= 110
17 type RawSockaddrInet4
struct {
21 Addr
[4]byte /* in_addr */
25 func (sa
*RawSockaddrInet4
) setLen() Socklen_t
{
26 sa
.Len
= SizeofSockaddrInet4
27 return SizeofSockaddrInet4
30 type RawSockaddrInet6
struct {
35 Addr
[16]byte /* in6_addr */
39 func (sa
*RawSockaddrInet6
) setLen() Socklen_t
{
40 sa
.Len
= SizeofSockaddrInet6
41 return SizeofSockaddrInet6
44 type RawSockaddrUnix
struct {
50 func (sa
*RawSockaddrUnix
) setLen(n
int) {
51 sa
.Len
= uint8(3 + n
) // 2 for Family, Len; 1 for NUL.
54 func (sa
*RawSockaddrUnix
) getLen() (int, error
) {
55 if sa
.Len
< 3 || sa
.Len
> SizeofSockaddrUnix
{
58 n
:= int(sa
.Len
) - 3 // subtract leading Family, Len, terminating NUL.
59 for i
:= 0; i
< n
; i
++ {
61 // found early NUL; assume Len is overestimating.
69 func (sa
*RawSockaddrUnix
) adjustAbstract(sl Socklen_t
) Socklen_t
{
73 type RawSockaddr
struct {
79 // BindToDevice binds the socket associated with fd to device.
80 func BindToDevice(fd
int, device
string) (err error
) {
84 func anyToSockaddrOS(rsa
*RawSockaddrAny
) (Sockaddr
, error
) {
85 return nil, EAFNOSUPPORT
88 func GetsockoptIPv6MTUInfo(fd
, level
, opt
int) (*IPv6MTUInfo
, error
) {
90 vallen
:= Socklen_t(SizeofIPv6MTUInfo
)
91 err
:= getsockopt(fd
, level
, opt
, unsafe
.Pointer(&value
), &vallen
)