X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Finspircd.cpp;h=b806776c283c65904af143dd078fdce4d3910dc1;hb=c2906e93be35abeea3e652273a7ff1928db8aae3;hp=6f61fbb311d73f27434be1757eb8b13d5781a964;hpb=656e19351668cb5ada005d4e9e7e6d1f787990e2;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/inspircd.cpp b/src/inspircd.cpp index 6f61fbb31..b806776c2 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -114,6 +114,16 @@ const char* FindServerNamePtr(std::string servername) return FindServerNamePtr(servername); } +bool FindServerName(std::string servername) +{ + for (servernamelist::iterator a = servernames.begin(); a < servernames.end(); a++) + { + if (*a == servername) + return true; + } + return false; +} + std::string InspIRCd::GetRevision() { /* w00t got me to replace a bunch of strtok_r @@ -125,6 +135,8 @@ std::string InspIRCd::GetRevision() * into the same variable twice, the first word * is discarded, and the second one returned. */ + + /* XXX - this revision ID is NOT bumping automatically -- w00t */ std::stringstream Revision("$Revision$"); std::string single; Revision >> single >> single; @@ -374,9 +386,9 @@ void InspIRCd::BuildISupport() { // the neatest way to construct the initial 005 numeric, considering the number of configure constants to go in it... std::stringstream v; - v << "WALLCHOPS MODES=" << MAXMODES << " CHANTYPES=# PREFIX=(ohv)@%+ MAP SAFELIST MAXCHANNELS=" << MAXCHANS << " MAXBANS=60 NICKLEN=" << NICKMAX-1; - v << " CASEMAPPING=rfc1459 STATUSMSG=@+ CHARSET=ascii TOPICLEN=" << MAXTOPIC << " KICKLEN=" << MAXKICK << " MAXTARGETS=" << Config->MaxTargets << " AWAYLEN="; - v << MAXAWAY << " CHANMODES=b,k,l,psmnti NETWORK=" << Config->Network; + v << "WALLCHOPS WALLVOICES MODES=" << MAXMODES << " CHANTYPES=# PREFIX=(ohv)@%+ MAP SAFELIST MAXCHANNELS=" << MAXCHANS << " MAXBANS=60 VBANLIST NICKLEN=" << NICKMAX-1; + v << " CASEMAPPING=rfc1459 STATUSMSG=@%+ CHARSET=ascii TOPICLEN=" << MAXTOPIC << " KICKLEN=" << MAXKICK << " MAXTARGETS=" << Config->MaxTargets << " AWAYLEN="; + v << MAXAWAY << " CHANMODES=b,k,l,psmnti FNC NETWORK=" << Config->Network << " MAXPARA=32"; Config->data005 = v.str(); FOREACH_MOD(I_On005Numeric,On005Numeric(Config->data005)); } @@ -480,35 +492,44 @@ bool InspIRCd::LoadModule(const char* filename) snprintf(MODERR,MAXBUF,"Loader/Linker error: %s",factory[MODCOUNT+1]->LastError()); return false; } - if (factory[MODCOUNT+1]->factory) - { - Module* m = factory[MODCOUNT+1]->factory->CreateModule(MyServer); - modules[MODCOUNT+1] = m; - /* save the module and the module's classfactory, if - * this isnt done, random crashes can occur :/ */ - Config->module_names.push_back(filename); - - char* x = &Config->implement_lists[MODCOUNT+1][0]; - for(int t = 0; t < 255; t++) - x[t] = 0; + try + { + if (factory[MODCOUNT+1]->factory) + { + Module* m = factory[MODCOUNT+1]->factory->CreateModule(MyServer); + modules[MODCOUNT+1] = m; + /* save the module and the module's classfactory, if + * this isnt done, random crashes can occur :/ */ + Config->module_names.push_back(filename); + + char* x = &Config->implement_lists[MODCOUNT+1][0]; + for(int t = 0; t < 255; t++) + x[t] = 0; - modules[MODCOUNT+1]->Implements(x); + modules[MODCOUNT+1]->Implements(x); - for(int t = 0; t < 255; t++) - { - Config->global_implementation[t] += Config->implement_lists[MODCOUNT+1][t]; - if (Config->implement_lists[MODCOUNT+1][t]) + for(int t = 0; t < 255; t++) { - log(DEBUG,"Add global implementation: %d %d => %d",MODCOUNT+1,t,Config->global_implementation[t]); + Config->global_implementation[t] += Config->implement_lists[MODCOUNT+1][t]; + if (Config->implement_lists[MODCOUNT+1][t]) + { + log(DEBUG,"Add global implementation: %d %d => %d",MODCOUNT+1,t,Config->global_implementation[t]); + } } - } - } - else - { - log(DEFAULT,"Unable to load %s",modfile); - snprintf(MODERR,MAXBUF,"Factory function failed!"); + } + else + { + log(DEFAULT,"Unable to load %s",modfile); + snprintf(MODERR,MAXBUF,"Factory function failed!"); + return false; + } + } + catch (ModuleException& modexcept) + { + log(DEFAULT,"Unable to load %s: ",modfile,modexcept.GetReason()); + snprintf(MODERR,MAXBUF,"Factory function threw an exception: %s",modexcept.GetReason()); return false; - } + } #ifndef STATIC_LINK } else @@ -616,21 +637,32 @@ int InspIRCd::Run() * timing using this event, so we dont have to * time this exactly). */ - if (((TIME % 8) == 0) && (!expire_run)) + if (((TIME % 5) == 0) && (!expire_run)) { expire_lines(); FOREACH_MOD(I_OnBackgroundTimer,OnBackgroundTimer(TIME)); expire_run = true; continue; } - else if ((TIME % 8) == 1) + else if ((TIME % 5) == 1) { expire_run = false; } /* Once a second, do the background processing */ if (TIME != OLDTIME) + { + if (TIME < OLDTIME) + WriteOpers("*** \002EH?!\002 -- Time is flowing BACKWARDS in this dimension! Clock drifted backwards %d secs.",abs(OLDTIME-TIME)); DoBackgroundUserStuff(TIME); + } + + /* Process timeouts on module sockets each time around + * the loop. There shouldnt be many module sockets, at + * most, 20 or so, so this won't be much of a performance + * hit at all. + */ + DoSocketTimeouts(TIME); /* Call the socket engine to wait on the active * file descriptors. The socket engine has everything's @@ -719,7 +751,14 @@ int InspIRCd::Run() NonBlocking(incomingSockfd); if (Config->GetIOHook(in_port)) { - Config->GetIOHook(in_port)->OnRawSocketAccept(incomingSockfd, (char*)inet_ntoa(client.sin_addr), in_port); + try + { + Config->GetIOHook(in_port)->OnRawSocketAccept(incomingSockfd, (char*)inet_ntoa(client.sin_addr), in_port); + } + catch (ModuleException& modexcept) + { + log(DEBUG,"Module exception cought: %s",modexcept.GetReason()); \ + } } stats->statsAccept++; AddClient(incomingSockfd, in_port, false, client.sin_addr);