-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathsocket.go
95 lines (82 loc) · 3.2 KB
/
socket.go
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package cgolmnl
import "unsafe"
// import "fmt"
/*
#cgo CFLAGS: -I./include
#cgo LDFLAGS: -lmnl
#include <libmnl/libmnl.h>
*/
import "C"
// Netlink socket helpers
type Socket C.struct_mnl_socket // [0]byte
// int mnl_socket_get_fd(const struct mnl_socket *nl)
func socketGetFd(nl *Socket) int {
return int(C.mnl_socket_get_fd((*C.struct_mnl_socket)(nl)))
}
// uint32_t mnl_socket_get_portid(const struct mnl_socket *nl)
func socketGetPortid(nl *Socket) uint32 {
return uint32(C.mnl_socket_get_portid((*C.struct_mnl_socket)(nl)))
}
// struct mnl_socket *mnl_socket_open(int bus)
func socketOpen(bus int) (*Socket, error) {
// return C.mnl_socket_open(C.int(bus))
ret, err := C.mnl_socket_open(C.int(bus))
return (*Socket)(ret), err
}
// int mnl_socket_bind(struct mnl_socket *nl, unsigned int groups, pid_t pid)
func socketBind(nl *Socket, groups uint, pid Pid_t) error {
_, err := C.mnl_socket_bind((*C.struct_mnl_socket)(nl), C.uint(groups), C.pid_t(pid))
return err
}
// ssize_t
// mnl_socket_sendto(const struct mnl_socket *nl, const void *buf, size_t len)
func socketSendto(nl *Socket, buf []byte) (Ssize_t, error) {
ret, err := C.mnl_socket_sendto((*C.struct_mnl_socket)(nl), unsafe.Pointer(&buf[0]), C.size_t(len(buf)))
return Ssize_t(ret), err
}
func socketSendNlmsg(nl *Socket, nlh *Nlmsg) (Ssize_t, error) {
ret, err := C.mnl_socket_sendto((*C.struct_mnl_socket)(nl), unsafe.Pointer(nlh.Nlmsghdr), C.size_t(nlh.Len))
return Ssize_t(ret), err
}
// ssize_t
// mnl_socket_recvfrom(const struct mnl_socket *nl, void *buf, size_t bufsiz)
func socketRecvfrom(nl *Socket, buf []byte) (Ssize_t, error) {
ret, err := C.mnl_socket_recvfrom((*C.struct_mnl_socket)(nl), unsafe.Pointer(&buf[0]), C.size_t(len(buf)))
return Ssize_t(ret), err
}
// int mnl_socket_close(struct mnl_socket *nl)
func socketClose(nl *Socket) error {
_, err := C.mnl_socket_close((*C.struct_mnl_socket)(nl))
return err
}
// int mnl_socket_setsockopt(const struct mnl_socket *nl, int type,
// void *buf, socklen_t len)
func socketSetsockopt(nl *Socket, optype int, optval unsafe.Pointer, optlen Socklen_t) error {
_, err := C.mnl_socket_setsockopt((*C.struct_mnl_socket)(nl), C.int(optype), optval, C.socklen_t(optlen))
return err
}
func socketSetsockoptBytes(nl *Socket, optype int, buf []byte) error {
_, err := C.mnl_socket_setsockopt((*C.struct_mnl_socket)(nl), C.int(optype), unsafe.Pointer(&buf[0]), C.socklen_t(len(buf)))
return err
}
func socketSetsockoptByte(nl *Socket, opt int, value byte) error {
v := C.uint8_t(value)
_, err := C.mnl_socket_setsockopt((*C.struct_mnl_socket)(nl), C.int(opt), unsafe.Pointer(&v), 1)
return err
}
func socketSetsockoptCint(nl *Socket, opt int, value int) error {
v := C.int(value)
_, err := C.mnl_socket_setsockopt((*C.struct_mnl_socket)(nl), C.int(opt), unsafe.Pointer(&v), C.sizeof_int)
return err
}
// int mnl_socket_getsockopt(const struct mnl_socket *nl, int type,
// void *buf, socklen_t *len)
func socketGetsockopt(nl *Socket, optype int, size Socklen_t) ([]byte, error) {
c_size := C.socklen_t(size)
buf := make([]byte, int(size))
_, err := C.mnl_socket_getsockopt((*C.struct_mnl_socket)(nl), C.int(optype), unsafe.Pointer(&buf[0]), &c_size)
if err != nil {
return nil, err
}
return buf, nil
}