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))))) | |