Summary: use the function EXT:OPEN-CLX-DISPLAY
instead of XLIB:OPEN-DISPLAY
to establish a connection
with your X11 server.
To prevent malicious users from snooping on an display (and logging
keystrokes for example), X11 servers may require connection requests
to be authorized. The X server (or display manager) will create a
random key on startup, and store it as an entry in a file generally
named $HOME/.Xauthority
. Clients must extract from this
file the "magic cookie" that corresponds to the server they wish to
connect to, and send it as authorization data when opening the
display. Users can manipulate the contents of the .Xauthority file by
using the xauth
command.
Most X11 programs use the xlib libraries, which transparently extract
magic cookie information when establishing a connection with the X
server. The old CLX code base does not have support for
MIT-MAGIC-COOKIE-1 authorization, so CLX programs may be rejected by
the X server. One workaround is to say xhost +localhost
,
to allow unauthorized X11 connections that originate from the local
host. A better solution is to change CLX programs to use the CMUCL
function EXT:OPEN-CLX-DISPLAY
instead of XLIB:OPEN-DISPLAY
to
establish connections to your X11 server. This function is able to
extract X11 authorization cookies from your XAUTHORITY file and
present them to the X server.
As far as we know, support for X11 authorization has not been integrated to the CLX code distributed by the commercial Common Lisp vendors.
Parsing the DISPLAY
environment variable
A further problem with the standard CLX function XLIB:OPEN-DISPLAY
is that it doesn't correctly
extract the display number from the DISPLAY
environment
variable. This is a problem you might run into when using CLX on an
ssh-forwarded X11 session. Indeed, ssh typically sets
$DISPLAY
to remotehost:10
, and forwards
port 6010 on the remote host to port 6000 (or whatever port the local
X11 server is running on) on the local host. CLX will unsuccessfully
try to connect to remotehost:0
.
The function EXT:OPEN-CLX-DISPLAY
parses a display specifier (which defaults to the contents of the
DISPLAY
environment variable) to extract the display and
screen numbers, so should automatically work for ssh-forwarded X11
sessions.
by Eric Marsden