Work at SourceForge, help us to make it a better place! We have an immediate need for a Support Technician in our San Francisco or Denver office.

Close

[10d2c0]: contrib / sb-bsd-sockets / misc.lisp Maximize Restore History

Download this file

misc.lisp    37 lines (29 with data), 1.3 kB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
(in-package :sb-bsd-sockets)
;;; Miscellaneous things, placed here until I can find a logically more
;;; coherent place to put them
;;; I don't want to provide a complete interface to unix file
;;; operations, for example, but being about to set O_NONBLOCK on a
;;; socket is a necessary operation.
;;; XXX bad (sizeof (int) ==4 ) assumptions
(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::fcntl fd sockint::f-getfl arg)
sockint::o-nonblock)
0))))
(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)))
(arg2
(if non-blocking-p
(logior arg1 sockint::o-nonblock)
(logand (lognot sockint::o-nonblock) arg1))))
(when (= (the (signed-byte 32) -1)
(the (signed-byte 32)
(sockint::fcntl fd sockint::f-setfl arg2)))
(socket-error "fcntl"))
non-blocking-p))