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