Skip to content

Commit 64c25b2

Browse files
beneschianlancetaylor
authored andcommitted
syscall: import upstream code for BSD sockets and sysctls
Import some missing upstream code for BSD sockets and sysctls and adapt it for gccgo. Updates golang/go#38538. Change-Id: I3b08bf01b499b5be55ef79b4633f47ba266d0148 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/261137 Reviewed-by: Ian Lance Taylor <[email protected]> Trust: Benny Siegert <[email protected]>
1 parent b2be945 commit 64c25b2

File tree

3 files changed

+103
-1
lines changed

3 files changed

+103
-1
lines changed

libgo/go/syscall/route_bsd.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ var (
1818

1919
// Round the length of a raw sockaddr up to align it properly.
2020
func rsaAlignOf(salen int) int {
21-
salign := sizeofPtr
21+
salign := int(sizeofPtr)
2222
if darwin64Bit {
2323
// Darwin kernels require 32-bit aligned access to
2424
// routing facilities.

libgo/go/syscall/socket_bsd.go

+41
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import "unsafe"
1313
const SizeofSockaddrInet4 = 16
1414
const SizeofSockaddrInet6 = 28
1515
const SizeofSockaddrUnix = 110
16+
const SizeofSockaddrDatalink = 20
1617

1718
type RawSockaddrInet4 struct {
1819
Len uint8
@@ -76,6 +77,46 @@ func (sa *RawSockaddrUnix) adjustAbstract(sl Socklen_t) Socklen_t {
7677
return sl
7778
}
7879

80+
type SockaddrDatalink struct {
81+
Len uint8
82+
Family uint8
83+
Index uint16
84+
Type uint8
85+
Nlen uint8
86+
Alen uint8
87+
Slen uint8
88+
Data [12]int8
89+
raw RawSockaddrDatalink
90+
}
91+
92+
func (sa *SockaddrDatalink) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
93+
if sa.Index == 0 {
94+
return nil, 0, EINVAL
95+
}
96+
sa.raw.Len = sa.Len
97+
sa.raw.Family = AF_LINK
98+
sa.raw.Index = sa.Index
99+
sa.raw.Type = sa.Type
100+
sa.raw.Nlen = sa.Nlen
101+
sa.raw.Alen = sa.Alen
102+
sa.raw.Slen = sa.Slen
103+
for i := 0; i < len(sa.raw.Data); i++ {
104+
sa.raw.Data[i] = sa.Data[i]
105+
}
106+
return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), SizeofSockaddrDatalink, nil
107+
}
108+
109+
type RawSockaddrDatalink struct {
110+
Len uint8
111+
Family uint8
112+
Index uint16
113+
Type uint8
114+
Nlen uint8
115+
Alen uint8
116+
Slen uint8
117+
Data [12]int8
118+
}
119+
79120
type RawSockaddr struct {
80121
Len uint8
81122
Family uint8

libgo/go/syscall/syscall_netbsd.go

+61
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,64 @@ func direntReclen(buf []byte) (uint64, bool) {
1717
func direntNamlen(buf []byte) (uint64, bool) {
1818
return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
1919
}
20+
21+
func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err error) {
22+
var olen uintptr
23+
24+
// Get a list of all sysctl nodes below the given MIB by performing
25+
// a sysctl for the given MIB with CTL_QUERY appended.
26+
mib = append(mib, CTL_QUERY)
27+
qnode := Sysctlnode{Flags: SYSCTL_VERS_1}
28+
qp := (*byte)(unsafe.Pointer(&qnode))
29+
sz := unsafe.Sizeof(qnode)
30+
if err = sysctl(mib, nil, &olen, qp, sz); err != nil {
31+
return nil, err
32+
}
33+
34+
// Now that we know the size, get the actual nodes.
35+
nodes = make([]Sysctlnode, olen/sz)
36+
np := (*byte)(unsafe.Pointer(&nodes[0]))
37+
if err = sysctl(mib, np, &olen, qp, sz); err != nil {
38+
return nil, err
39+
}
40+
41+
return nodes, nil
42+
}
43+
44+
func nametomib(name string) (mib []_C_int, err error) {
45+
// Split name into components.
46+
var parts []string
47+
last := 0
48+
for i := 0; i < len(name); i++ {
49+
if name[i] == '.' {
50+
parts = append(parts, name[last:i])
51+
last = i + 1
52+
}
53+
}
54+
parts = append(parts, name[last:])
55+
56+
// Discover the nodes and construct the MIB OID.
57+
for partno, part := range parts {
58+
nodes, err := sysctlNodes(mib)
59+
if err != nil {
60+
return nil, err
61+
}
62+
for _, node := range nodes {
63+
n := make([]byte, 0)
64+
for i := range node.Name {
65+
if node.Name[i] != 0 {
66+
n = append(n, byte(node.Name[i]))
67+
}
68+
}
69+
if string(n) == part {
70+
mib = append(mib, _C_int(node.Num))
71+
break
72+
}
73+
}
74+
if len(mib) != partno+1 {
75+
return nil, EINVAL
76+
}
77+
}
78+
79+
return mib, nil
80+
}

0 commit comments

Comments
 (0)