--- MCCTCP.cpp.orig	2008-02-13 10:24:35.000000000 +0100
+++ MCCTCP.cpp	2008-02-13 18:51:30.000000000 +0100
@@ -39,6 +39,7 @@
 #include <sys/socket.h>
 #include <arpa/inet.h>
 #include <netinet/in.h>
+#include <netdb.h>
 #include <errno.h>
 #define ErrNo errno
 #endif
@@ -84,33 +85,73 @@
         return;
     }
 #endif
+    /* IPv6  compatibility functions */
+    struct addrinfo gaihints, *gaires;
+    int gaierror;
+    char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
+
     for(int i = 0;;++i) {
         XMLNode l = (*cfg)["Listen"][i];
         if(!l) break;
         std::string port_s = l["Port"];
-        if(port_s.empty()) {
-            logger.msg(Arc::WARNING, "Missing Port in Listen element");
+        std::string port6_s = l["Port6"];
+        if(port_s.empty() && port6_s.empty()) {
+            logger.msg(Arc::WARNING, "Missing Port or Port6 in Listen element");
+            continue;
+        };
+
+        /* address independent handling of listeining sockets*/
+        memset(&gaihints, 0, sizeof(gaihints));
+	gaihints.ai_socktype = SOCK_STREAM;
+	gaihints.ai_flags = AI_PASSIVE;
+	if (port6_s.empty()) { /* no port6 */
+		gaihints.ai_family = AF_INET;
+		strlcpy(sbuf,port_s.c_str(),NI_MAXSERV);
+	} else { /* port6 */
+		gaihints.ai_family = AF_INET6;
+		strlcpy(sbuf,port6_s.c_str(),NI_MAXSERV);
+	}
+
+	/* we are making assumption that getaddrinfo() return only */
+        /* one server socket per address famility */
+	gaierror = getaddrinfo (NULL, sbuf, &gaihints, &gaires);
+	if (gaierror) {
+	    logger.msg(Arc::WARNING, "Failed to call getaddrinfo ");
             continue;
         };
-        int port = atoi(port_s.c_str());
-        int s = ::socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
+		
+
+        int s = ::socket(gaires->ai_family,gaires->ai_socktype,gaires->ai_protocol);
         if(s == -1) {
 	    logger.msg(Arc::WARNING, "Failed to create socket");
             continue;
         };
-        struct sockaddr_in myaddr;
-        memset(&myaddr,0,sizeof(myaddr));
-        myaddr.sin_family=AF_INET;
-        myaddr.sin_port=htons(port);
-        myaddr.sin_addr.s_addr=INADDR_ANY;
-        if(bind(s,(struct sockaddr *)&myaddr,sizeof(myaddr)) == -1) {
+/* handle IPv6 wildcard sockets properly */
+#ifdef IPV6_V6ONLY
+	const int on = 1;
+        if (gaires->ai_family == AF_INET6 &&
+                    setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &on,
+                    sizeof(on)) < 0) {
+	    		logger.msg(Arc::WARNING, "Failed to set IPv6 only the socket");
+                        continue;
+                }
+#endif
+	/* bind the necessary passive socket */
+
+        if(bind(s,gaires->ai_addr,gaires->ai_addrlen) == -1) {
 	    logger.msg(Arc::WARNING, "Failed to bind socket");
             continue;
         };
+	getnameinfo(gaires->ai_addr, gaires->ai_addrlen, hbuf,
+                    sizeof(hbuf), sbuf, sizeof(sbuf),
+                    NI_NUMERICHOST | NI_NUMERICSERV);
+	logger.msg(Arc::INFO, "Trying to listening %s port %s\n", hbuf, sbuf);
+
         if(::listen(s,-1) == -1) {
 	    logger.msg(Arc::WARNING, "Failed to listen on socket");
             continue;
         };
+	freeaddrinfo(gaires);
         handles_.push_back(s);
     };
     if(handles_.size() == 0) {
