From 127f966f4bda0379e60d0f8ac031b3480139f71a Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 6 Dec 2007 00:53:51 +0100 Subject: [PATCH] [BUILD] fix build on Solaris due to recent log changes Solaris, as well as many other unixes doesn't know about sun_len for UNIX domain sockets. It does not honnor the __SOCKADDR_COMMON macro either. After looking at MacOS-X man (which is the same as BSD man), OpenBSD man, and examples on the net, it appears that those which support sun_len do not actually use it, or at least ignore it as long as it's zero. Since all the sockaddr structures are zeroed prior to being filled, it causes no problem not to set sun_len, and this fixes build on other platforms. Another problem on Solaris was that the "sun" name is already defined as a macro returning a number, so it was necessary to rename it. --- src/log.c | 11 ----------- src/standard.c | 25 ++++++++++--------------- 2 files changed, 10 insertions(+), 26 deletions(-) diff --git a/src/log.c b/src/log.c index fdb3b8c45..c7ea25c8d 100644 --- a/src/log.c +++ b/src/log.c @@ -149,7 +149,6 @@ int get_log_facility(const char *fac) */ static inline int logsrv_addrlen(const struct logsrv *logsrv) { -#ifdef __SOCKADDR_COMMON switch (logsrv->u.addr.sa_family) { case AF_UNIX: return sizeof(logsrv->u.un); @@ -158,16 +157,6 @@ static inline int logsrv_addrlen(const struct logsrv *logsrv) default: break; } -#else /* !__SOCKADDR_COMMON */ - switch (logsrv->u.addr.sa_family) { - case AF_UNIX: - return logsrv->u.un.sun_len; - case AF_INET: - return logsrv->u.in.sin_len; - default: - break; - } -#endif /* !__SOCKADDR_COMMON */ return -1; } diff --git a/src/standard.c b/src/standard.c index dc09467ea..93cf1f89e 100644 --- a/src/standard.c +++ b/src/standard.c @@ -14,6 +14,8 @@ #include #include #include +#include +#include #include #include @@ -83,30 +85,26 @@ const char *limit_r(unsigned long n, char *buffer, int size, const char *alt) */ struct sockaddr_un *str2sun(char *str) { - static struct sockaddr_un sun; + static struct sockaddr_un su; int strsz; /* length included null */ - memset(&sun, 0, sizeof(sun)); + memset(&su, 0, sizeof(su)); str = strdup(str); if (str == NULL) goto out_nofree; strsz = strlen(str) + 1; - if (strsz > sizeof(sun.sun_path)) { + if (strsz > sizeof(su.sun_path)) { Alert("Socket path '%s' too long (max %d)\n", - str, sizeof(sun.sun_path) - 1); + str, sizeof(su.sun_path) - 1); goto out_nofree; } - -#ifndef __SOCKADDR_COMMON - sun.sun_len = sizeof(sun.sun_path); -#endif /* !__SOCKADDR_COMMON */ - sun.sun_family = AF_UNIX; - memcpy(sun.sun_path, str, strsz); + su.sun_family = AF_UNIX; + memcpy(su.sun_path, str, strsz); free(str); out_nofree: - return &sun; + return &su; } /* @@ -141,7 +139,7 @@ const char *invalid_char(const char *name) return name; while (*name) { - if (!isalnum(*name) && *name != '.' && *name != ':' && + if (!isalnum((int)*name) && *name != '.' && *name != ':' && *name != '_' && *name != '-') return name; name++; @@ -184,9 +182,6 @@ struct sockaddr_in *str2sa(char *str) else sa.sin_addr = *(struct in_addr *) *(he->h_addr_list); } -#ifndef __SOCKADDR_COMMON - sa.sin_len = sizeof(sa); -#endif /* !__SOCKADDR_COMMON */ sa.sin_port = htons(port); sa.sin_family = AF_INET;