[MEDIUM] IPv6 support for syslog
diff --git a/include/common/standard.h b/include/common/standard.h
index 6675e47..e20eb77 100644
--- a/include/common/standard.h
+++ b/include/common/standard.h
@@ -501,4 +501,52 @@
 	return 0;
 }
 
+/* returns port in network byte order */
+static inline int get_net_port(struct sockaddr_storage *addr)
+{
+	switch (addr->ss_family) {
+	case AF_INET:
+		return ((struct sockaddr_in *)addr)->sin_port;
+	case AF_INET6:
+		return ((struct sockaddr_in6 *)addr)->sin6_port;
+	}
+	return 0;
+}
+
+/* returns port in host byte order */
+static inline int get_host_port(struct sockaddr_storage *addr)
+{
+	switch (addr->ss_family) {
+	case AF_INET:
+		return ntohs(((struct sockaddr_in *)addr)->sin_port);
+	case AF_INET6:
+		return ntohs(((struct sockaddr_in6 *)addr)->sin6_port);
+	}
+	return 0;
+}
+
+/* set port in host byte order */
+static inline int set_net_port(struct sockaddr_storage *addr, int port)
+{
+	switch (addr->ss_family) {
+	case AF_INET:
+		((struct sockaddr_in *)addr)->sin_port = port;
+	case AF_INET6:
+		((struct sockaddr_in6 *)addr)->sin6_port = port;
+	}
+	return 0;
+}
+
+/* set port in network byte order */
+static inline int set_host_port(struct sockaddr_storage *addr, int port)
+{
+	switch (addr->ss_family) {
+	case AF_INET:
+		((struct sockaddr_in *)addr)->sin_port = htons(port);
+	case AF_INET6:
+		((struct sockaddr_in6 *)addr)->sin6_port = htons(port);
+	}
+	return 0;
+}
+
 #endif /* _COMMON_STANDARD_H */
diff --git a/include/types/log.h b/include/types/log.h
index 3281c3c..44b37a0 100644
--- a/include/types/log.h
+++ b/include/types/log.h
@@ -48,11 +48,7 @@
 #define LW_RSPHDR	2048	/* response header(s) */
 
 struct logsrv {
-	union {
-		struct sockaddr addr;
-		struct sockaddr_un un;	/* AF_UNIX */
-		struct sockaddr_in in;	/* AF_INET */
-	} u;
+	struct sockaddr_storage addr;
 };
 
 #endif /* _TYPES_LOG_H */
diff --git a/src/cfgparse.c b/src/cfgparse.c
index 7456e47..de56f61 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -899,26 +899,24 @@
 		}
 
 		if (args[1][0] == '/') {
-			struct sockaddr_un *sk = str2sun(args[1]);
+			struct sockaddr_storage *sk = (struct sockaddr_storage *)str2sun(args[1]);
 			if (!sk) {
 				Alert("parsing [%s:%d] : Socket path '%s' too long (max %d)\n", file, linenum,
-				      args[1], (int)sizeof(sk->sun_path) - 1);
+				      args[1], (int)sizeof(((struct sockaddr_un *)&sk)->sun_path) - 1);
 				err_code |= ERR_ALERT | ERR_FATAL;
 				goto out;
 			}
-			logsrv.u.un = *sk;
-			logsrv.u.addr.sa_family = AF_UNIX;
+			logsrv.addr = *sk;
 		} else {
 			struct sockaddr_storage *sk = str2sa(args[1]);
-			if (!sk || sk->ss_family != AF_INET) {
+			if (!sk) {
 				Alert("parsing [%s:%d] : Unknown host in '%s'\n", file, linenum, args[1]);
 				err_code |= ERR_ALERT | ERR_FATAL;
 				goto out;
 			}
-			logsrv.u.in = *(struct sockaddr_in *)sk;
-			logsrv.u.addr.sa_family = AF_INET;
-			if (!logsrv.u.in.sin_port)
-				logsrv.u.in.sin_port = htons(SYSLOG_PORT);
+			logsrv.addr = *sk;
+			if (!get_host_port(&logsrv.addr))
+				set_host_port(&logsrv.addr, SYSLOG_PORT);
 		}
 
 		if (global.logfac1 == -1) {
@@ -4546,28 +4544,24 @@
 			}
 
 			if (args[1][0] == '/') {
-				struct sockaddr_un *sk = str2sun(args[1]);
+				struct sockaddr_storage *sk = (struct sockaddr_storage *)str2sun(args[1]);
 				if (!sk) {
 					Alert("parsing [%s:%d] : Socket path '%s' too long (max %d)\n", file, linenum,
-					      args[1], (int)sizeof(sk->sun_path) - 1);
+					      args[1], (int)sizeof(((struct sockaddr_un *)sk)->sun_path) - 1);
 					err_code |= ERR_ALERT | ERR_FATAL;
 					goto out;
 				}
-				logsrv.u.un = *sk;
-				logsrv.u.addr.sa_family = AF_UNIX;
+				logsrv.addr = *sk;
 			} else {
 				struct sockaddr_storage *sk = str2sa(args[1]);
-				if (!sk || sk->ss_family != AF_INET) {
+				if (!sk) {
 					Alert("parsing [%s:%d] : Unknown host in '%s'\n", file, linenum, args[1]);
 					err_code |= ERR_ALERT | ERR_FATAL;
 					goto out;
 				}
-				logsrv.u.in = *(struct sockaddr_in *)sk;
-				logsrv.u.addr.sa_family = AF_INET;
-				if (!logsrv.u.in.sin_port) {
-					logsrv.u.in.sin_port =
-						htons(SYSLOG_PORT);
-				}
+				logsrv.addr = *sk;
+				if (!get_host_port(&logsrv.addr))
+					set_host_port(&logsrv.addr, SYSLOG_PORT);
 			}
 	    
 			if (curproxy->logfac1 == -1) {
diff --git a/src/log.c b/src/log.c
index f70b38e..eba9adf 100644
--- a/src/log.c
+++ b/src/log.c
@@ -142,22 +142,6 @@
 }
 
 /*
- * Return the length of the address endpoint, suitable for use with sendto().
- */
-static inline int logsrv_addrlen(const struct logsrv *logsrv)
-{
-	switch (logsrv->u.addr.sa_family) {
-	case AF_UNIX:
-		return sizeof(logsrv->u.un);
-	case AF_INET:
-		return sizeof(logsrv->u.in);
-	default:
-		break;
-	}
-	return -1;
-}
-
-/*
  * This function sends a syslog message to both log servers of a proxy,
  * or to global log servers if the proxy is NULL.
  * It also tries not to waste too much time computing the message header.
@@ -253,11 +237,10 @@
 	for (nblogger = 0; nblogger < nbloggers; nblogger++) {
 		const struct logsrv *logsrv = logsrvs[nblogger];
 		int proto, *plogfd;
-		if (logsrv->u.addr.sa_family == AF_UNIX) {
+		if (logsrv->addr.ss_family == AF_UNIX) {
 			proto = 0;
 			plogfd = &logfdunix;
 		} else {
-			/* sa_family == AF_INET */
 			proto = IPPROTO_UDP;
 			plogfd = &logfdinet;
 		}
@@ -265,7 +248,7 @@
 			/* socket already created. */
 			continue;
 		}
-		if ((*plogfd = socket(logsrv->u.addr.sa_family, SOCK_DGRAM,
+		if ((*plogfd = socket(logsrv->addr.ss_family, SOCK_DGRAM,
 				proto)) < 0) {
 			Alert("socket for logger #%d failed: %s (errno=%d)\n",
 				nblogger + 1, strerror(errno), errno);
@@ -280,7 +263,7 @@
 	/* Send log messages to syslog server. */
 	for (nblogger = 0; nblogger < nbloggers; nblogger++) {
 		const struct logsrv *logsrv = logsrvs[nblogger];
-		int *plogfd = logsrv->u.addr.sa_family == AF_UNIX ?
+		int *plogfd = logsrv->addr.ss_family == AF_UNIX ?
 			&logfdunix : &logfdinet;
 		int sent;
 
@@ -306,7 +289,7 @@
 	
 		/* the total syslog message now starts at logptr, for dataptr+data_len-logptr */
 		sent = sendto(*plogfd, log_ptr, dataptr + data_len - log_ptr,
-			MSG_DONTWAIT | MSG_NOSIGNAL, &logsrv->u.addr, logsrv_addrlen(logsrv));
+			MSG_DONTWAIT | MSG_NOSIGNAL, (struct sockaddr *)&logsrv->addr, sizeof(logsrv->addr));
 		if (sent < 0) {
 			Alert("sendto logger #%d failed: %s (errno=%d)\n",
 				nblogger, strerror(errno), errno);