diff options
Diffstat (limited to 'lib/curl_addrinfo.c')
| -rw-r--r-- | lib/curl_addrinfo.c | 39 | 
1 files changed, 39 insertions, 0 deletions
| diff --git a/lib/curl_addrinfo.c b/lib/curl_addrinfo.c index 94ed63d96..b8032f4df 100644 --- a/lib/curl_addrinfo.c +++ b/lib/curl_addrinfo.c @@ -33,6 +33,9 @@  #ifdef HAVE_ARPA_INET_H  #  include <arpa/inet.h>  #endif +#ifdef HAVE_SYS_UN_H +#  include <sys/un.h> +#endif  #ifdef __VMS  #  include <in.h> @@ -477,6 +480,42 @@ Curl_addrinfo *Curl_str2addr(char *address, int port)    return NULL; /* bad input format */  } +#ifdef USE_UNIX_SOCKETS +/** + * Given a path to a UNIX domain socket, return a newly allocated Curl_addrinfo + * struct initialized with this path. + */ +Curl_addrinfo *Curl_unix2addr(const char *path) +{ +  Curl_addrinfo *ai; +  struct sockaddr_un *sun; +  size_t path_len; + +  ai = calloc(1, sizeof(Curl_addrinfo)); +  if(!ai) +    return NULL; +  if((ai->ai_addr = calloc(1, sizeof(struct sockaddr_un))) == NULL) { +    free(ai); +    return NULL; +  } +  /* sun_path must be able to store the NUL-terminated path */ +  path_len = strlen(path); +  if(path_len >= sizeof(sun->sun_path)) { +    free(ai->ai_addr); +    free(ai); +    return NULL; +  } + +  ai->ai_family = AF_UNIX; +  ai->ai_socktype = SOCK_STREAM; /* assume reliable transport for HTTP */ +  ai->ai_addrlen = (curl_socklen_t) sizeof(struct sockaddr_un); +  sun = (void *) ai->ai_addr; +  sun->sun_family = AF_UNIX; +  memcpy(sun->sun_path, path, path_len + 1); /* copy NUL byte */ +  return ai; +} +#endif +  #if defined(CURLDEBUG) && defined(HAVE_FREEADDRINFO)  /*   * curl_dofreeaddrinfo() | 
