From 480d8567013ae4dc5467b34da64111077b1b427c Mon Sep 17 00:00:00 2001 From: Stelian Ionescu Date: Sun, 5 May 2013 03:49:07 +0200 Subject: [PATCH] Conditionally compile Netlink helpers and classes only on Linux --- src/sockets/address.lisp | 7 +++++++ src/sockets/base-sockets.lisp | 2 ++ src/sockets/common.lisp | 2 ++ src/sockets/make-socket.lisp | 10 ++++++++++ src/sockets/socket-methods.lisp | 4 ++++ 5 files changed, 25 insertions(+) diff --git a/src/sockets/address.lisp b/src/sockets/address.lisp index d5478e3..9a087b5 100644 --- a/src/sockets/address.lisp +++ b/src/sockets/address.lisp @@ -35,6 +35,7 @@ ADDRESS-NAME reader.")) (unset-method-docstring #'abstract-address-p () '(local-address)) (set-function-docstring 'abstract-address-p "Return T if ADDRESS is a LOCAL-ADDRESS that lives in the abstract namespace.") +#+linux (defclass netlink-address (address) ((multicast-groups :initform 0 :initarg :multicast-groups :reader netlink-address-multicast-groups))) @@ -81,6 +82,7 @@ ADDRESS-NAME reader.")) (values (parse-un-path path) nil)) (make-instance 'local-address :name name :abstract abstract)))) +#+linux (defun sockaddr-nl->sockaddr (snl) (with-foreign-slots ((groups port) snl sockaddr-nl) (values (make-instance 'netlink-address :multicast-groups groups) @@ -92,6 +94,7 @@ ADDRESS-NAME reader.")) (af-inet (sockaddr-in->sockaddr ss)) (af-inet6 (sockaddr-in6->sockaddr ss)) (af-local (sockaddr-un->sockaddr ss)) + #+linux (af-netlink (sockaddr-nl->sockaddr ss))))) (defun sockaddr->sockaddr-storage (ss sockaddr &optional (port 0)) @@ -100,6 +103,7 @@ ADDRESS-NAME reader.")) (ipv6-address (make-sockaddr-in6 ss (address-name sockaddr) port)) (local-address (make-sockaddr-un ss (address-name sockaddr) (abstract-address-p sockaddr))) + #+linux (netlink-address (make-sockaddr-nl ss (multicast-groups sockaddr) port)))) (defun sockaddr-size (ss) @@ -108,6 +112,7 @@ ADDRESS-NAME reader.")) (af-inet (isys:sizeof 'sockaddr-in)) (af-inet6 (isys:sizeof 'sockaddr-in6)) (af-local (isys:sizeof 'sockaddr-un)) + #+linux (af-netlink (isys:sizeof 'sockaddr-nl))))) ;;;; Conversion functions @@ -351,6 +356,7 @@ returned unmodified." (format nil "~:[~;@~]~S" (abstract-address-p address) (address-name address))) +#+linux (defmethod address-to-string ((address netlink-address)) (format nil "~A" (netlink-address-multicast-groups address))) @@ -365,6 +371,7 @@ returned unmodified." (format stream "Unix socket address: ~A" (address-to-string address)))) +#+linux (defmethod print-object ((address netlink-address) stream) (print-unreadable-object (address stream :type nil :identity nil) (format stream "Netlink socket address: ~A" diff --git a/src/sockets/base-sockets.lisp b/src/sockets/base-sockets.lisp index 7b3641a..c9fe54f 100644 --- a/src/sockets/base-sockets.lisp +++ b/src/sockets/base-sockets.lisp @@ -156,6 +156,7 @@ Works only on DATAGRAM sockets.")) (:default-initargs :address-family :local) (:documentation "Mixin for sockets of domain AF_LOCAL.")) +#+linux (defclass netlink-socket (socket) () (:default-initargs :address-family :netlink) (:documentation "Mixin for sockets of domain AF_NETLINK.")) @@ -292,6 +293,7 @@ address and the remote port if applicable.")) (:default-initargs :type :raw) (:documentation "Class representing active sockets of type SOCK_RAW and domain AF_LOCAL.")) +#+linux (defclass socket-raw-netlink (netlink-socket raw-socket) () (:default-initargs :type :raw) diff --git a/src/sockets/common.lisp b/src/sockets/common.lisp index 067c231..c7f0681 100644 --- a/src/sockets/common.lisp +++ b/src/sockets/common.lisp @@ -154,6 +154,7 @@ (make-sockaddr-un ,var ,address ,abstract) ,@body)) +#+linux (defun make-sockaddr-nl (snl multicast-groups &optional (portno 0)) (declare (type ub32 multicast-groups) (type ub32 portno)) @@ -164,6 +165,7 @@ (setf port portno)) (values snl)) +#+linux (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) diff --git a/src/sockets/make-socket.lisp b/src/sockets/make-socket.lisp index 695c058..f273a06 100644 --- a/src/sockets/make-socket.lisp +++ b/src/sockets/make-socket.lisp @@ -17,6 +17,7 @@ ((:ipv4 :datagram nil) . socket-datagram-internet) ((:ipv6 :datagram nil) . socket-datagram-internet) ((:ipv4 :raw nil) . socket-raw-internet) + #+linux ((:netlink :raw nil) . socket-raw-netlink))) (defun select-socket-class (address-family type connect) @@ -255,6 +256,7 @@ call CLOSE with :ABORT T on `VAR'." ;;; Netlink Socket creation +#+linux (defun %%init-socket/netlink-raw (socket local-port multicast-groups) (when local-port (bind-address socket @@ -263,10 +265,17 @@ call CLOSE with :ABORT T on `VAR'." :port local-port)) (values socket)) +#+linux (define-socket-creator (:netlink :raw) (family protocol &key (local-port 0) (multicast-groups 0)) (with-close-on-error (socket (create-socket family :raw protocol)) (%%init-socket/netlink-raw socket local-port multicast-groups))) + +#-linux +(define-socket-creator (:netlink :raw) + (family protocol &key (local-port 0) (multicast-groups 0)) + (declare (ignore family protocol local-port multicast-groups)) + (error 'socket-address-family-not-supported-error)) ;;; MAKE-SOCKET @@ -350,6 +359,7 @@ The socket is automatically closed upon exit." (af-inet :ipv4) (af-inet6 :ipv6) (af-local :local) + #+linux (af-netlink :netlink)))) (%get-type (fd) (eswitch ((get-socket-option-int fd sol-socket so-type) :test #'=) diff --git a/src/sockets/socket-methods.lisp b/src/sockets/socket-methods.lisp index a342190..95cb3e6 100644 --- a/src/sockets/socket-methods.lisp +++ b/src/sockets/socket-methods.lisp @@ -14,6 +14,7 @@ (:ipv4 af-inet) (:ipv6 af-inet6) (:local af-local) + #+linux (:netlink af-netlink))) (st (ecase type (:stream sock-stream) @@ -142,6 +143,7 @@ (address-to-string host) port)) (format stream ", closed" ))))) +#+linux (defmethod print-object ((socket socket-raw-netlink) stream) (print-unreadable-object (socket stream :identity t) (format stream "netlink socket") @@ -200,6 +202,7 @@ (defmethod local-port ((socket internet-socket)) (nth-value 1 (%local-name socket))) +#+linux (defmethod local-port ((socket netlink-socket)) (nth-value 1 (%local-name socket))) @@ -269,6 +272,7 @@ (%bind (fd-of socket) sun (actual-size-of-sockaddr-un sun))) (values socket)) +#+linux (defmethod bind-address ((socket netlink-socket) (address netlink-address) &key (port 0)) (with-sockaddr-nl (snl (netlink-address-multicast-groups address) port) -- 2.11.4.GIT