Skip to content

Commit 1022073

Browse files
rscpull[bot]
authored andcommitted
net: use libc (not cgo) for DNS on macOS
Change the macOS implementation to use libc calls. Using libc calls directly is what we do for all the runtime and os syscalls. Doing so here as well improves consistency and also makes it possible to cross-compile (from non-Mac systems) macOS binaries that use the native name resolver. Fixes #12524. Change-Id: I011f4fcc5c50fbb5396e494889765dcbb9342336 Reviewed-on: https://go-review.googlesource.com/c/go/+/446178 Run-TryBot: Russ Cox <rsc@golang.org> Reviewed-by: Ian Lance Taylor <iant@google.com>
1 parent efff8f9 commit 1022073

11 files changed

+467
-70
lines changed

src/internal/syscall/unix/asm_darwin.s

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,15 @@
66

77
TEXT ·libc_getentropy_trampoline(SB),NOSPLIT,$0-0
88
JMP libc_getentropy(SB)
9+
10+
TEXT ·libc_getaddrinfo_trampoline(SB),NOSPLIT,$0-0
11+
JMP libc_getaddrinfo(SB)
12+
13+
TEXT ·libc_freeaddrinfo_trampoline(SB),NOSPLIT,$0-0
14+
JMP libc_freeaddrinfo(SB)
15+
16+
TEXT ·libc_getnameinfo_trampoline(SB),NOSPLIT,$0-0
17+
JMP libc_getnameinfo(SB)
18+
19+
TEXT ·libc_gai_strerror_trampoline(SB),NOSPLIT,$0-0
20+
JMP libc_gai_strerror(SB)

src/internal/syscall/unix/getentropy_darwin.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ package unix
88

99
import (
1010
"internal/abi"
11-
"syscall"
1211
"unsafe"
1312
)
1413

@@ -27,6 +26,3 @@ func GetEntropy(p []byte) error {
2726
}
2827
return nil
2928
}
30-
31-
//go:linkname syscall_syscall syscall.syscall
32-
func syscall_syscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
// Copyright 2022 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package unix
6+
7+
import (
8+
"internal/abi"
9+
"syscall"
10+
"unsafe"
11+
)
12+
13+
const (
14+
AI_CANONNAME = 0x2
15+
AI_ALL = 0x100
16+
AI_V4MAPPED = 0x800
17+
AI_MASK = 0x1407
18+
19+
EAI_AGAIN = 2
20+
EAI_NONAME = 8
21+
EAI_SYSTEM = 11
22+
EAI_OVERFLOW = 14
23+
24+
NI_NAMEREQD = 4
25+
)
26+
27+
type Addrinfo struct {
28+
Flags int32
29+
Family int32
30+
Socktype int32
31+
Protocol int32
32+
Addrlen uint32
33+
Canonname *byte
34+
Addr *syscall.RawSockaddr
35+
Next *Addrinfo
36+
}
37+
38+
//go:cgo_import_dynamic libc_getaddrinfo getaddrinfo "/usr/lib/libSystem.B.dylib"
39+
func libc_getaddrinfo_trampoline()
40+
41+
func Getaddrinfo(hostname, servname *byte, hints *Addrinfo, res **Addrinfo) (int, error) {
42+
gerrno, _, errno := syscall_syscall6(abi.FuncPCABI0(libc_getaddrinfo_trampoline),
43+
uintptr(unsafe.Pointer(hostname)),
44+
uintptr(unsafe.Pointer(servname)),
45+
uintptr(unsafe.Pointer(hints)),
46+
uintptr(unsafe.Pointer(res)),
47+
0,
48+
0)
49+
var err error
50+
if errno != 0 {
51+
err = errno
52+
}
53+
return int(gerrno), err
54+
}
55+
56+
//go:cgo_import_dynamic libc_freeaddrinfo freeaddrinfo "/usr/lib/libSystem.B.dylib"
57+
func libc_freeaddrinfo_trampoline()
58+
59+
func Freeaddrinfo(ai *Addrinfo) {
60+
syscall_syscall6(abi.FuncPCABI0(libc_freeaddrinfo_trampoline),
61+
uintptr(unsafe.Pointer(ai)),
62+
0, 0, 0, 0, 0)
63+
}
64+
65+
//go:cgo_import_dynamic libc_getnameinfo getnameinfo "/usr/lib/libSystem.B.dylib"
66+
func libc_getnameinfo_trampoline()
67+
68+
func Getnameinfo(sa *syscall.RawSockaddr, salen int, host *byte, hostlen int, serv *byte, servlen int, flags int) (int, error) {
69+
gerrno, _, errno := syscall_syscall9(abi.FuncPCABI0(libc_getnameinfo_trampoline),
70+
uintptr(unsafe.Pointer(sa)),
71+
uintptr(salen),
72+
uintptr(unsafe.Pointer(host)),
73+
uintptr(hostlen),
74+
uintptr(unsafe.Pointer(serv)),
75+
uintptr(servlen),
76+
uintptr(flags),
77+
0,
78+
0)
79+
var err error
80+
if errno != 0 {
81+
err = errno
82+
}
83+
return int(gerrno), err
84+
}
85+
86+
//go:cgo_import_dynamic libc_gai_strerror gai_strerror "/usr/lib/libSystem.B.dylib"
87+
func libc_gai_strerror_trampoline()
88+
89+
func GaiStrerror(ecode int) string {
90+
r1, _, _ := syscall_syscall(abi.FuncPCABI0(libc_gai_strerror_trampoline),
91+
uintptr(ecode),
92+
0, 0)
93+
return GoString((*byte)(unsafe.Pointer(r1)))
94+
}
95+
96+
func GoString(p *byte) string {
97+
if p == nil {
98+
return ""
99+
}
100+
x := unsafe.Slice(p, 1e9)
101+
for i, c := range x {
102+
if c == 0 {
103+
return string(x[:i])
104+
}
105+
}
106+
return ""
107+
}
108+
109+
//go:linkname syscall_syscall syscall.syscall
110+
func syscall_syscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)
111+
112+
//go:linkname syscall_syscall6 syscall.syscall6
113+
func syscall_syscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
114+
115+
//go:linkname syscall_syscall9 syscall.syscall9
116+
func syscall_syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)

src/net/cgo_resnew.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Use of this source code is governed by a BSD-style
33
// license that can be found in the LICENSE file.
44

5-
//go:build cgo && !netgo && (darwin || (linux && !android) || netbsd || solaris)
5+
//go:build cgo && !netgo && ((linux && !android) || netbsd || solaris)
66

77
package net
88

src/net/cgo_sockold.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Use of this source code is governed by a BSD-style
33
// license that can be found in the LICENSE file.
44

5-
//go:build cgo && !netgo && (aix || darwin || dragonfly || freebsd || netbsd || openbsd)
5+
//go:build cgo && !netgo && (aix || dragonfly || freebsd || netbsd || openbsd)
66

77
package net
88

0 commit comments

Comments
 (0)