[usocket-devel] HOST-TO-HBO bug on SBCL

Chun Tian (binghe) binghe.lisp at gmail.com
Mon Jul 21 17:22:49 UTC 2008


Hi, Erik

On SBCL (I'm using 1.0.18.x), HOST-TO-HBO cannot work for string:

* (usocket::host-to-hbo "localhost")

debugger invoked on a SB-KERNEL:CASE-FAILURE:
   #(127 0 0 1) fell through ETYPECASE expression.
   Wanted one of (INTEGER (VECTOR T 4) STRING).

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
   0: [ABORT] Exit debugger, returning to top level.

This is because SBCL return #(127 0 0 1) as type (simple-array  
(unsigned-byte 8) (4)), it's not a subtype of (VECTOR T 4).

An solution is add more type to the ETYPECASE of HOST-TO-HBO: (and  
HOST-TO-VECTOR-QUAD)

#-(or clisp armedbear)
(progn
   (defun host-to-vector-quad (host)
     "Translate a host specification (vector quad, dotted quad or  
domain name)
to a vector quad."
     (etypecase host
       (string (let* ((ip (ignore-errors
                            (dotted-quad-to-vector-quad host))))
                 (if (and ip (= 4 (length ip)))
                     ;; valid IP dotted quad?
                     ip
                   (get-random-host-by-name host))))
       ((vector t 4) host)
       ((simple-array (unsigned-byte 8) (4)) host)
       (integer (hbo-to-vector-quad host))
       (null nil)))

   (defun host-to-hbo (host)
     (etypecase host
       (string (let ((ip (ignore-errors
                           (dotted-quad-to-vector-quad host))))
                 (if (and ip (= 4 (length ip)))
                     (host-byte-order ip)
                   (host-to-hbo (get-host-by-name host)))))
       ((vector t 4) (host-byte-order host))
       ((simple-array (unsigned-byte 8) (4)) (host-byte-order host))
       (integer host)
       (null nil))))

For some reason, I think just let (HOST-TO-HBO NIL) returns NIL will  
be good, can save us some coding.

Please review this, thanks.

Regards,

Chun Tian (binghe)




More information about the usocket-devel mailing list