+ }
+
+ // Sets handlers for various process signals.
+ void SetSignals()
+ {
+#ifndef _WIN32
+ signal(SIGALRM, SIG_IGN);
+ signal(SIGCHLD, SIG_IGN);
+ signal(SIGHUP, InspIRCd::SetSignal);
+ signal(SIGPIPE, SIG_IGN);
+ signal(SIGUSR1, SIG_IGN);
+ signal(SIGUSR2, SIG_IGN);
+ signal(SIGXFSZ, SIG_IGN);
+#endif
+ 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 * or 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)
+ {
+ exit(EXIT_STATUS_NOERROR);
+ }
+}
+
+void InspIRCd::Cleanup()
+{
+ // Close all listening sockets
+ for (unsigned int i = 0; i < ports.size(); i++)
+ {
+ ports[i]->cull();
+ delete ports[i];
+ }
+ ports.clear();
+
+ // Tell modules that we're shutting down.
+ const std::string quitmsg = "Server shutting down";
+ FOREACH_MOD(OnShutdown, (quitmsg));
+
+ // Disconnect all local users
+ const UserManager::LocalList& list = Users.GetLocalUsers();
+ while (!list.empty())
+ ServerInstance->Users.QuitUser(list.front(), quitmsg);
+
+ GlobalCulls.Apply();
+ Modules->UnloadAll();
+
+ /* Delete objects dynamically allocated in constructor (destructor would be more appropriate, but we're likely exiting) */
+ /* Must be deleted before modes as it decrements modelines */
+ if (FakeClient)
+ {
+ delete FakeClient->server;
+ FakeClient->cull();
+ }
+ stdalgo::delete_zero(this->FakeClient);
+ stdalgo::delete_zero(this->XLines);
+ stdalgo::delete_zero(this->Config);
+ SocketEngine::Deinit();
+ Logs->CloseLogs();