connection: Use Guile's 'socket' procedure to open a socket.

Ludovic Court??sTue May 23 20:42:51+0200 2023

21b4b5b

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

256256
optional @var{groups} keyword, you can select broadcast groups to subscribe to.
257257
@end deffn
258258
259-
@deffn {Scheme Procedure} close-socket @var{socket}
260-
Closes a netlink socket.  The socket cannot be used afterwards.
261-
@end deffn
262-
263259
@deffn {Scheme Procedure} send-msg @var{msg} @var{sock} [#:@var{addr}]
264260
Send @var{msg} (it must be of type message, @xref{Netlink Headers}) to
265261
@var{addr} using @var{sock}.  If not passed, @var{addr} is the address of

ip/addr.scm

100100
  (let ((sock (connect-route)))
101101
    (send-msg message sock)
102102
    (let ((answer (receive-and-decode-msg sock %default-route-decoder)))
103-
      (close-socket sock)
103+
      (close-port sock)
104104
      (answer-ok? (last answer)))))
105105
106106
(define* (addr-add device cidr #:key (ipv6? #f) (peer (cidr->addr cidr))

180180
  (let ((sock (connect-route)))
181181
    (send-msg message sock)
182182
    (let ((answer (receive-and-decode-msg sock %default-route-decoder)))
183-
      (close-socket sock)
183+
      (close-port sock)
184184
      (answer-ok? (last answer)))))
185185
186186
(define (get-addrs)

216216
                          (get-attr attrs IFA_BROADCAST)
217217
                          (get-attr attrs IFA_CACHEINFO))))
218218
                    addrs)))
219-
      (close-socket sock)
219+
      (close-port sock)
220220
      addrs)))
221221
222222
(define print-addr

ip/link.scm

9494
                   (get-attr attrs IFLA_ADDRESS)
9595
                   (get-attr attrs IFLA_BROADCAST))))
9696
               links)))
97-
      (close-socket sock)
97+
      (close-port sock)
9898
      links)))
9999
100100
(define print-link

246246
    (let ((answer (receive-and-decode-msg sock %default-route-decoder)))
247247
      (when netnsfd
248248
        (close netnsfd))
249-
      (close-socket sock)
249+
      (close-port sock)
250250
      (answer-ok? (last answer)))))
251251
252252
(define* (bond-type-args #:key (mode #f) (miimon #f) (lacp-active #f) (lacp-rate #f)

364364
  (let ((sock (connect-route)))
365365
    (send-msg message sock)
366366
    (let ((answer (receive-and-decode-msg sock %default-route-decoder)))
367-
      (close-socket sock)
367+
      (close-port sock)
368368
      (answer-ok? (last answer)))))
369369
370370
(define* (link-del device)

390390
  (let ((sock (connect-route)))
391391
    (send-msg message sock)
392392
    (let ((answer (receive-and-decode-msg sock %default-route-decoder)))
393-
      (close-socket sock)
393+
      (close-port sock)
394394
      (answer-ok? (last answer)))))

ip/route.scm

106106
  (let ((sock (connect-route)))
107107
    (send-msg message sock)
108108
    (let ((answer (receive-and-decode-msg sock %default-route-decoder)))
109-
      (close-socket sock)
109+
      (close-port sock)
110110
      (answer-ok? (last answer)))))
111111
112112
(define* (route-add dest

170170
  (let ((sock (connect-route)))
171171
    (send-msg message sock)
172172
    (let ((answer (receive-and-decode-msg sock %default-route-decoder)))
173-
      (close-socket sock)
173+
      (close-port sock)
174174
      (answer-ok? (last answer)))))
175175
176176
(define (link-ref links id)

221221
                           (get-attr attrs RTA_PRIORITY)
222222
                           (link-ref links (get-attr attrs RTA_OIF)))))
223223
                     routes)))
224-
      (close-socket sock)
224+
      (close-port sock)
225225
      routes)))
226226
227227
(define print-route

netlink/connection.scm

2222
  #:use-module (netlink message)
2323
  #:use-module (rnrs bytevectors)
2424
  #:use-module (system foreign)
25-
  #:use-module (srfi srfi-9)
2625
  #:use-module (srfi srfi-34)
2726
  #:use-module (srfi srfi-35)
2827
  #:export (connect

3433
            get-addr))
3534
3635
(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+
4337
(define ffi-sendto (pointer->procedure int
4438
                                       (dynamic-func "sendto" libc)
4539
                                       (list int '* size_t int '* int)

5145
                                     (dynamic-func "bind" libc)
5246
                                     (list int '* int)))
5347
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-
6148
;; define simple functions to open/close sockets
6249
(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))
6856
6957
(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."
7061
  (let ((addr (make-bytevector 12)))
7162
    (bytevector-u16-set! addr 0 family (native-endianness))
7263
    (bytevector-u32-set! addr 4 pid (native-endianness))

8576
8677
(define* (connect proto addr)
8778
  (let ((sock (open-socket proto)))
88-
    (ffi-bind (socket-num sock)
79+
    (ffi-bind (fileno sock)
8980
              (bytevector->pointer addr)
9081
              12)
9182
    sock))

10192
  (let* ((len (data-size msg))
10293
         (bv (make-bytevector len)))
10394
    (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)))
10596
10697
(define* (receive-msg sock #:key (addr (get-addr AF_NETLINK 0 0)))
10798
  (let* ((len (* 1024 32))

111102
                             iovec 1
112103
                             %null-pointer 0
113104
                             0))
114-
         (size (ffi-recvmsg (socket-num sock) msghdr 0))
105+
         (size (ffi-recvmsg (fileno sock) msghdr 0))
115106
         (answer (make-bytevector size)))
116107
    (when (> size (* 1024 32))
117108
      (raise (condition (&netlink-answer-too-big-error (size size)))))