Improve support for IPv4 vs IPv6 virtual hosts (fixes SF bugs #1087699, #1087668).
[ircu2.10.12-pk.git] / ircd / s_bsd.c
index 6a3d9e4619a27afd93b1e71649d1a879091c9b6c..ead38dfb887866e08b27ab5f5e1391b224f8e530 100644 (file)
@@ -58,8 +58,7 @@
 #include "uping.h"
 #include "version.h"
 
-#include <arpa/inet.h>
-#include <assert.h>
+/* #include <assert.h> -- Now using assert in ircd_log.h */
 #include <errno.h>
 #include <fcntl.h>
 #include <netdb.h>
 struct Client*            LocalClientArray[MAXCONNECTIONS];
 /** Maximum file descriptor in current use. */
 int                       HighestFd = -1;
-/** Default local address for outbound connections. */
-struct irc_sockaddr       VirtualHost;
+/** Default local address for outbound IPv4 connections. */
+struct irc_sockaddr       VirtualHost_v4;
+/** Default local address for outbound IPv6 connections. */
+struct irc_sockaddr       VirtualHost_v6;
 /** Temporary buffer for reading data from a peer. */
 static char               readbuf[SERVER_TCP_WINDOW];
 
@@ -235,8 +236,10 @@ static int connect_inet(struct ConfItem* aconf, struct Client* cptr)
    */
   if (irc_in_addr_valid(&aconf->origin.addr))
     local = &aconf->origin;
+  else if (irc_in_addr_is_ipv4(&aconf->address.addr))
+    local = &VirtualHost_v4;
   else
-    local = &VirtualHost;
+    local = &VirtualHost_v6;
   cli_fd(cptr) = os_socket(local, SOCK_STREAM, cli_name(cptr));
   if (cli_fd(cptr) < 0)
     return 0;
@@ -384,7 +387,7 @@ static int completed_connection(struct Client* cptr)
   cli_lasttime(cptr) = CurrentTime;
   SetFlag(cptr, FLAG_PINGSENT);
 
-  sendrawto_one(cptr, MSG_SERVER " %s 1 %Tu %Tu J%s %s%s +%s :%s",
+  sendrawto_one(cptr, MSG_SERVER " %s 1 %Tu %Tu J%s %s%s +%s6 :%s",
                 cli_name(&me), cli_serv(&me)->timestamp, newts,
                MAJOR_PROTOCOL, NumServCap(&me),
                feature_bool(FEAT_HUB) ? "h" : "", cli_info(&me));