]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
core_dns: allow configuring source address
authorAdam <Adam@anope.org>
Mon, 28 Mar 2016 00:25:16 +0000 (20:25 -0400)
committerAttila Molnar <attilamolnar@hush.com>
Tue, 29 Mar 2016 13:48:18 +0000 (15:48 +0200)
src/coremods/core_dns.cpp

index 1e8bb753389272725e5aa5bd80c4c0dd615beca9..1e7f6afca9325fb66681299966db5fe1057aa49d 100644 (file)
@@ -658,7 +658,7 @@ class MyManager : public Manager, public Timer, public EventHandler
                return true;
        }
 
-       void Rehash(const std::string& dnsserver)
+       void Rehash(const std::string& dnsserver, std::string sourceaddr, unsigned int sourceport)
        {
                if (this->GetFd() > -1)
                {
@@ -682,8 +682,15 @@ class MyManager : public Manager, public Timer, public EventHandler
                        SocketEngine::NonBlocking(s);
 
                        irc::sockets::sockaddrs bindto;
-                       memset(&bindto, 0, sizeof(bindto));
-                       bindto.sa.sa_family = myserver.sa.sa_family;
+                       if (sourceaddr.empty())
+                       {
+                               // set a sourceaddr for irc::sockets::aptosa() based on the servers af type
+                               if (myserver.sa.sa_family == AF_INET)
+                                       sourceaddr = "0.0.0.0";
+                               else if (myserver.sa.sa_family == AF_INET6)
+                                       sourceaddr = "::";
+                       }
+                       irc::sockets::aptosa(sourceaddr, sourceport, bindto);
 
                        if (SocketEngine::Bind(this->GetFd(), bindto) < 0)
                        {
@@ -698,6 +705,9 @@ class MyManager : public Manager, public Timer, public EventHandler
                                SocketEngine::Close(this->GetFd());
                                this->SetFd(-1);
                        }
+
+                       if (bindto.sa.sa_family != myserver.sa.sa_family)
+                               ServerInstance->Logs->Log(MODNAME, LOG_SPARSE, "Nameserver address family differs from source address family - hostnames might not resolve");
                }
                else
                {
@@ -710,6 +720,8 @@ class ModuleDNS : public Module
 {
        MyManager manager;
        std::string DNSServer;
+       std::string SourceIP;
+       unsigned int SourcePort;
 
        void FindDNSServer()
        {
@@ -770,19 +782,27 @@ class ModuleDNS : public Module
        }
 
  public:
-       ModuleDNS() : manager(this)
+       ModuleDNS() : manager(this)
+               , SourcePort(0)
        {
        }
 
        void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
        {
                std::string oldserver = DNSServer;
-               DNSServer = ServerInstance->Config->ConfValue("dns")->getString("server");
+               const std::string oldip = SourceIP;
+               const unsigned int oldport = SourcePort;
+
+               ConfigTag* tag = ServerInstance->Config->ConfValue("dns");
+               DNSServer = tag->getString("server");
+               SourceIP = tag->getString("sourceip");
+               SourcePort = tag->getInt("sourceport", 0, 0, 65535);
+
                if (DNSServer.empty())
                        FindDNSServer();
 
-               if (oldserver != DNSServer)
-                       this->manager.Rehash(DNSServer);
+               if (oldserver != DNSServer || oldip != SourceIP || oldport != SourcePort)
+                       this->manager.Rehash(DNSServer, SourceIP, SourcePort);
        }
 
        void OnUnloadModule(Module* mod)