From: Stelian Ionescu Date: Sun, 5 May 2013 01:18:27 +0000 (+0200) Subject: Add conversion helpers for netlink addresses X-Git-Tag: v0.8.1~70 X-Git-Url: https://repo.or.cz/w/iolib.git/commitdiff_plain/5490dec73370d69a9a8102b0bcab89612b031d9c Add conversion helpers for netlink addresses --- diff --git a/src/sockets/address.lisp b/src/sockets/address.lisp index 6633434..a45796b 100644 --- a/src/sockets/address.lisp +++ b/src/sockets/address.lisp @@ -73,26 +73,34 @@ ADDRESS-NAME reader.")) (values (parse-un-path path) nil)) (make-instance 'local-address :name name :abstract abstract)))) +(defun sockaddr-nl->sockaddr (snl) + (with-foreign-slots ((groups port) snl sockaddr-nl) + (values (make-instance 'netlink-address :multicast-groups groups) + port))) + (defun sockaddr-storage->sockaddr (ss) (with-foreign-slots ((family) ss sockaddr-storage) (switch (family :test #'=) (af-inet (sockaddr-in->sockaddr ss)) (af-inet6 (sockaddr-in6->sockaddr ss)) - (af-local (sockaddr-un->sockaddr ss))))) + (af-local (sockaddr-un->sockaddr ss)) + (af-netlink (sockaddr-nl->sockaddr ss))))) (defun sockaddr->sockaddr-storage (ss sockaddr &optional (port 0)) (etypecase sockaddr (ipv4-address (make-sockaddr-in ss (address-name sockaddr) port)) (ipv6-address (make-sockaddr-in6 ss (address-name sockaddr) port)) (local-address (make-sockaddr-un ss (address-name sockaddr) - (abstract-address-p sockaddr))))) + (abstract-address-p sockaddr))) + (netlink-address (make-sockaddr-nl ss (multicast-groups sockaddr) port)))) (defun sockaddr-size (ss) (with-foreign-slots ((family) ss sockaddr-storage) (switch (family :test #'=) (af-inet (isys:sizeof 'sockaddr-in)) (af-inet6 (isys:sizeof 'sockaddr-in6)) - (af-local (isys:sizeof 'sockaddr-un))))) + (af-local (isys:sizeof 'sockaddr-un)) + (af-netlink (isys:sizeof 'sockaddr-nl))))) ;;;; Conversion functions diff --git a/src/sockets/common.lisp b/src/sockets/common.lisp index 3bf3d6a..067c231 100644 --- a/src/sockets/common.lisp +++ b/src/sockets/common.lisp @@ -154,6 +154,21 @@ (make-sockaddr-un ,var ,address ,abstract) ,@body)) +(defun make-sockaddr-nl (snl multicast-groups &optional (portno 0)) + (declare (type ub32 multicast-groups) + (type ub32 portno)) + (isys:bzero snl (isys:sizeof 'sockaddr-nl)) + (with-foreign-slots ((family groups port) snl sockaddr-nl) + (setf family af-netlink) + (setf groups multicast-groups) + (setf port portno)) + (values snl)) + +(defmacro with-sockaddr-nl ((var multicast-groups &optional (port 0)) &body body) + `(with-foreign-object (,var 'sockaddr-nl) + (make-sockaddr-nl ,var ,multicast-groups ,port) + ,@body)) + (defmacro with-sockaddr-storage ((var) &body body) `(with-foreign-object (,var 'sockaddr-storage) (isys:bzero ,var (isys:sizeof 'sockaddr-storage))