prelude-lml/master: The Prelude-LML UDP server is now fully IPV6 compatible

[email protected] Thu, 16 Jul 2009 15:42:29 +0200 (CEST)
Newsgroups gmane.comp.security.ids.prelude.cvs
Message-ID <[email protected]>
commit dbe81397cfaef323f44dcbe92d8c8c2f980b3d1b
Author: Yoann Vandoorselaere <[email protected]>
Date:   Mon Jul 13 16:46:02 2009 +0200

    The Prelude-LML UDP server is now fully IPV6 compatible


========================================

 src/udp-server.c |   25 +++++++++++++++++++------
 1 files changed, 19 insertions(+), 6 deletions(-)

========================================

diff --git a/src/udp-server.c b/src/udp-server.c
index d3a251d..fba5d2c 100644
--- a/src/udp-server.c
+++ b/src/udp-server.c
@@ -93,13 +93,22 @@ void udp_server_process_event(udp_server_t *server)
 {
         ssize_t ret;
         socklen_t len;
-        char src[512];
-        struct sockaddr_in addr;
-        char buf[SYSLOG_MSG_MAX_SIZE], *ptr = NULL;
+        void *in_addr;
+        union {
+                struct sockaddr sa;
+                struct sockaddr_in sa4;
+#ifdef HAVE_IPV6
+                struct sockaddr_in6 sa6;
+# define SOCKADDR_PORT_MEMBER(x) (x.sa6.sin6_port)
+#else
+# define SOCKADDR_PORT_MEMBER(x) (x.sa4.sin_port)
+#endif
+        } addr;
+        char buf[SYSLOG_MSG_MAX_SIZE], *ptr = NULL, src[512];
 
-        len = sizeof(struct sockaddr);
+        len = sizeof(addr);
 
-        ret = recvfrom(server->sockfd, buf, sizeof(buf) - 1, 0, (struct sockaddr *) &addr, &len);
+        ret = recvfrom(server->sockfd, buf, sizeof(buf) - 1, 0, &addr.sa, &len);
         if ( ret < 0 ) {
                 prelude_log(PRELUDE_LOG_ERR, "error receiving syslog message.\n");
                 return;
@@ -110,7 +119,11 @@ void udp_server_process_event(udp_server_t *server)
 
         buf[ret] = '\0';
 
-        snprintf(src, sizeof(src), "%s:%d", inet_ntoa(addr.sin_addr), addr.sin_port);
+        in_addr = prelude_sockaddr_get_inaddr(&addr.sa);
+        prelude_return_if_fail(in_addr);
+        prelude_return_if_fail(inet_ntop(addr.sa.sa_family, in_addr, src, sizeof(src)));
+
+        snprintf(src + strlen(src), sizeof(src) - strlen(src), ":%d", SOCKADDR_PORT_MEMBER(addr));
         lml_log_source_set_name(server->ls, src);
 
         /*
_______________________________________________
Prelude-cvslog site list
[email protected]
http://lists.prelude-ids.org/mailman/listinfo/prelude-cvslog