diff --git a/src/xpdev/multisock.c b/src/xpdev/multisock.c index 4f536613ce616e2576440589ed53c67d8e69cfa3..4d93feace1fd674981001447355ad1f20722049f 100644 --- a/src/xpdev/multisock.c +++ b/src/xpdev/multisock.c @@ -5,6 +5,7 @@ #include <string.h> #include <gen_defs.h> #include <sockwrap.h> +#include <dirwrap.h> #include <multisock.h> struct xpms_set *xpms_create(unsigned int retries, unsigned int wait_secs, @@ -48,24 +49,49 @@ BOOL xpms_add(struct xpms_set *xpms_set, int domain, int type, { struct xpms_sockdef *new_socks; struct addrinfo hints; - struct addrinfo *res; + struct addrinfo *res=NULL; struct addrinfo *cur; unsigned int added = 0; int ret; char port_str[6]; - memset(&hints, 0, sizeof(hints)); - hints.ai_flags=AI_PASSIVE; - hints.ai_family=domain; - hints.ai_socktype=type; - hints.ai_protocol=protocol; - hints.ai_flags|=AI_NUMERICSERV; - hints.ai_flags|=AI_ADDRCONFIG; - sprintf(port_str, "%hu", port); - if((ret=getaddrinfo(addr, port_str, &hints, &res))!=0) { - if(xpms_set->lprintf) - xpms_set->lprintf(LOG_CRIT, "!ERROR %d calling getaddrinfo() on %s", ret, addr); - return FALSE; +#ifndef _WIN32 + struct addrinfo dummy; + struct sockaddr_un un_addr; + + if(domain == AF_UNIX) { + memset(&dummy, 0, sizeof(dummy)); + dummy.ai_family = AF_UNIX; + dummy.ai_socktype = type; + dummy.ai_addr = (struct sockaddr *)&un_addr; + un_addr.sun_family=AF_UNIX; + + if(strlen(addr) >= sizeof(un_addr.sun_path)) { + if(xpms_set->lprintf) + xpms_set->lprintf(LOG_ERR, "!ERROR %s is too long for a AF_UNIX socket", addr); + return FALSE; + } + strcpy(un_addr.sun_path,addr); + if(fexist(addr)) + unlink(addr); + dummy.ai_addrlen = sizeof(un_addr); + res = &dummy; + } +#endif + if(res == NULL) { + memset(&hints, 0, sizeof(hints)); + hints.ai_flags=AI_PASSIVE; + hints.ai_family=domain; + hints.ai_socktype=type; + hints.ai_protocol=protocol; + hints.ai_flags|=AI_NUMERICSERV; + hints.ai_flags|=AI_ADDRCONFIG; + sprintf(port_str, "%hu", port); + if((ret=getaddrinfo(addr, port_str, &hints, &res))!=0) { + if(xpms_set->lprintf) + xpms_set->lprintf(LOG_CRIT, "!ERROR %d calling getaddrinfo() on %s", ret, addr); + return FALSE; + } } for(cur=res; cur; cur=cur->ai_next) { @@ -126,7 +152,10 @@ BOOL xpms_add(struct xpms_set *xpms_set, int domain, int type, xpms_set->sock_count++; } - freeaddrinfo(res); +#ifndef _WIN32 + if(res != &dummy) +#endif + freeaddrinfo(res); if(added) return TRUE; return FALSE;