]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Extract port binding code to a function and improve output.
authorPeter Powell <petpow@saberuk.com>
Wed, 11 Dec 2019 12:31:21 +0000 (12:31 +0000)
committerPeter Powell <petpow@saberuk.com>
Thu, 12 Dec 2019 14:37:38 +0000 (14:37 +0000)
include/socket.h
src/configreader.cpp
src/inspircd.cpp
src/socket.cpp

index 6ecb230206d07ef4df369ff72777e84a2431613f..36f020b2523c58e76d3ac1688b20f0247d2ab2c9 100644 (file)
@@ -136,10 +136,32 @@ namespace irc
        }
 }
 
+/** Represents information about a failed port binding. */
+struct CoreExport FailedPort
+{
+       
+       /** The error which happened during binding. */
+       int error;
+
+       /** The endpoint on which we were attempting to bind. */
+       irc::sockets::sockaddrs sa;
+
+       /** The config tag that the listener was created from. */
+       ConfigTag* tag;
+
+       FailedPort(int err, irc::sockets::sockaddrs& ep, ConfigTag* cfg)
+               : error(err)
+               , sa(ep)
+               , tag(cfg)
+       {
+       }
+};
+
 /** A list of failed port bindings, used for informational purposes on startup */
-typedef std::vector<std::pair<irc::sockets::sockaddrs, int> > FailedPortList;
+typedef std::vector<FailedPort> FailedPortList;
 
 #include "socketengine.h"
+
 /** This class handles incoming connections on client ports.
  * It will create a new User for every valid connection
  * and assign it a file descriptor.
index 2a1da8fd8fbb23dac1c699c39a8d3968f5a64692..0f2063a6088521c7fe2a0fa6843bd886daea651b 100644 (file)
@@ -510,13 +510,12 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid)
                ServerInstance->BindPorts(pl);
                if (pl.size())
                {
-                       errstr << "Not all your client ports could be bound." << std::endl
-                               << "The following port(s) failed to bind:" << std::endl;
-
-                       int j = 1;
-                       for (FailedPortList::iterator i = pl.begin(); i != pl.end(); i++, j++)
+                       std::cout << "Warning! Some of your listener" << (pl.size() == 1 ? "s" : "") << " failed to bind:" << std::endl;
+                       for (FailedPortList::const_iterator iter = pl.begin(); iter != pl.end(); ++iter)
                        {
-                               errstr << j << ".\tAddress: " << i->first.str() << "\tReason: " << strerror(i->second) << std::endl;
+                               const FailedPort& fp = *iter;
+                               errstr << "  " << fp.sa.str() << ": " << strerror(fp.error) << std::endl
+                                       << "  " << "Created from <bind> tag at " << fp.tag->getTagLocation() << std::endl;
                        }
                }
        }
index 384f783aa0e1eb0f116739ce928e317ea1d0e53f..2035960bd5bda1e6573df873590bb6762cbc5132 100644 (file)
@@ -358,6 +358,31 @@ namespace
                signal(SIGTERM, InspIRCd::SetSignal);
        }
 
+       void TryBindPorts()
+       {
+               FailedPortList pl;
+               ServerInstance->BindPorts(pl);
+
+               if (!pl.empty())
+               {
+                       std::cout << con_red << "Warning!" << con_reset << " Some of your listener" << (pl.size() == 1 ? "s" : "") << " failed to bind:" << std::endl
+                               << std::endl;
+
+                       for (FailedPortList::const_iterator iter = pl.begin(); iter != pl.end(); ++iter)
+                       {
+                               const FailedPort& fp = *iter;
+                               std::cout << "  " << con_bright << fp.sa.str() << con_reset << ": " << strerror(fp.error) << '.' << std::endl
+                                       << "  " << "Created from <bind> tag at " << fp.tag->getTagLocation() << std::endl
+                                       << std::endl;
+                       }
+
+                       std::cout << con_bright << "Hints:" << con_reset << std::endl
+                               << "- For TCP/IP listeners try using a public IP address in <bind:address> instead" << std::endl
+                               << "  of * of leaving it blank." << std::endl
+                               << "- For UNIX socket listeners try enabling <bind:rewrite> to replace old sockets." << std::endl;
+               }
+       }
+
        // Required for returning the proper value of EXIT_SUCCESS for the parent process.
        void VoidSignalHandler(int)
        {
@@ -529,9 +554,6 @@ InspIRCd::InspIRCd(int argc, char** argv)
        // This is needed as all new XLines are marked pending until ApplyLines() is called
        this->XLines->ApplyLines();
 
-       FailedPortList pl;
-       size_t bounditems = BindPorts(pl);
-
        std::cout << std::endl;
 
        this->Modules->LoadAll();
@@ -539,19 +561,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
        // Build ISupport as ModuleManager::LoadAll() does not do it
        this->ISupport.Build();
 
-       if (!pl.empty())
-       {
-               std::cout << std::endl << "WARNING: Not all your client ports could be bound -- " << std::endl << "starting anyway with " << bounditems
-                       << " of " << (bounditems + pl.size()) << " client ports bound." << std::endl << std::endl;
-               std::cout << "The following port(s) failed to bind:" << std::endl << std::endl;
-               int j = 1;
-               for (FailedPortList::iterator i = pl.begin(); i != pl.end(); i++, j++)
-               {
-                       std::cout << j << ".\tAddress: " << i->first.str() << " \tReason: " << strerror(i->second) << std::endl;
-               }
-
-               std::cout << std::endl << "Hint: Try using a public IP instead of blank or *" << std::endl;
-       }
+       TryBindPorts();
 
        std::cout << "InspIRCd is now running as '" << Config->ServerName << "'[" << Config->GetSID() << "] with " << SocketEngine::GetMaxFds() << " max open sockets" << std::endl;
 
index 736e094865d35cdb36d6a299eeb4d4f674e91492..64dc7ef256c4c152a3afcf59c46949388d83ee53 100644 (file)
@@ -86,7 +86,7 @@ size_t InspIRCd::BindPorts(FailedPortList& failed_ports)
                                        continue;
 
                                if (!BindPort(tag, bindspec, old_ports))
-                                       failed_ports.push_back(std::make_pair(bindspec, errno));
+                                       failed_ports.push_back(FailedPort(errno, bindspec, tag));
                                else
                                        bound++;
                        }
@@ -120,7 +120,7 @@ size_t InspIRCd::BindPorts(FailedPortList& failed_ports)
 
                        irc::sockets::untosa(fullpath, bindspec);
                        if (!BindPort(tag, bindspec, old_ports))
-                               failed_ports.push_back(std::make_pair(bindspec, errno));
+                               failed_ports.push_back(FailedPort(errno, bindspec, tag));
                        else
                                bound++;
                }