Fix make-array transforms.
[sbcl.git] / contrib / sb-bsd-sockets / misc.lisp
index 6dd2bfb..e38a613 100644 (file)
@@ -9,8 +9,11 @@
 
 ;;; XXX bad (sizeof (int) ==4 ) assumptions
 
+(defgeneric non-blocking-mode (socket)
+  (:documentation "Is SOCKET in non-blocking mode?"))
+
+#-win32
 (defmethod non-blocking-mode ((socket socket))
-  "Is SOCKET in non-blocking mode?"
   (let ((fd (socket-file-descriptor socket)))
     (sb-alien:with-alien ((arg integer))
                          (> (logand
                              sockint::o-nonblock)
                             0))))
 
+#+win32
+(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"))
+
+#-win32
 (defmethod (setf non-blocking-mode) (non-blocking-p (socket socket))
-  "Put SOCKET in non-blocking mode - or not, according to NON-BLOCKING-P"
   (declare (optimize (speed 3)))
   (let* ((fd (socket-file-descriptor socket))
          (arg1 (the (signed-byte 32) (sockint::fcntl fd sockint::f-getfl 0)))
               (logior arg1 sockint::o-nonblock)
             (logand (lognot sockint::o-nonblock) arg1))))
     (when (= (the (signed-byte 32) -1)
-             (the (signed-byte 32) 
+             (the (signed-byte 32)
                (sockint::fcntl fd sockint::f-setfl arg2)))
       (socket-error "fcntl"))
     non-blocking-p))
 
-
+#+win32
+(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)))