mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-09 18:49:03 -04:00
Extract port binding code to a function and improve output.
This commit is contained in:
parent
a1c127aef6
commit
ce7979bd7d
@ -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 */
|
/** 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"
|
#include "socketengine.h"
|
||||||
|
|
||||||
/** This class handles incoming connections on client ports.
|
/** This class handles incoming connections on client ports.
|
||||||
* It will create a new User for every valid connection
|
* It will create a new User for every valid connection
|
||||||
* and assign it a file descriptor.
|
* and assign it a file descriptor.
|
||||||
|
@ -510,13 +510,12 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid)
|
|||||||
ServerInstance->BindPorts(pl);
|
ServerInstance->BindPorts(pl);
|
||||||
if (pl.size())
|
if (pl.size())
|
||||||
{
|
{
|
||||||
errstr << "Not all your client ports could be bound." << std::endl
|
std::cout << "Warning! Some of your listener" << (pl.size() == 1 ? "s" : "") << " failed to bind:" << std::endl;
|
||||||
<< "The following port(s) failed to bind:" << std::endl;
|
for (FailedPortList::const_iterator iter = pl.begin(); iter != pl.end(); ++iter)
|
||||||
|
|
||||||
int j = 1;
|
|
||||||
for (FailedPortList::iterator i = pl.begin(); i != pl.end(); i++, j++)
|
|
||||||
{
|
{
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -358,6 +358,31 @@ namespace
|
|||||||
signal(SIGTERM, InspIRCd::SetSignal);
|
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.
|
// Required for returning the proper value of EXIT_SUCCESS for the parent process.
|
||||||
void VoidSignalHandler(int)
|
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 is needed as all new XLines are marked pending until ApplyLines() is called
|
||||||
this->XLines->ApplyLines();
|
this->XLines->ApplyLines();
|
||||||
|
|
||||||
FailedPortList pl;
|
|
||||||
size_t bounditems = BindPorts(pl);
|
|
||||||
|
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
|
|
||||||
this->Modules->LoadAll();
|
this->Modules->LoadAll();
|
||||||
@ -539,19 +561,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
|
|||||||
// Build ISupport as ModuleManager::LoadAll() does not do it
|
// Build ISupport as ModuleManager::LoadAll() does not do it
|
||||||
this->ISupport.Build();
|
this->ISupport.Build();
|
||||||
|
|
||||||
if (!pl.empty())
|
TryBindPorts();
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << "InspIRCd is now running as '" << Config->ServerName << "'[" << Config->GetSID() << "] with " << SocketEngine::GetMaxFds() << " max open sockets" << std::endl;
|
std::cout << "InspIRCd is now running as '" << Config->ServerName << "'[" << Config->GetSID() << "] with " << SocketEngine::GetMaxFds() << " max open sockets" << std::endl;
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ size_t InspIRCd::BindPorts(FailedPortList& failed_ports)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!BindPort(tag, bindspec, old_ports))
|
if (!BindPort(tag, bindspec, old_ports))
|
||||||
failed_ports.push_back(std::make_pair(bindspec, errno));
|
failed_ports.push_back(FailedPort(errno, bindspec, tag));
|
||||||
else
|
else
|
||||||
bound++;
|
bound++;
|
||||||
}
|
}
|
||||||
@ -120,7 +120,7 @@ size_t InspIRCd::BindPorts(FailedPortList& failed_ports)
|
|||||||
|
|
||||||
irc::sockets::untosa(fullpath, bindspec);
|
irc::sockets::untosa(fullpath, bindspec);
|
||||||
if (!BindPort(tag, bindspec, old_ports))
|
if (!BindPort(tag, bindspec, old_ports))
|
||||||
failed_ports.push_back(std::make_pair(bindspec, errno));
|
failed_ports.push_back(FailedPort(errno, bindspec, tag));
|
||||||
else
|
else
|
||||||
bound++;
|
bound++;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user