- break;
-#endif /* ENABLE_IPV6 */
-#ifdef USE_UNIX_SOCKETS
- case AF_UNIX:
- memset(&me.sau, 0, sizeof(me.sau));
- me.sau.sun_family = AF_UNIX;
- strncpy(me.sau.sun_path, unix_socket, sizeof(me.sau.sun_path));
- rc = bind(sock, &me.sa, sizeof(me.sau));
- if(0 != rc && errno == EADDRINUSE) {
- struct stat statbuf;
- /* socket already exists. Perhaps it is stale? */
- int unixfd = socket(AF_UNIX, SOCK_STREAM, 0);
- if(CURL_SOCKET_BAD == unixfd) {
- error = SOCKERRNO;
- logmsg("Error binding socket, failed to create socket at %s: (%d) %s",
- unix_socket, error, strerror(error));
- goto sws_cleanup;
- }
- /* check whether the server is alive */
- rc = connect(unixfd, &me.sa, sizeof(me.sau));
- error = errno;
- close(unixfd);
- if(ECONNREFUSED != error) {
- logmsg("Error binding socket, failed to connect to %s: (%d) %s",
- unix_socket, error, strerror(error));
- goto sws_cleanup;
- }
- /* socket server is not alive, now check if it was actually a socket.
- * Systems which have Unix sockets will also have lstat */
- rc = lstat(unix_socket, &statbuf);
- if (0 != rc) {
- logmsg("Error binding socket, failed to stat %s: (%d) %s",
- unix_socket, errno, strerror(errno));
- goto sws_cleanup;
- }
- if((statbuf.st_mode & S_IFSOCK) != S_IFSOCK) {
- logmsg("Error binding socket, failed to stat %s: (%d) %s",
- unix_socket, error, strerror(error));
- goto sws_cleanup;
- }
- /* dead socket, cleanup and retry bind */
- rc = unlink(unix_socket);
- if(0 != rc) {
- logmsg("Error binding socket, failed to unlink %s: (%d) %s",
- unix_socket, errno, strerror(errno));
- goto sws_cleanup;
- }
- /* stale socket is gone, retry bind */
- rc = bind(sock, &me.sa, sizeof(me.sau));
- }
- break;
-#endif /* USE_UNIX_SOCKETS */