socket_bsd.go 1.98 KB
Newer Older
1 2 3 4 5 6
// socket_bsd.go -- Socket handling specific to *BSD based systems.

// Copyright 2010 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.

7
// +build darwin dragonfly freebsd openbsd netbsd
8

9 10
package syscall

11 12
import "unsafe"

13 14 15
const SizeofSockaddrInet4 = 16
const SizeofSockaddrInet6 = 28
const SizeofSockaddrUnix = 110
16 17

type RawSockaddrInet4 struct {
18 19 20 21 22
	Len    uint8
	Family uint8
	Port   uint16
	Addr   [4]byte /* in_addr */
	Zero   [8]uint8
23 24
}

25 26 27 28 29
func (sa *RawSockaddrInet4) setLen() Socklen_t {
	sa.Len = SizeofSockaddrInet4
	return SizeofSockaddrInet4
}

30
type RawSockaddrInet6 struct {
31 32 33 34 35 36
	Len      uint8
	Family   uint8
	Port     uint16
	Flowinfo uint32
	Addr     [16]byte /* in6_addr */
	Scope_id uint32
37 38
}

39
func (sa *RawSockaddrInet6) setLen() Socklen_t {
40
	sa.Len = SizeofSockaddrInet6
41
	return SizeofSockaddrInet6
42 43
}

44
type RawSockaddrUnix struct {
45 46 47
	Len    uint8
	Family uint8
	Path   [108]int8
48 49
}

50
func (sa *RawSockaddrUnix) setLen(n int) {
51
	sa.Len = uint8(3 + n) // 2 for Family, Len; 1 for NUL.
52 53
}

54
func (sa *RawSockaddrUnix) getLen() (int, error) {
55 56
	if sa.Len < 3 || sa.Len > SizeofSockaddrUnix {
		return 0, EINVAL
57
	}
58
	n := int(sa.Len) - 3 // subtract leading Family, Len, terminating NUL.
59
	for i := 0; i < n; i++ {
60 61 62 63 64
		if sa.Path[i] == 0 {
			// found early NUL; assume Len is overestimating.
			n = i
			break
		}
65
	}
66
	return n, nil
67 68
}

69 70 71 72
func (sa *RawSockaddrUnix) adjustAbstract(sl Socklen_t) Socklen_t {
	return sl
}

73
type RawSockaddr struct {
74 75 76
	Len    uint8
	Family uint8
	Data   [14]int8
77 78 79
}

// BindToDevice binds the socket associated with fd to device.
80
func BindToDevice(fd int, device string) (err error) {
81 82
	return ENOSYS
}
83

84 85
func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, error) {
	return nil, EAFNOSUPPORT
86
}
87 88 89 90 91 92 93

func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) {
	var value IPv6MTUInfo
	vallen := Socklen_t(SizeofIPv6MTUInfo)
	err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
	return &value, err
}