+ /* create the socket directory */
+ byte_xasprintf(&dir, "%s/speaker", config->home);
+ unlink(dir); /* might be a leftover socket */
+ if(mkdir(dir, 0700) < 0 && errno != EEXIST)
+ fatal(errno, "error creating %s", dir);
+ /* set up the listen socket */
+ listenfd = xsocket(PF_UNIX, SOCK_STREAM, 0);
+ memset(&addr, 0, sizeof addr);
+ addr.sun_family = AF_UNIX;
+ snprintf(addr.sun_path, sizeof addr.sun_path, "%s/speaker/socket",
+ config->home);
+ if(unlink(addr.sun_path) < 0 && errno != ENOENT)
+ error(errno, "removing %s", addr.sun_path);
+ xsetsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one);
+ if(bind(listenfd, (const struct sockaddr *)&addr, sizeof addr) < 0)
+ fatal(errno, "error binding socket to %s", addr.sun_path);
+ xlisten(listenfd, 128);
+ nonblock(listenfd);
+ info("listening on %s", addr.sun_path);
+ memset(&sm, 0, sizeof sm);
+ sm.type = SM_READY;
+ speaker_send(1, &sm);