socket.c. For now I only need it to be able to handle UNIX domain sockets, but it sure would be nice for it to be extensible. I'd make a unix.c, but then I'd have to duplicate a bunch of code. In the meantime I suppose I'll just use fd.c. Client sockets will work in the expected manner. Server sockets will set hw_readable to an accept() wrapper. I need to add SIGCHLD handling to child.c. For that to work, child_open() must be able to insert an additional pollfd into the event loop. I am really unsure how best to handle this. One thought is to specify read/write/hangup/error callbacks for each pollfd. typedef int (*poll_cb_t)(device_t*); struct pollfd_ex { device_t* dev; VEC_T(poll_cb_t) readable_cbs; VEC_T(poll_cb_t) writable_cbs; VEC_T(poll_cb_t) pollerr_cbs; }; But the above has problems, since it effectively forbids the low-level or high- level code from changing its callbacks after the device is opened. Maybe this is an acceptable restriction. I'd like *something* to replace the current stupid pollfd_in/pollfd_out system which is a pain to work with. But there must still be a default sink and a default source, or else what fd's are the buffers associated with? Adding or removing devices inside the event loop is dangerous unless certain precautions are taken. I should document this. Better yet, ensure safety. The following functions, or similar, probably need to be implemented. Right now sending and receiving is performed by directly accessing the input and output buffers and the pollfd_out struct, which is dangerous in case of, say, null_init(). I already have device_sendf()... maybe more of the same? int device_send(device_t* dev, char** buf, int len) int device_recv(device_t* dev, char** buf, int* len) # vim: set ts=4 sts=4 sw=4 tw=80 et syn=off: