[Openmcl-devel] Unix domain sockets broken in Darwin x86?

Gary Byers gb at clozure.com
Tue Nov 21 00:35:48 PST 2006

I was going to say that aside from potential x86 vs PPC issues
(endianness), the fact that a lot of stream code (including socket
code) was rewritten and reorganized meant that that was also
a likely suspect; the actual culprit seems to have been Unicode.

Way back when, it was possible to copy a lisp string to foreign
memory by just BLTing some number of 8-bit bytes/octets around.
That worked fine, because lisp strings were just vectors of octets
each of which encoded an 8-bit character code.

If lisp strings are vectors of 32-bit (well, 21-bit ...) character
codes, copying each of those octets to foreign memory (via some
low-level BLTing function like CCL::%COPY-IVECTOR-TO-PTR) won't
work so well (it'll usually copy about 3 NUL octets per character ...)

This (BLTing octets from a lisp string to foreign memory) is what
the function CCL::INIT-UNIX-SOCKADDR (in ccl:level-1;l1-sockets.lisp)
was doing; that seems to have set the socket's "address" (pathname
in the case of Unix sockets) to random nonsense with a lot of NULs
in it, and (unless there was a named socket whose name was the same
random nonsense visible) the connect would fail.

I checked a fix for this and a few related issues into CVS a few
minutes ago and it seems to work, at least in a simple test case. It
should be easy to bootstrap the changes to l1-sockets.lisp from
the 061110 images.

On Tue, 21 Nov 2006, Daniel Dickison wrote:

> I'm having trouble getting OpenMCL to connect to a Unix domain socket
> using Version 1.1-pre-061110.  The code works on PPC, I believe
> OpenMCL 1.0, although it might have been an earlier 1.1 beta.
> Unfortunately it's a little difficult to cross-check this now.  Could
> something between 1.0 and 1.1 have broken Unix domain sockets, or is
> it a x86 vs PPC issue?  And most importantly, how can I help track
> this down?
> Here's the relevant Lisp code -- this gets called from an Obj-C
> frontend which runs OpenMCL as a background process:
> (defvar *gui-socket* nil)
> (defun start-gui-server (socket-path)
>   (process-run-function "fms-gui-server" #'gui-server socket-path))
> (defun gui-server (socket-path)
>   (in-package :fms-cocoa-gui)
>   (with-open-socket (*gui-socket*
>                      :remote-filename socket-path
>                      :address-family :file
>                      :type :stream
>                      :connect :active)
>     (loop
>        (handler-case (let ((message (read *gui-socket*)))
>                        (eval message))
>          (error (err)
>            (send-response +error-string+))
>          (:no-error (result &rest other-vals)
>            (declare (ignore other-vals))
>            (send-response result))))))
> Best,
> Daniel
> _______________________________________________
> Openmcl-devel mailing list
> Openmcl-devel at clozure.com
> http://clozure.com/mailman/listinfo/openmcl-devel

More information about the Openmcl-devel mailing list