mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-01-31 18:41:39 +00:00
[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.
This commit is contained in:
parent
019767b546
commit
127f966f4b
11
src/log.c
11
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;
|
||||
}
|
||||
|
||||
|
@ -14,6 +14,8 @@
|
||||
#include <netdb.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user