}
// Attempts to fork into the background.
- bool ForkIntoBackground()
+ void ForkIntoBackground()
{
#ifndef _WIN32
// We use VoidSignalHandler whilst forking to avoid breaking daemon scripts
if (childpid < 0)
{
ServerInstance->Logs->Log("STARTUP", LOG_DEFAULT, "fork() failed: %s", strerror(errno));
- return false;
+ std::cout << con_red << "Error:" << con_reset << " unable to fork into background: " << strerror(errno);
+ ServerInstance->Exit(EXIT_STATUS_FORK);
}
else if (childpid > 0)
{
SocketEngine::RecoverFromFork();
}
#endif
- return true;
}
// Increase the size of a core dump file to improve debugging problems.
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)
{
SetSignals();
if (!Config->cmdline.runasroot)
CheckRoot();
-
- if (!Config->cmdline.nofork && !ForkIntoBackground())
- {
- std::cout << "ERROR: could not go into daemon mode. Shutting down." << std::endl;
- Logs->Log("STARTUP", LOG_DEFAULT, "ERROR: could not go into daemon mode. Shutting down.");
- Exit(EXIT_STATUS_FORK);
- }
+ if (!Config->cmdline.nofork)
+ ForkIntoBackground();
std::cout << "InspIRCd Process ID: " << con_green << getpid() << con_reset << std::endl;
// This is needed as all new XLines are marked pending until ApplyLines() is called
this->XLines->ApplyLines();
- FailedPortList pl;
- int bounditems = BindPorts(pl);
-
std::cout << std::endl;
+ TryBindPorts();
+
this->Modules->LoadAll();
// 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 + (int)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;
#ifndef _WIN32