[usocket-cvs] r455 - in usocket/branches/experimental-udp: . backend

Chun Tian (binghe) ctian at common-lisp.net
Wed Oct 22 13:37:17 UTC 2008


Author: ctian
Date: Wed Oct 22 13:37:16 2008
New Revision: 455

Log:
[udp] merge recent fix on 0.4 branch and manually refit for SOCKET-CONNECT (UDP version).

Modified:
   usocket/branches/experimental-udp/backend/armedbear.lisp
   usocket/branches/experimental-udp/backend/clisp.lisp
   usocket/branches/experimental-udp/backend/cmucl.lisp
   usocket/branches/experimental-udp/backend/lispworks.lisp
   usocket/branches/experimental-udp/backend/sbcl.lisp
   usocket/branches/experimental-udp/backend/scl.lisp
   usocket/branches/experimental-udp/condition.lisp

Modified: usocket/branches/experimental-udp/backend/armedbear.lisp
==============================================================================
--- usocket/branches/experimental-udp/backend/armedbear.lisp	(original)
+++ usocket/branches/experimental-udp/backend/armedbear.lisp	Wed Oct 22 13:37:16 2008
@@ -190,9 +190,8 @@
                        timeout deadline (nodelay nil nodelay-specified)
                        local-host local-port)
   (when deadline (unsupported 'deadline 'socket-connect))
-  (when (or local-host local-port)
-    (unimplemented 'local-host 'socket-connect)
-    (unimplemented 'local-port 'socket-connect))
+  (when local-host (unimplemented 'local-host 'socket-connect))
+  (when local-port (unimplemented 'local-port 'socket-connect))
 
   (let ((usock))
     (with-mapped-conditions (usock)

Modified: usocket/branches/experimental-udp/backend/clisp.lisp
==============================================================================
--- usocket/branches/experimental-udp/backend/clisp.lisp	(original)
+++ usocket/branches/experimental-udp/backend/clisp.lisp	Wed Oct 22 13:37:16 2008
@@ -62,9 +62,8 @@
   (when timeout (unsupported 'timeout 'socket-connect))
   (when deadline (unsupported 'deadline 'socket-connect))
   (when nodelay-specified (unsupported 'nodelay 'socket-connect))
-  (when (or local-host local-port)
-     (unsupported 'local-host 'socket-connect)
-     (unsupported 'local-port 'socket-connect))
+  (when local-host (unsupported 'local-host 'socket-connect))
+  (when local-port (unsupported 'local-port 'socket-connect))
 
   (let ((socket)
         (hostname (host-to-hostname host)))

Modified: usocket/branches/experimental-udp/backend/cmucl.lisp
==============================================================================
--- usocket/branches/experimental-udp/backend/cmucl.lisp	(original)
+++ usocket/branches/experimental-udp/backend/cmucl.lisp	Wed Oct 22 13:37:16 2008
@@ -52,23 +52,29 @@
 
 (defun socket-connect (host port &key (protocol :stream) (element-type 'character)
                        timeout deadline (nodelay t nodelay-specified)
-                       local-host local-port)
+		       (local-host nil local-host-p)
+		       (local-port nil local-port-p)
+		       &aux
+		       (local-bind-p (fboundp 'ext::bind-inet-socket)))
   (declare (ignore nodelay))
   (when timeout (unsupported 'timeout 'socket-connect))
   (when deadline (unsupported 'deadline 'socket-connect))
   (when nodelay-specified (unsupported 'nodelay 'socket-connect))
-  (when (or local-host local-port)
-     (unsupported 'local-host 'socket-connect)
-     (unsupported 'local-port 'socket-connect))
+  (when (and local-host-p (not local-bind-p))
+     (unsupported 'local-host 'socket-connect :minimum "Snapshot 2008-08 (19E)"))
+  (when (and local-port-p (not local-bind-p))
+     (unsupported 'local-port 'socket-connect :minimum "Snapshot 2008-08 (19E)"))
 
   (let ((socket))
     (ecase protocol
       (:stream
        (setf socket
-	     (with-mapped-conditions (socket)
-	       (ext:connect-to-inet-socket (host-to-hbo host) port :stream
-					   :local-host (host-to-hbo local-host)
-					   :local-port local-port)))
+	     (let ((args (list (host-to-hbo host) port protocol)))
+	       (when (and local-bind-p (or local-host-p local-port-p))
+		 (nconc args (list :local-host (host-to-hbo local-host)
+				   :local-port local-port)))
+	       (with-mapped-conditions (socket)
+		 (apply #'ext:connect-to-inet-socket args))))
        (if socket
 	   (let* ((stream (sys:make-fd-stream socket :input t :output t
 					      :element-type element-type
@@ -82,15 +88,21 @@
       (:datagram
        (setf socket
 	     (if (and host port)
-		 (with-mapped-conditions (socket)
-		   (ext:connect-to-inet-socket (host-to-hbo host) port :datagram
-					       :local-host (host-to-hbo local-host)
-					       :local-port local-port))
-		 (if (or local-host local-port)
+		 (let ((args (list (host-to-hbo host) port protocol)))
+		   (when (and local-bind-p (or local-host-p local-port-p))
+		     (nconc args (list :local-host (host-to-hbo local-host)
+				       :local-port local-port)))
+		   (with-mapped-conditions (socket)
+		     (apply #'ext:connect-to-inet-socket args)))
+		 (if (or local-host-p local-port-p)
 		     (with-mapped-conditions (socket)
-		       (ext:create-inet-listener (or local-port 0) :datagram :host local-host))
+		       (apply #'ext:create-inet-listener
+			      (nconc (list (or local-port 0) protocol)
+				     (when (and local-host-p
+						(ip/= local-host *wildcard-host*))
+				       (list :host (host-to-hbo local-host))))))
 		     (with-mapped-conditions (socket)
-		       (ext:create-inet-socket :datagram)))))
+		       (ext:create-inet-socket protocol)))))
        (if socket
 	   (let ((usocket (make-datagram-socket socket)))
 	     (ext:finalize usocket #'(lambda () (when (%open-p usocket)
@@ -249,5 +261,4 @@
                    (setf (state x) :READ)))
              (progn
 	       ;;###FIXME generate an error, except for EINTR
-               (cmucl-map-socket-error err)
                )))))))

Modified: usocket/branches/experimental-udp/backend/lispworks.lisp
==============================================================================
--- usocket/branches/experimental-udp/backend/lispworks.lisp	(original)
+++ usocket/branches/experimental-udp/backend/lispworks.lisp	Wed Oct 22 13:37:16 2008
@@ -255,10 +255,11 @@
   
   #+(and (not lispworks4) (not lispworks5.0))
   (when nodelay-specified (unimplemented 'nodelay 'socket-connect))
-  #+lispworks4
-  (when (or local-host local-port)
-     (unsupported 'local-host 'socket-connect :minimum "LispWorks 5.0+ (verified)")
-     (unsupported 'local-port 'socket-connect :minimum "LispWorks 5.0+ (verified)"))
+  #+lispworks4 #+lispworks4
+  (when local-host
+     (unsupported 'local-host 'socket-connect :minimum "LispWorks 5.0"))
+  (when local-port
+     (unsupported 'local-port 'socket-connect :minimum "LispWorks 5.0"))
 
   (ecase protocol
     (:stream

Modified: usocket/branches/experimental-udp/backend/sbcl.lisp
==============================================================================
--- usocket/branches/experimental-udp/backend/sbcl.lisp	(original)
+++ usocket/branches/experimental-udp/backend/sbcl.lisp	Wed Oct 22 13:37:16 2008
@@ -202,7 +202,10 @@
 
 (defun socket-connect (host port &key (protocol :stream) (element-type 'character)
                        timeout deadline (nodelay t nodelay-specified)
-                       local-host local-port)
+                       local-host local-port
+		       &aux
+		       (sockopt-tcp-nodelay-p
+			(fboundp 'sb-bsd-sockets::sockopt-tcp-nodelay)))
   (when deadline (unsupported 'deadline 'socket-connect))
   (when timeout (unsupported 'timeout 'socket-connect))
   (when (and nodelay-specified
@@ -210,7 +213,7 @@
              ;; package today. There's no guarantee the functions
              ;; we need are available, but we can make sure not to
              ;; call them if they aren't
-             (not (fboundp 'sb-bsd-sockets::sockopt-tcp-nodelay)))
+             (not sockopt-tcp-nodelay-p))
     (unsupported 'nodelay 'socket-connect))
 
   (let ((socket (make-instance 'sb-bsd-sockets:inet-socket
@@ -228,8 +231,7 @@
 		  ;;###FIXME: The above line probably needs an :external-format
 		  (usocket (make-stream-socket :stream stream :socket socket))
 		  (ip (host-to-vector-quad host)))
-	     (when (and nodelay-specified
-			(fboundp 'sb-bsd-sockets::sockopt-tcp-nodelay))
+	     (when (and nodelay-specified sockopt-tcp-nodelay-p)
 	       (setf (sb-bsd-sockets:sockopt-tcp-nodelay socket) nodelay))
 	     (when (or local-host local-port)
 	       (sb-bsd-sockets:socket-bind socket
@@ -340,9 +342,9 @@
      (sb-bsd-sockets::host-ent-addresses
          (sb-bsd-sockets:get-host-by-name name))))
 
-#+sbcl
+#+(and sbcl (not win32))
 (progn
-  #-win32
+
 (defun %setup-wait-list (wait-list)
   (declare (ignore wait-list)))
 
@@ -384,10 +386,10 @@
                              (socket x))
                             rfds)
                        (setf (state x) :READ))))))))))
+) ; progn
 
-  #+win32
+#+(and sbcl win32)
   (warn "wait-for-input not (yet!) supported...")
-  )
 
 #+ecl
 (progn

Modified: usocket/branches/experimental-udp/backend/scl.lisp
==============================================================================
--- usocket/branches/experimental-udp/backend/scl.lisp	(original)
+++ usocket/branches/experimental-udp/backend/scl.lisp	Wed Oct 22 13:37:16 2008
@@ -30,45 +30,55 @@
 
 (defun socket-connect (host port &key (protocol :stream) (element-type 'character)
                        timeout deadline (nodelay t nodelay-specified)
-                       local-host local-port)
+		       (local-host nil local-host-p)
+		       (local-port nil local-port-p)
+		       &aux
+		       (patch-udp-p (fboundp 'ext::inet-socket-send-to)))
   (declare (ignore nodelay))
   (when nodelay-specified (unsupported 'nodelay 'socket-connect))
   (when deadline (unsupported 'deadline 'socket-connect))
   (when timeout (unsupported 'timeout 'socket-connect))
-  (when (or local-host local-port)
-     (unsupported 'local-host 'socket-connect)
-     (unsupported 'local-port 'socket-connect))
+  (when (and local-host-p (not patch-udp-p))
+     (unsupported 'local-host 'socket-connect :minimum "1.3.8.2"))
+  (when (and local-port-p (not patch-udp-p))
+     (unsupported 'local-port 'socket-connect :minimum "1.3.8.2"))
 
   (let ((socket))
     (ecase protocol
       (:stream
-       (setf socket (with-mapped-conditions ()
-		      (ext:connect-to-inet-socket (host-to-hbo host) port
-						  :kind :stream
-						  #+ignore #+ignore
-						  #+ignore #+ignore
-						  :local-host (if local-host
-								  (host-to-hbo local-host))
-						  :local-port local-port)))
+       (setf socket (let ((args (list (host-to-hbo host) port :kind protocol)))
+		      (when (and patch-udp-p (or local-host-p local-port-p))
+			(nconc args (list :local-host (host-to-hbo local-host)
+					  :local-port local-port)))
+		      (with-mapped-conditions (socket)
+			(apply #'ext:connect-to-inet-socket args))))
        (let ((stream (sys:make-fd-stream socket :input t :output t
 					 :element-type element-type
 					 :buffering :full)))
 	 (make-stream-socket :socket socket :stream stream)))
       (:datagram
+       (when (not patch-udp-p)
+	 (error 'unsupported
+		:feature '(protocol :datagram)
+		:context 'socket-connect
+		:minumum "1.3.8.2 or ask a udp-patch from SCL maintainer"))
        (setf socket
 	     (if (and host port)
-		 (with-mapped-conditions ()
-		   (ext:connect-to-inet-socket (host-to-hbo host) port
-					       :kind :datagram
-					       :local-host (host-to-hbo local-host)
-					       :local-port local-port))
-		 (if (or local-port local-port)
+		 (let ((args (list (host-to-hbo host) port :kind protocol)))
+		   (when (and patch-udp-p (or local-host-p local-port-p))
+		     (nconc args (list :local-host (host-to-hbo local-host)
+				       :local-port local-port)))
+		   (with-mapped-conditions (socket)
+		     (apply #'ext:connect-to-inet-socket args)))
+		 (if (or local-host-p local-port-p)
 		     (with-mapped-conditions ()
 		       (ext:create-inet-listener (or local-port 0)
-						 :datagram
-						 :host local-host))
+						 protocol
+						 :host (if (ip= host *wildcard-host*)
+							   0
+							   (host-to-hbo local-host))))
 		     (with-mapped-conditions ()
-		       (ext:create-inet-socket :datagram)))))
+		       (ext:create-inet-socket protocol)))))
        (let ((usocket (make-datagram-socket socket)))
 	 (ext:finalize usocket #'(lambda ()
 				   (when (%open-p usocket)
@@ -128,10 +138,8 @@
     (multiple-value-bind (result errno)
 	(ext:inet-socket-send-to s buffer length
 				 :remote-host address :remote-port port)
-      (unless result
-	(error "~@<Error sending on socket ~D: ~A~@:>" s
-	       (unix:get-unix-error-msg errno)))
-      result)))
+      (or result
+	  (scl-map-socket-error errno :socket socket)))))
 
 (defmethod socket-receive ((socket datagram-usocket) buffer length)
   (let ((s (socket socket)))
@@ -141,10 +149,9 @@
 			   (length buffer))))
       (multiple-value-bind (result errno remote-host remote-port)
 	  (ext:inet-socket-receive-from s real-buffer real-length)
-	(unless result
-	  (error "~@<Error receiving on socket ~D: ~A~@:>" s
-		 (unix:get-unix-error-msg errno)))
-	(values real-buffer result remote-host remote-port)))))
+	(if result
+	    (values real-buffer result remote-host remote-port)
+	    (scl-map-socket-error errno :socket socket))))))
 
 (defmethod get-local-name ((usocket usocket))
   (multiple-value-bind (address port)

Modified: usocket/branches/experimental-udp/condition.lisp
==============================================================================
--- usocket/branches/experimental-udp/condition.lisp	(original)
+++ usocket/branches/experimental-udp/condition.lisp	Wed Oct 22 13:37:16 2008
@@ -25,6 +25,12 @@
   ((minimum :initarg :minimum :reader minimum
             :documentation "Indicates the minimal version of the
 implementation required to support the requested feature."))
+  (:report (lambda (c stream)
+	     (format stream "~A in ~A is unsupported."
+		     (feature c) (context c))
+	     (when (minimum c)
+	       (format stream " Minimum version (~A) is required."
+		       (minimum c)))))
   (:documentation "Signalled when the underlying implementation
 doesn't allow supporting the requested feature.
 
@@ -32,6 +38,9 @@
 
 (define-condition unimplemented (insufficient-implementation)
   ()
+  (:report (lambda (c stream)
+	     (format stream "~A in ~A is unimplemented."
+		     (feature c) (context c))))
   (:documentation "Signalled if a certain feature might be implemented,
 based on the features of the underlying implementation, but hasn't
 been implemented yet."))
@@ -110,13 +119,16 @@
   ((real-error :initarg :real-error
                :accessor usocket-real-error))
   (:report (lambda (c stream)
-             (format stream
-                     (simple-condition-format-control (usocket-real-error c))
-                     (simple-condition-format-arguments (usocket-real-error c)))))
+             (typecase c
+               (simple-condition
+                (format stream
+                        (simple-condition-format-control (usocket-real-error c))
+                        (simple-condition-format-arguments (usocket-real-error c))))
+               (otherwise
+                (format stream "The condition ~A occurred." (usocket-real-error c))))))
   (:documentation "Error raised when there's no other - more applicable -
 error available."))
 
-
 (define-usocket-condition-classes
   (ns-try-again)
   (ns-condition))
@@ -140,9 +152,13 @@
   ((real-error :initarg :real-error
                :accessor ns-real-error))
   (:report (lambda (c stream)
-             (format stream
-                     (simple-condition-format-control (ns-real-error c))
-                     (simple-condition-format-arguments (ns-real-error c)))))
+             (typecase c
+               (simple-condition
+                (format stream
+                        (simple-condition-format-control (usocket-real-error c))
+                        (simple-condition-format-arguments (usocket-real-error c))))
+               (otherwise
+                (format stream "The condition ~A occurred." (usocket-real-error c))))))
   (:documentation "Error raised when there's no other - more applicable -
 error available."))
 
@@ -201,8 +217,10 @@
 
 
 (defmacro unsupported (feature context &key minimum)
-  `(cerror 'unsupported :feature ,feature
-    :context ,context :minimum ,minimum))
+  `(cerror "Ignore it and continue" 'unsupported
+	   :feature ,feature
+	   :context ,context
+	   :minimum ,minimum))
 
 (defmacro unimplemented (feature context)
   `(signal 'unimplemented :feature ,feature :context ,context))




More information about the usocket-cvs mailing list