From: Petter G. <sb...@gu...> - 2009-08-17 21:10:57
|
I'm having a problem with SBCL and Portable Allegroserve on a x86_64 system. I've seen this discussed before, but unfortunately I can't find it right now on google. Does anybody have a pointer? It feels like a waste to debug something which has been resolved... Here's the specs: * (machine-type) "X86-64" * (lisp-implementation-version) "1.0.26-r10-gentoo" * (lisp-implementation-type) "SBCL" * (asdf:component-version (asdf:find-system :aserve)) "1.2.47" The problem is that it tries to coerce an IP to a simple array of four bytes: debugger invoked on a SIMPLE-TYPE-ERROR in thread #<THREAD "initial thread" RUNNING {1002737A31}>: 1348150661 can't be converted to type (SIMPLE-ARRAY (UNSIGNED-BYTE 8) (4)). 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. ((FLET SB-IMPL::COERCE-ERROR)) 0] down (COERCE 1348150661 (SIMPLE-ARRAY (UNSIGNED-BYTE 8) (4))) 1] down ((SB-PCL::FAST-METHOD SB-BSD-SOCKETS::MAKE-SOCKADDR-FOR (SB-BSD-SOCKETS:INET-SOCKET)) #<unused argument> #<unused argument> #<unused argument> NIL 1348150661 80) 2] down ((SB-PCL::FAST-METHOD SB-BSD-SOCKETS:SOCKET-CONNECT (SB-BSD-SOCKETS:SOCKET)) #<unavailable argument> #<unavailable argument> #<SB-BSD-SOCKETS:INET-SOCKET descriptor 5 {1002CE2811}>)[:EXTERNAL] 3] down (ACL-COMPAT.SOCKET:MAKE-SOCKET)[:EXTERNAL] Thanks! Best regards Petter |
From: Leslie P. P. <sk...@vi...> - 2009-08-18 08:11:20
|
Petter Gustad wrote: > > I'm having a problem with SBCL and Portable Allegroserve on a x86_64 > system. I've seen this discussed before, but unfortunately I can't > find it right now on google. Does anybody have a pointer? It feels > like a waste to debug something which has been resolved... I don't know about previous occurences of this problem, but the coercion below doesn't look kosher at all. Try replacing it with a proper conversion routine. Leslie -- http://www.linkedin.com/in/polzer |
From: Petter G. <sb...@gu...> - 2009-08-18 18:05:41
|
From: "Leslie P. Polzer" <sk...@vi...> Subject: Re: [Sbcl-help] SBCL sockets and Portable Allegroserve Date: Tue, 18 Aug 2009 10:11:03 +0200 (CEST) > I don't know about previous occurences of this problem, but > the coercion below doesn't look kosher at all. > > Try replacing it with a proper conversion routine. Hmm. I seem to remember that the problem was elsewhere, but replacing the coerce with a sequence ldb seem to work fine, at least on a little endian machine: (defmethod make-sockaddr-for ((socket inet-socket) &optional sockaddr &rest address &aux (host (first address)) (port (second address))) (let ((sockaddr (or sockaddr (sockint::allocate-sockaddr-in)))) (when (and host port) ;; port and host are represented in C as "network-endian" unsigned ;; integers of various lengths. This is stupid. The value of the ;; integer doesn't matter (and will change depending on your ;; machine's endianness); what the bind(2) call is interested in ;; is the pattern of bytes within that integer. ;; We have no truck with such dreadful type punning. Octets to ;; octets, dust to dust. (setf (sockint::sockaddr-in-family sockaddr) sockint::af-inet) (setf (sb-alien:deref (sockint::sockaddr-in-port sockaddr) 0) (ldb (byte 8 8) port)) (setf (sb-alien:deref (sockint::sockaddr-in-port sockaddr) 1) (ldb (byte 8 0) port)) (setf (sb-alien:deref (sockint::sockaddr-in-addr sockaddr) 0) (ldb (byte 8 24) host)) (setf (sb-alien:deref (sockint::sockaddr-in-addr sockaddr) 1) (ldb (byte 8 16) host)) (setf (sb-alien:deref (sockint::sockaddr-in-addr sockaddr) 2) (ldb (byte 8 8) host)) (setf (sb-alien:deref (sockint::sockaddr-in-addr sockaddr) 3) (ldb (byte 8 0) host))) sockaddr)) Petter |