I was trying to make a xinetd tcp service, using sbcl, but with
'wait=yes' in the xinetd configuration.
What this means for tcp is that xinetd will start the server given in
the configuration, and pass the listen()'d socket as fd 0 in the child
process it spawns, which the child must accept(), and then xinetd
simply watches the child thereafter. I've used xinetd before in this
way as a poor man's monitor process, because xinetd will restart the
child only if it dies on the next client connection, not every time a
client connects (as in the wait=no case).
However, the spawned process in this case being a sbcl script, I don't
know how to get at the fd 0 to do an accept() on it.
Attached are two (very quick) hacks, one in python, one in lisp. The
python one works enough to show what I was trying to find; a socket
The lisp one shows how I was trying to emulate fromfd(): basically
making a socket instance with :descriptor initarg of 0.
PS running on ubuntu 12.04, sbcl-1.0.57+, xinetd config below:
disable = yes
type = UNLISTED
id = lisp-server
socket_type = stream
protocol = tcp
port = 59595
server = /home/mcurry/lisp/throwaway/xinetd-server.lisp
user = mcurry
wait = yes