#include <sys/ioctl.h>
#include <time.h>
#include <string>
+#include <exception>
+#include <stdexcept>
+#include <new>
#ifdef GCC3
#include <ext/hash_map>
#else
extern int MODCOUNT;
extern char LOG_FILE[MAXBUF];
-int openSockfd[MAXSOCKS];
+int openSockfd[MAX_DESCRIPTORS];
int yield_depth;
int iterations = 0;
sockaddr_in client,server;
if (argc > 1) {
for (int i = 1; i < argc; i++)
{
- if (!strcmp(argv[i],"-nofork")) {
+ if (!strcmp(argv[i],"-nofork"))
+ {
Config->nofork = true;
}
- if (!strcmp(argv[i],"-wait")) {
+ if (!strcmp(argv[i],"-wait"))
+ {
sleep(6);
}
- if (!strcmp(argv[i],"-nolimit")) {
- Config->unlimitcore = true;
+ if (!strcmp(argv[i],"-nolimit"))
+ {
+ printf("WARNING: The `-nolimit' option is deprecated, and now on by default. This behaviour may change in the future.\n");
}
- if (!strcmp(argv[i],"-logfile")) {
+ if (!strcmp(argv[i],"-logfile"))
+ {
if (argc > i+1)
{
strlcpy(LOG_FILE,argv[i+1],MAXBUF);
this->MakeLowerMap();
OpenLog(argv, argc);
+ this->stats = new serverstats();
Config->ClearStack();
Config->Read(true,NULL);
CheckRoot();
this->ModeGrok = new ModeParser();
this->Parser = new CommandParser();
- this->stats = new serverstats();
AddServerName(Config->ServerName);
CheckDie();
- stats->BoundPortCount = BindPorts();
+ stats->BoundPortCount = BindPorts(true);
for(int t = 0; t < 255; t++)
Config->global_implementation[t] = 0;
SetSignals();
if (!Config->nofork)
{
- if (DaemonSeed() == ERROR)
+ if (!DaemonSeed())
{
printf("ERROR: could not go into daemon mode. Shutting down.\n");
Exit(ERROR);
sockaddr_in sock_us; // our port number
socklen_t uslen; // length of our port number
- if (yield_depth > 3)
+ if (yield_depth > 100)
return;
yield_depth++;
* listening ports or module sockets though, things could get
* ugly.
*/
+ log(DEBUG,"There are %d fd's to process.",numberactive);
+
for (unsigned int activefd = 0; activefd < numberactive; activefd++)
{
int socket_type = SE->GetType(activefds[activefd]);
{
case X_ESTAB_CLIENT:
+ log(DEBUG,"Type: X_ESTAB_CLIENT: fd=%d",activefds[activefd]);
cu = fd_ref_table[activefds[activefd]];
if (cu)
ProcessUser(cu);
case X_ESTAB_MODULE:
+ log(DEBUG,"Type: X_ESTAB_MODULE: fd=%d",activefds[activefd]);
+
if (!process_module_sockets)
break;
if ((s) && (!s->Poll()))
{
- log(DEBUG,"Socket poll returned false, close and bail");
+ log(DEBUG,"inspircd.cpp: Socket poll returned false, close and bail");
SE->DelFd(s->GetFd());
socket_ref[activefds[activefd]] = NULL;
for (std::vector<InspSocket*>::iterator a = module_sockets.begin(); a < module_sockets.end(); a++)
s->Close();
delete s;
}
+ else if (!s)
+ {
+ log(DEBUG,"WTF, X_ESTAB_MODULE for nonexistent InspSocket, removed!");
+ SE->DelFd(s->GetFd());
+ }
break;
case X_ESTAB_DNS:
* and independent of the mainloop.
*/
#ifndef THREADED_DNS
+ log(DEBUG,"Type: X_ESTAB_DNS: fd=%d",activefds[activefd]);
dns_poll(activefds[activefd]);
#endif
break;
case X_LISTEN:
+ log(DEBUG,"Type: X_LISTEN_MODULE: fd=%d",activefds[activefd]);
+
/* It's a listener */
uslen = sizeof(sock_us);
length = sizeof(client);
* what we would do, so for now, its going
* to safely do bugger all.
*/
+ log(DEBUG,"Type: X_WHAT_THE_FUCK_BBQ: fd=%d",activefds[activefd]);
SE->DelFd(activefds[activefd]);
break;
}
LoadAllModules(this);
+ /* Just in case no modules were loaded - fix for bug #101 */
+ this->BuildISupport();
+
printf("\nInspIRCd is now running!\n");
if (!Config->nofork)
int main(int argc, char** argv)
{
- ServerInstance = new InspIRCd(argc, argv);
- ServerInstance->Run();
- delete ServerInstance;
- return 0;
+ try
+ {
+ ServerInstance = new InspIRCd(argc, argv);
+ ServerInstance->Run();
+ delete ServerInstance;
+ }
+ catch (std::bad_alloc)
+ {
+ log(DEFAULT,"You are out of memory! (got exception std::bad_alloc!)");
+ send_error("**** OUT OF MEMORY **** We're gonna need a bigger boat!");
+ printf("Out of memory! (got exception std::bad_alloc!");
+ }
+ return 0;
}