;;; 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)))