#ifdef USE_UNIX_SOCKETS
int bind_unix_socket(curl_socket_t sock, const char *unix_socket,
- struct sockaddr_un *sau) {
- int error;
- int rc;
-
- memset(sau, 0, sizeof(struct sockaddr_un));
- sau->sun_family = AF_UNIX;
- strncpy(sau->sun_path, unix_socket, sizeof(sau->sun_path) - 1);
- rc = bind(sock, (struct sockaddr*)sau, sizeof(struct sockaddr_un));
- if(0 != rc && SOCKERRNO == EADDRINUSE) {
- struct_stat statbuf;
- /* socket already exists. Perhaps it is stale? */
- curl_socket_t unixfd = socket(AF_UNIX, SOCK_STREAM, 0);
- if(CURL_SOCKET_BAD == unixfd) {
- logmsg("Failed to create socket at %s: (%d) %s",
- unix_socket, SOCKERRNO, sstrerror(SOCKERRNO));
- return -1;
- }
- /* check whether the server is alive */
- rc = connect(unixfd, (struct sockaddr*)sau, sizeof(struct sockaddr_un));
- error = SOCKERRNO;
- sclose(unixfd);
- if(0 != rc && ECONNREFUSED != error) {
- logmsg("Failed to connect to %s: (%d) %s",
- unix_socket, error, sstrerror(error));
- return rc;
- }
- /* socket server is not alive, now check if it was actually a socket. */
+ struct sockaddr_un *sau)
+{
+ int error;
+ int rc;
+ size_t len = strlen(unix_socket);
+
+ memset(sau, 0, sizeof(struct sockaddr_un));
+ sau->sun_family = AF_UNIX;
+ if(len >= sizeof(sau->sun_path) - 1) {
+ logmsg("Too long unix socket domain path (%zd)", len);
+ return -1;
+ }
+ strcpy(sau->sun_path, unix_socket);
+ rc = bind(sock, (struct sockaddr*)sau, sizeof(struct sockaddr_un));
+ if(0 != rc && SOCKERRNO == EADDRINUSE) {
+ struct_stat statbuf;
+ /* socket already exists. Perhaps it is stale? */
+ curl_socket_t unixfd = socket(AF_UNIX, SOCK_STREAM, 0);
+ if(CURL_SOCKET_BAD == unixfd) {
+ logmsg("Failed to create socket at %s: (%d) %s",
+ unix_socket, SOCKERRNO, sstrerror(SOCKERRNO));
+ return -1;
+ }
+ /* check whether the server is alive */
+ rc = connect(unixfd, (struct sockaddr*)sau, sizeof(struct sockaddr_un));
+ error = SOCKERRNO;
+ sclose(unixfd);
+ if(0 != rc && ECONNREFUSED != error) {
+ logmsg("Failed to connect to %s: (%d) %s",
+ unix_socket, error, sstrerror(error));
+ return rc;
+ }
+ /* socket server is not alive, now check if it was actually a socket. */
#ifdef _WIN32
- /* Windows does not have lstat function. */
- rc = curlx_win32_stat(unix_socket, &statbuf);
+ /* Windows does not have lstat function. */
+ rc = curlx_win32_stat(unix_socket, &statbuf);
#else
- rc = lstat(unix_socket, &statbuf);
+ rc = lstat(unix_socket, &statbuf);
#endif
- if(0 != rc) {
- logmsg("Error binding socket, failed to stat %s: (%d) %s",
- unix_socket, errno, strerror(errno));
- return rc;
- }
+ if(0 != rc) {
+ logmsg("Error binding socket, failed to stat %s: (%d) %s",
+ unix_socket, errno, strerror(errno));
+ return rc;
+ }
#ifdef S_IFSOCK
- if((statbuf.st_mode & S_IFSOCK) != S_IFSOCK) {
- logmsg("Error binding socket, failed to stat %s", unix_socket);
- return -1;
- }
+ if((statbuf.st_mode & S_IFSOCK) != S_IFSOCK) {
+ logmsg("Error binding socket, failed to stat %s", unix_socket);
+ return -1;
+ }
#endif
- /* 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));
- return rc;
- }
- /* stale socket is gone, retry bind */
- rc = bind(sock, (struct sockaddr*)sau, sizeof(struct sockaddr_un));
+ /* 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));
+ return rc;
}
- return rc;
+ /* stale socket is gone, retry bind */
+ rc = bind(sock, (struct sockaddr*)sau, sizeof(struct sockaddr_un));
+ }
+ return rc;
}
#endif