X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=contrib%2Fsb-bsd-sockets%2Fmisc.lisp;h=e38a6131156ab9c5dbf6247841401d05fbc5a161;hb=HEAD;hp=2c0246bd9817b05d6aabcaa45a8b2cb298455f48;hpb=568daf6b160280428701670b921f419aabd9eba0;p=sbcl.git diff --git a/contrib/sb-bsd-sockets/misc.lisp b/contrib/sb-bsd-sockets/misc.lisp index 2c0246b..e38a613 100644 --- a/contrib/sb-bsd-sockets/misc.lisp +++ b/contrib/sb-bsd-sockets/misc.lisp @@ -22,7 +22,8 @@ 0)))) #+win32 -(defmethod non-blocking-mode ((socket socket)) 0) +(defmethod non-blocking-mode ((socket socket)) + (slot-value socket 'non-blocking-p)) (defgeneric (setf non-blocking-mode) (non-blocking-p socket) (:documentation "Put SOCKET in non-blocking mode - or not, according to NON-BLOCKING-P")) @@ -43,8 +44,14 @@ non-blocking-p)) #+win32 -(defmethod (setf non-blocking-mode) (non-blocking-p (socket socket)) 0) -;; (sb-alien:with-alien ((mode (unsigned 32))) -;; (if non-blocking-p (setf mode 1)) -;; (ioctlsocket socket FIONBIO mode))) - +(defmethod (setf non-blocking-mode) + (non-blocking-p (socket socket)) + (declare (optimize (speed 3))) + (setf (slot-value socket 'non-blocking-p) + (when non-blocking-p t)) + (let ((fd (socket-file-descriptor socket))) + (when (= (the (signed-byte 32) -1) + (the (signed-byte 32) + (sockint::ioctl fd sockint::FIONBIO (if non-blocking-p 1 0)))) + (socket-error "ioctl(FIONBIO)")) + (when non-blocking-p t)))