[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