On Mon, 25 Jul 2011 10:51:51 +0100, Quinn "The Eskimo!" wrote:
On 24 Jul 2011, at 23:15, mailist@ericgorr.net wrote:
One question is how should /var/tmp/net.ericgorr.testserver/Socket be created?
This is your fundamental problem. The launchd infrastructure will take care of creating the UNIX domain socket for you, but it won't create intermediate directories. So the socket has to live within a directory that already exists. The standard path is for your service would be "/var/run/net.ericgorr.testserver.socket" ("/var/run" not "/var/tmp", and ".socket" not "/socket").
Ok. So, using /var/run and .socket also takes care of the issue mentioned in the CFLocalServer sample code: // This routine is called to safely bind the UNIX domain socket // specified by sockFD to the path specificed by socketPath. To avoid // security problems, socketPath must point it to a sticky directory // (such as "/var/tmp"). This allows us to create the socket with // very specific permissions, without us having to worry about a malicious // process switching stuff out from underneath us. I got a little farther, but my client still won't connect. After rebuilding the server and loading it into launchd, I do see: srw-rw-rw- 1 root daemon 0 Jul 25 06:54 net.ericgorr.testserver.socket= in /var/run In common.h, I now have: #define kServerSocketPath "/var/run/net.ericgorr.testserver.socket" and the client_connect function in the client code remained: int client_connect( void ) { int socketFD = socket( AF_UNIX, SOCK_STREAM, 0 ); assert( socketFD != -1 ); struct sockaddr_un addr; addr.sun_len = sizeof( addr ); addr.sun_family = AF_UNIX; strcpy( addr.sun_path, kServerSocketPath ); int result; int err; result = connect( socketFD, (struct sockaddr *)&socketFD, sizeof( socketFD ) ); err = MoreUNIXErrno( result ); CFShow( CFStringCreateWithFormat( NULL, NULL, CFSTR( "client_connect: %d" ), err ) ); assert( err == 0 ); return socketFD; } However, errno is still set to 2. I have updated the sample project at: http://ericgorr.net/pq/AF_UNIX.zip Thank you.