projects
/
sbcl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Microoptimize type-tests on x86oids.
[sbcl.git]
/
contrib
/
sb-bsd-sockets
/
sockets.lisp
diff --git
a/contrib/sb-bsd-sockets/sockets.lisp
b/contrib/sb-bsd-sockets/sockets.lisp
index
17f30b7
..
146d32b
100644
(file)
--- a/
contrib/sb-bsd-sockets/sockets.lisp
+++ b/
contrib/sb-bsd-sockets/sockets.lisp
@@
-5,6
+5,13
@@
(eval-when (:load-toplevel :compile-toplevel :execute)
(eval-when (:load-toplevel :compile-toplevel :execute)
+
+;;; Winsock is different w.r.t errno
+(defun socket-errno ()
+ "Get socket error code, usually from errno, but see #+win32."
+ #+win32 (sockint::wsa-get-last-error)
+ #-win32 (sb-unix::get-errno))
+
(defclass socket ()
((file-descriptor :initarg :descriptor
:reader socket-file-descriptor)
(defclass socket ()
((file-descriptor :initarg :descriptor
:reader socket-file-descriptor)
@@
-19,6
+26,8
@@
protocol. Other values are used as-is.")
(type :initarg :type
:reader socket-type
:documentation "Type of the socket: :STREAM or :DATAGRAM.")
(type :initarg :type
:reader socket-type
:documentation "Type of the socket: :STREAM or :DATAGRAM.")
+ #+win32
+ (non-blocking-p :type (member t nil) :initform nil)
(stream))
(:documentation "Common base class of all sockets, not meant to be
directly instantiated.")))
(stream))
(:documentation "Common base class of all sockets, not meant to be
directly instantiated.")))
@@
-109,7
+118,7
@@
values"))
(size-of-sockaddr socket))))
(cond
((and (= fd -1)
(size-of-sockaddr socket))))
(cond
((and (= fd -1)
- (member (sb-unix::get-errno)
+ (member (socket-errno)
(list sockint::EAGAIN sockint::EINTR)))
nil)
((= fd -1) (socket-error "accept"))
(list sockint::EAGAIN sockint::EINTR)))
nil)
((= fd -1) (socket-error "accept"))
@@
-218,11
+227,11
@@
buffer was too small."))
(sb-alien:addr sa-len))))
(cond
((and (= len -1)
(sb-alien:addr sa-len))))
(cond
((and (= len -1)
- (member (sb-unix::get-errno)
+ (member (socket-errno)
(list sockint::EAGAIN sockint::EINTR)))
nil)
((= len -1) (socket-error "recvfrom"))
(list sockint::EAGAIN sockint::EINTR)))
nil)
((= len -1) (socket-error "recvfrom"))
- (t (loop for i from 0 below len
+ (t (loop for i from 0 below (min len length)
do (setf (elt buffer i)
(cond
((or (eql element-type 'character) (eql element-type 'base-char))
do (setf (elt buffer i)
(cond
((or (eql element-type 'character) (eql element-type 'base-char))
@@
-295,7
+304,7
@@
send(2) will be called instead. Returns the number of octets written."))
flags)))))
(cond
((and (= len -1)
flags)))))
(cond
((and (= len -1)
- (member (sb-unix::get-errno)
+ (member (socket-errno)
(list sockint::EAGAIN sockint::EINTR)))
nil)
((= len -1)
(list sockint::EAGAIN sockint::EINTR)))
nil)
((= len -1)
@@
-426,7
+435,7
@@
request an input stream and get an output stream in response\)."
:external-format external-format
:timeout timeout
:auto-close auto-close
:external-format external-format
:timeout timeout
:auto-close auto-close
- :serve-events serve-events))
+ :serve-events (and serve-events #+win32 nil)))
(setf (slot-value socket 'stream) stream))
(sb-ext:cancel-finalization socket)
stream))
(setf (slot-value socket 'stream) stream))
(sb-ext:cancel-finalization socket)
stream))
@@
-447,7
+456,9
@@
request an input stream and get an output stream in response\)."
(socket-error-syscall c)
(or (socket-error-symbol c) (socket-error-errno c))
#+cmu (sb-unix:get-unix-error-msg num)
(socket-error-syscall c)
(or (socket-error-symbol c) (socket-error-errno c))
#+cmu (sb-unix:get-unix-error-msg num)
- #+sbcl (sb-int:strerror num)))))
+ #+sbcl
+ #+win32 (sb-win32::get-last-error-message num)
+ #-win32 (sb-int:strerror num)))))
(:documentation "Common base class of socket related conditions."))
;;; watch out for slightly hacky symbol punning: we use both the value
(:documentation "Common base class of socket related conditions."))
;;; watch out for slightly hacky symbol punning: we use both the value
@@
-499,7
+510,7
@@
request an input stream and get an output stream in response\)."
;; FIXME: Our Texinfo documentation extracter need at least his to spit
;; out the signature. Real documentation would be better...
""
;; FIXME: Our Texinfo documentation extracter need at least his to spit
;; out the signature. Real documentation would be better...
""
- (let* ((errno (sb-unix::get-errno))
+ (let* ((errno (socket-errno))
(condition (condition-for-errno errno)))
(error condition :errno errno :syscall where)))
(condition (condition-for-errno errno)))
(error condition :errno errno :syscall where)))