[usocket-cvs] r45 - usocket/trunk/backend

ehuelsmann at common-lisp.net ehuelsmann at common-lisp.net
Sun Feb 5 21:50:41 UTC 2006


Author: ehuelsmann
Date: Sun Feb  5 15:50:41 2006
New Revision: 45

Modified:
   usocket/trunk/backend/cmucl.lisp
Log:
Introduce error handling for cmucl 19b and later.

Modified: usocket/trunk/backend/cmucl.lisp
==============================================================================
--- usocket/trunk/backend/cmucl.lisp	(original)
+++ usocket/trunk/backend/cmucl.lisp	Sun Feb  5 15:50:41 2006
@@ -6,15 +6,47 @@
 (in-package :usocket)
 
 
+(defun remap-maybe-for-win32 (z)
+  (mapcar #'(lambda (x)
+              (cons (mapcar #'(lambda (y)
+                                (+ 10000 y))
+                            (car x))
+                    (cdr x)))
+          z))
+
+(defparameter +cmucl-error-map+
+  #+win32
+   (append (remap-for-win32 +unix-errno-condition-map+)
+          (remap-for-win32 +unix-errno-error-map+))
+  #-win32
+  (append +unix-errno-condition-map+
+          +unix-errno-error-map+))
+
+
 ;; CMUCL error handling is brain-dead: it doesn't preserve any
 ;; information other than the OS error string from which the
 ;; error can be determined. The OS error string isn't good enough
 ;; given that it may have been localized (l10n).
 ;;
+;; The above applies to versions pre 19b; 19d and newer are expected to
+;; contain even better error reporting.
+;;
+;;
 ;; Just catch the errors and encapsulate them in an unknown-error
 (defun handle-condition (condition &optional (socket nil))
   "Dispatch correct usocket condition."
   (typecase condition
+    (ext::simple-error
+       (let ((usock-err
+              (cdr (assoc (ext::socket-errno c)
+                          +cmucl-error-map+ :test member))))
+         (if usock-err
+             (if (subtypep usock-err 'error)
+                 (error usock-err :socket socket)
+               (signal usock-err :socket socket))
+           (error 'unknown-error
+                  :socket socket
+                  :real-error condition))))
     (simple-error (error 'unknown-error
                          :real-condition condition
                          :socket socket))))
@@ -23,7 +55,7 @@
   (let* ((socket))
     (setf socket
           (with-mapped-conditions (socket)
-             (ext:connect-to-inet-socket (host-byte-order host) port type)))
+             (ext:connect-to-inet-socket (host-to-hbo host) port type)))
     (let* ((stream (sys:make-fd-stream socket :input t :output t
                                        :element-type 'character
                                        :buffering :full))



More information about the usocket-cvs mailing list