--- /dev/null
+--- common/network/TcpSocket.cxx.orig 2010-02-12 03:19:32.000000000 -0600
++++ common/network/TcpSocket.cxx 2011-04-11 10:58:52.000000000 -0500
+@@ -339,9 +339,38 @@
+ return;
+ }
+
++ bool use_ipv6;
++ int af;
++#ifdef AF_INET6
++ // - localhostOnly will mean "127.0.0.1 only", no IPv6
++ if (use_ipv6 = !localhostOnly)
++ af = AF_INET6;
++ else
++ af = AF_INET;
++#else
++ use_ipv6 = false;
++ af = AF_INET;
++#endif
++
+ initSockets();
+- if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+- throw SocketException("unable to create listening socket", errorNumber);
++ if ((fd = socket(af, SOCK_STREAM, 0)) < 0) {
++ // - Socket creation failed
++ if (use_ipv6) {
++ // - We were trying to make an IPv6-capable socket - try again, but IPv4-only
++ use_ipv6 = false;
++ af = AF_INET;
++ fd = socket(af, SOCK_STREAM, 0);
++ }
++ if (fd < 0)
++ throw SocketException("unable to create listening socket", errorNumber);
++ } else {
++ // - Socket creation succeeded
++ if (use_ipv6) {
++ // - We made an IPv6-capable socket, and we need it to do IPv4 too
++ int opt = 0;
++ setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &opt, sizeof(opt));
++ }
++ }
+
+ #ifndef WIN32
+ // - By default, close the socket on exec()
+@@ -358,27 +387,39 @@
+
+ // - Bind it to the desired port
+ struct sockaddr_in addr;
+- memset(&addr, 0, sizeof(addr));
+- addr.sin_family = AF_INET;
+-
+- if (localhostOnly) {
+- addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+- } else if (listenaddr != NULL) {
++ struct sockaddr_in6 addr6;
++ struct sockaddr *sa;
++ int sa_len;
++
++ if (use_ipv6) {
++ sa_len = sizeof(addr6);
++ memset(&addr6, 0, sa_len);
++ addr6.sin6_family = af;
++ addr6.sin6_port = htons(port);
++ sa = (struct sockaddr*) &addr6;
++ } else {
++ sa_len = sizeof(addr);
++ memset(&addr, 0, sa_len);
++ addr.sin_family = af;
++ addr.sin_port = htons(port);
++ if (localhostOnly)
++ addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
++ else if (listenaddr != NULL) {
+ #ifdef HAVE_INET_ATON
+- if (inet_aton(listenaddr, &addr.sin_addr) == 0)
++ if (inet_aton(listenaddr, &addr.sin_addr) == 0)
+ #else
+- /* Some systems (e.g. Windows) do not have inet_aton, sigh */
+- if ((addr.sin_addr.s_addr = inet_addr(listenaddr)) == INADDR_NONE)
++ /* Some systems (e.g. Windows) do not have inet_aton, sigh */
++ if ((addr.sin_addr.s_addr = inet_addr(listenaddr)) == INADDR_NONE)
+ #endif
+- {
+- closesocket(fd);
+- throw Exception("invalid network interface address: %s", listenaddr);
+- }
+- } else
+- addr.sin_addr.s_addr = htonl(INADDR_ANY); /* Bind to 0.0.0.0 by default. */
+-
+- addr.sin_port = htons(port);
+- if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
++ {
++ closesocket(fd);
++ throw Exception("invalid network interface address: %s", listenaddr);
++ }
++ } else
++ addr.sin_addr.s_addr = htonl(INADDR_ANY); /* Bind to 0.0.0.0 by default. */
++ sa = (struct sockaddr*) &addr;
++ }
++ if (bind(fd, sa, sa_len) < 0) {
+ int e = errorNumber;
+ closesocket(fd);
+ throw SocketException("unable to bind listening socket", e);