Conditionally compile Netlink helpers and classes only on Linux
authorStelian Ionescu <sionescu@cddr.org>
Sun, 5 May 2013 01:49:07 +0000 (03:49 +0200)
committerStelian Ionescu <sionescu@cddr.org>
Sun, 5 May 2013 01:49:07 +0000 (03:49 +0200)
src/sockets/address.lisp
src/sockets/base-sockets.lisp
src/sockets/common.lisp
src/sockets/make-socket.lisp
src/sockets/socket-methods.lisp

index d5478e3..9a087b5 100644 (file)
@@ -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"
index 7b3641a..c9fe54f 100644 (file)
@@ -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)
index 067c231..c7f0681 100644 (file)
      (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))
     (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)
index 695c058..f273a06 100644 (file)
@@ -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))
 \f
 
 ;;; 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 #'=)
index a342190..95cb3e6 100644 (file)
@@ -14,6 +14,7 @@
               (:ipv4  af-inet)
               (:ipv6  af-inet6)
               (:local af-local)
+              #+linux
               (:netlink af-netlink)))
         (st (ecase type
               (:stream   sock-stream)
                       (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")
 (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)))
 
     (%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)