blob: cced74e60d588c149314fa4f032b14c0ed39bcc4 [file] [log] [blame]
David K. Bainbridge215e0242017-09-05 23:18:24 -07001// Copyright 2017 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
5package socket
6
7import (
8 "errors"
9 "runtime"
10 "syscall"
11 "unsafe"
12)
13
14func probeProtocolStack() int {
15 switch runtime.GOARCH {
16 case "amd64":
17 return 4
18 default:
19 var p uintptr
20 return int(unsafe.Sizeof(p))
21 }
22}
23
24//go:cgo_import_dynamic libc___xnet_getsockopt __xnet_getsockopt "libsocket.so"
25//go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so"
26//go:cgo_import_dynamic libc___xnet_recvmsg __xnet_recvmsg "libsocket.so"
27//go:cgo_import_dynamic libc___xnet_sendmsg __xnet_sendmsg "libsocket.so"
28
29//go:linkname procGetsockopt libc___xnet_getsockopt
30//go:linkname procSetsockopt libc_setsockopt
31//go:linkname procRecvmsg libc___xnet_recvmsg
32//go:linkname procSendmsg libc___xnet_sendmsg
33
34var (
35 procGetsockopt uintptr
36 procSetsockopt uintptr
37 procRecvmsg uintptr
38 procSendmsg uintptr
39)
40
41func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno)
42func rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno)
43
44func getsockopt(s uintptr, level, name int, b []byte) (int, error) {
45 l := uint32(len(b))
46 _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procGetsockopt)), 5, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0)
47 return int(l), errnoErr(errno)
48}
49
50func setsockopt(s uintptr, level, name int, b []byte) error {
51 _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procSetsockopt)), 5, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0)
52 return errnoErr(errno)
53}
54
55func recvmsg(s uintptr, h *msghdr, flags int) (int, error) {
56 n, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procRecvmsg)), 3, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0)
57 return int(n), errnoErr(errno)
58}
59
60func sendmsg(s uintptr, h *msghdr, flags int) (int, error) {
61 n, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procSendmsg)), 3, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0)
62 return int(n), errnoErr(errno)
63}
64
65func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
66 return 0, errors.New("not implemented")
67}
68
69func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
70 return 0, errors.New("not implemented")
71}