(in-package :sb-bsd-sockets) #||

Local (unix) domain sockets

Local domain (AF_LOCAL) sockets are also known as Unix-domain sockets, but were renamed by POSIX presumably on the basis that they may be available on other systems too. A local socket address is a string, which is used to create a node in the local filesystem. This means of course that they cannot be used across a network. ||# (defclass local-socket (socket) ((family :initform sockint::af-local))) (defmethod make-sockaddr-for ((socket local-socket) &optional sockaddr &rest address &aux (filename (first address))) (let ((sockaddr (or sockaddr (sockint::allocate-sockaddr-un)))) (setf (sockint::sockaddr-un-family sockaddr) sockint::af-local) (when filename (loop for c across filename ;; XXX magic constant ew ew ew. should grovel this from ;; system headers for i from 0 to (min 107 (1- (length filename))) do (setf (sockint::sockaddr-un-path sockaddr i) (char-code c)) finally (setf (sockint::sockaddr-un-path sockaddr (1+ i)) 0))) sockaddr)) (defmethod size-of-sockaddr ((socket local-socket)) sockint::size-of-sockaddr-un) (defmethod bits-of-sockaddr ((socket local-socket) sockaddr) "Returns filename of SOCKADDR" (let ((name (sb-c-call::%naturalize-c-string (sb-sys:sap+ (sockint::array-data-address sockaddr) sockint::offset-of-sockaddr-un-path)))) (if (zerop (length name)) nil name)))