connection: Use Guile's 'socket' procedure to open a socket. This gives us a real port, which can then let us benefit from the suspendable port facilities. * netlink/connection.scm (ffi-socket, ffi-close): Remove. (socket): Remove record type. (open-socket): Use Guile's 'socket' procedure. (close-socket): Make a deprecated alias for 'close-port'. (get-addr): Add docstring. (connect, send-msg, receive-msg): Use 'fileno' instead of 'socket-num'. * ip/addr.scm (addr-del, addr-add, get-addrs): Use 'close-port' instead of 'close-socket'. * ip/link.scm (get-links, link-set, link-add, link-del): Likewise. * ip/route.scm (route-del, route-add, get-routes): Likewise. * doc/guile-netlink.texi (Netlink Connections): Remove 'close-socket'. Signed-off-by: Julien Lepiller <julien@lepiller.eu>
doc/guile-netlink.texi
256 | 256 | optional @var{groups} keyword, you can select broadcast groups to subscribe to. | |
257 | 257 | @end deffn | |
258 | 258 | ||
259 | - | @deffn {Scheme Procedure} close-socket @var{socket} | |
260 | - | Closes a netlink socket. The socket cannot be used afterwards. | |
261 | - | @end deffn | |
262 | - | ||
263 | 259 | @deffn {Scheme Procedure} send-msg @var{msg} @var{sock} [#:@var{addr}] | |
264 | 260 | Send @var{msg} (it must be of type message, @xref{Netlink Headers}) to | |
265 | 261 | @var{addr} using @var{sock}. If not passed, @var{addr} is the address of |
ip/addr.scm
100 | 100 | (let ((sock (connect-route))) | |
101 | 101 | (send-msg message sock) | |
102 | 102 | (let ((answer (receive-and-decode-msg sock %default-route-decoder))) | |
103 | - | (close-socket sock) | |
103 | + | (close-port sock) | |
104 | 104 | (answer-ok? (last answer))))) | |
105 | 105 | ||
106 | 106 | (define* (addr-add device cidr #:key (ipv6? #f) (peer (cidr->addr cidr)) | |
… | |||
180 | 180 | (let ((sock (connect-route))) | |
181 | 181 | (send-msg message sock) | |
182 | 182 | (let ((answer (receive-and-decode-msg sock %default-route-decoder))) | |
183 | - | (close-socket sock) | |
183 | + | (close-port sock) | |
184 | 184 | (answer-ok? (last answer))))) | |
185 | 185 | ||
186 | 186 | (define (get-addrs) | |
… | |||
216 | 216 | (get-attr attrs IFA_BROADCAST) | |
217 | 217 | (get-attr attrs IFA_CACHEINFO)))) | |
218 | 218 | addrs))) | |
219 | - | (close-socket sock) | |
219 | + | (close-port sock) | |
220 | 220 | addrs))) | |
221 | 221 | ||
222 | 222 | (define print-addr |
ip/link.scm
94 | 94 | (get-attr attrs IFLA_ADDRESS) | |
95 | 95 | (get-attr attrs IFLA_BROADCAST)))) | |
96 | 96 | links))) | |
97 | - | (close-socket sock) | |
97 | + | (close-port sock) | |
98 | 98 | links))) | |
99 | 99 | ||
100 | 100 | (define print-link | |
… | |||
246 | 246 | (let ((answer (receive-and-decode-msg sock %default-route-decoder))) | |
247 | 247 | (when netnsfd | |
248 | 248 | (close netnsfd)) | |
249 | - | (close-socket sock) | |
249 | + | (close-port sock) | |
250 | 250 | (answer-ok? (last answer))))) | |
251 | 251 | ||
252 | 252 | (define* (bond-type-args #:key (mode #f) (miimon #f) (lacp-active #f) (lacp-rate #f) | |
… | |||
364 | 364 | (let ((sock (connect-route))) | |
365 | 365 | (send-msg message sock) | |
366 | 366 | (let ((answer (receive-and-decode-msg sock %default-route-decoder))) | |
367 | - | (close-socket sock) | |
367 | + | (close-port sock) | |
368 | 368 | (answer-ok? (last answer))))) | |
369 | 369 | ||
370 | 370 | (define* (link-del device) | |
… | |||
390 | 390 | (let ((sock (connect-route))) | |
391 | 391 | (send-msg message sock) | |
392 | 392 | (let ((answer (receive-and-decode-msg sock %default-route-decoder))) | |
393 | - | (close-socket sock) | |
393 | + | (close-port sock) | |
394 | 394 | (answer-ok? (last answer))))) |
ip/route.scm
106 | 106 | (let ((sock (connect-route))) | |
107 | 107 | (send-msg message sock) | |
108 | 108 | (let ((answer (receive-and-decode-msg sock %default-route-decoder))) | |
109 | - | (close-socket sock) | |
109 | + | (close-port sock) | |
110 | 110 | (answer-ok? (last answer))))) | |
111 | 111 | ||
112 | 112 | (define* (route-add dest | |
… | |||
170 | 170 | (let ((sock (connect-route))) | |
171 | 171 | (send-msg message sock) | |
172 | 172 | (let ((answer (receive-and-decode-msg sock %default-route-decoder))) | |
173 | - | (close-socket sock) | |
173 | + | (close-port sock) | |
174 | 174 | (answer-ok? (last answer))))) | |
175 | 175 | ||
176 | 176 | (define (link-ref links id) | |
… | |||
221 | 221 | (get-attr attrs RTA_PRIORITY) | |
222 | 222 | (link-ref links (get-attr attrs RTA_OIF))))) | |
223 | 223 | routes))) | |
224 | - | (close-socket sock) | |
224 | + | (close-port sock) | |
225 | 225 | routes))) | |
226 | 226 | ||
227 | 227 | (define print-route |
netlink/connection.scm
22 | 22 | #:use-module (netlink message) | |
23 | 23 | #:use-module (rnrs bytevectors) | |
24 | 24 | #:use-module (system foreign) | |
25 | - | #:use-module (srfi srfi-9) | |
26 | 25 | #:use-module (srfi srfi-34) | |
27 | 26 | #:use-module (srfi srfi-35) | |
28 | 27 | #:export (connect | |
… | |||
34 | 33 | get-addr)) | |
35 | 34 | ||
36 | 35 | (define libc (dynamic-link)) | |
37 | - | (define ffi-socket (pointer->procedure int | |
38 | - | (dynamic-func "socket" libc) | |
39 | - | (list int int int))) | |
40 | - | (define ffi-close (pointer->procedure void | |
41 | - | (dynamic-func "close" libc) | |
42 | - | (list int))) | |
36 | + | ||
43 | 37 | (define ffi-sendto (pointer->procedure int | |
44 | 38 | (dynamic-func "sendto" libc) | |
45 | 39 | (list int '* size_t int '* int) | |
… | |||
51 | 45 | (dynamic-func "bind" libc) | |
52 | 46 | (list int '* int))) | |
53 | 47 | ||
54 | - | ;; define socket type | |
55 | - | (define-record-type socket | |
56 | - | (make-socket num open?) | |
57 | - | socket? | |
58 | - | (num socket-num) | |
59 | - | (open? socket-open?)) | |
60 | - | ||
61 | 48 | ;; define simple functions to open/close sockets | |
62 | 49 | (define (open-socket proto) | |
63 | - | (make-socket (ffi-socket AF_NETLINK (logior SOCK_RAW SOCK_CLOEXEC) proto) #t)) | |
64 | - | (define (close-socket socket) | |
65 | - | (if (socket-open? socket) | |
66 | - | (ffi-close (socket-num socket))) | |
67 | - | (make-socket (socket-num socket) #f)) | |
50 | + | (socket AF_NETLINK (logior SOCK_RAW SOCK_CLOEXEC) proto)) | |
51 | + | ||
52 | + | (define (close-socket sock) | |
53 | + | (issue-deprecation-warning | |
54 | + | "'close-socket' is deprecated; use 'close-port' instead.") | |
55 | + | (close-port sock)) | |
68 | 56 | ||
69 | 57 | (define (get-addr family pid groups) | |
58 | + | "This is a variant of 'make-socket-address' for AF_NETLINK sockets. The | |
59 | + | main difference is that it returns a raw bytevector that libguile procedures | |
60 | + | such as 'bind' cannot handle." | |
70 | 61 | (let ((addr (make-bytevector 12))) | |
71 | 62 | (bytevector-u16-set! addr 0 family (native-endianness)) | |
72 | 63 | (bytevector-u32-set! addr 4 pid (native-endianness)) | |
… | |||
85 | 76 | ||
86 | 77 | (define* (connect proto addr) | |
87 | 78 | (let ((sock (open-socket proto))) | |
88 | - | (ffi-bind (socket-num sock) | |
79 | + | (ffi-bind (fileno sock) | |
89 | 80 | (bytevector->pointer addr) | |
90 | 81 | 12) | |
91 | 82 | sock)) | |
… | |||
101 | 92 | (let* ((len (data-size msg)) | |
102 | 93 | (bv (make-bytevector len))) | |
103 | 94 | (serialize msg 0 bv) | |
104 | - | (ffi-sendto (socket-num sock) (bytevector->pointer bv) len 0 %null-pointer 0))) | |
95 | + | (ffi-sendto (fileno sock) (bytevector->pointer bv) len 0 %null-pointer 0))) | |
105 | 96 | ||
106 | 97 | (define* (receive-msg sock #:key (addr (get-addr AF_NETLINK 0 0))) | |
107 | 98 | (let* ((len (* 1024 32)) | |
… | |||
111 | 102 | iovec 1 | |
112 | 103 | %null-pointer 0 | |
113 | 104 | 0)) | |
114 | - | (size (ffi-recvmsg (socket-num sock) msghdr 0)) | |
105 | + | (size (ffi-recvmsg (fileno sock) msghdr 0)) | |
115 | 106 | (answer (make-bytevector size))) | |
116 | 107 | (when (> size (* 1024 32)) | |
117 | 108 | (raise (condition (&netlink-answer-too-big-error (size size))))) |