]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Make error reporting work properly, it seemed to loose errors.
[user/henk/code/inspircd.git] / src / inspircd.cpp
index 268dfece0d6c771f79c04330f8ffa2d93d253937..670b244415a2d00f747a274598848e4310a56acb 100644 (file)
@@ -286,7 +286,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
 {
        int found_ports = 0;
        FailedPortList pl;
-       int do_nofork = 0, do_debug = 0, do_nolog = 0, do_restart = 0, do_root = 0;    /* flag variables */
+       int do_version = 0, do_nofork = 0, do_debug = 0, do_nolog = 0, do_root = 0;    /* flag variables */
        char c = 0;
 
        modules.resize(255);
@@ -305,7 +305,6 @@ InspIRCd::InspIRCd(int argc, char** argv)
        this->Config->opertypes.clear();
        this->Config->operclass.clear();
        this->SNO = new SnomaskManager(this);
-       this->Start();
        this->TIME = this->OLDTIME = this->startup_time = time(NULL);
        this->time_delta = 0;
        this->next_call = this->TIME + 3;
@@ -321,8 +320,8 @@ InspIRCd::InspIRCd(int argc, char** argv)
                { "config",     required_argument,      NULL,           'c'     },
                { "debug",      no_argument,            &do_debug,      1       },
                { "nolog",      no_argument,            &do_nolog,      1       },
-               { "restart",    no_argument,            &do_restart,    1       },
                { "runasroot",  no_argument,            &do_root,       1       },
+               { "version",    no_argument,            &do_version,    1       },
                { 0, 0, 0, 0 }
        };
 
@@ -345,12 +344,18 @@ InspIRCd::InspIRCd(int argc, char** argv)
                        break;
                        default:
                                /* Unknown parameter! DANGER, INTRUDER.... err.... yeah. */
-                               printf("Usage: %s [--nofork] [--nolog] [--debug] [--logfile <filename>] [--restart]\n", argv[0]);
+                               printf("Usage: %s [--nofork] [--nolog] [--debug] [--logfile <filename>] [--runasroot] [--version] [--config <config>]\n", argv[0]);
                                Exit(EXIT_STATUS_ARGV);
                        break;
                }
        }
 
+       if (do_version)
+       {
+               printf("\n%s r%s\n", VERSION, REVISION);
+               Exit(EXIT_STATUS_NOERROR);
+       }
+
        if (!ServerConfig::FileExists(this->ConfigFileName))
        {
                printf("ERROR: Cannot open config file: %s\nExiting...\n", this->ConfigFileName);
@@ -358,6 +363,8 @@ InspIRCd::InspIRCd(int argc, char** argv)
                Exit(EXIT_STATUS_CONFIG);
        }
 
+       this->Start();
+
        /* Set the finished argument values */
        Config->nofork = do_nofork;
        Config->forcedebug = do_debug;
@@ -456,14 +463,21 @@ InspIRCd::InspIRCd(int argc, char** argv)
                }
        }
 
-       if (!Config->nofork && !do_restart)
+       if (!Config->nofork)
        {
                if (kill(getppid(), SIGTERM) == -1)
                {
                        printf("Error killing parent process: %s\n",strerror(errno));
                        Log(DEFAULT,"Error killing parent process: %s",strerror(errno));
                }
+       }
 
+       if (isatty(0) && isatty(1) && isatty(2))
+       {
+               /* We didn't start from a TTY, we must have started from a background process -
+                * e.g. we are restarting, or being launched by cron. Dont kill parent, and dont
+                * close stdin/stdout
+                */
                fclose(stdin);
                fclose(stderr);
                fclose(stdout);
@@ -479,6 +493,7 @@ std::string InspIRCd::GetVersionString()
 {
        char versiondata[MAXBUF];
        char dnsengine[] = "singlethread-object";
+
        if (*Config->CustomVersion)
        {
                snprintf(versiondata,MAXBUF,"%s %s :%s",VERSION,Config->ServerName,Config->CustomVersion);
@@ -619,7 +634,7 @@ 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 WALLVOICES MODES=" << MAXMODES << " CHANTYPES=# PREFIX=" << this->Modes->BuildPrefixes() << " MAP MAXCHANNELS=" << Config->MaxChans << " MAXBANS=60 VBANLIST NICKLEN=" << NICKMAX-1;
+       v << "WALLCHOPS WALLVOICES MODES=" << MAXMODES-1 << " CHANTYPES=# PREFIX=" << this->Modes->BuildPrefixes() << " MAP MAXCHANNELS=" << Config->MaxChans << " MAXBANS=60 VBANLIST NICKLEN=" << NICKMAX-1;
        v << " CASEMAPPING=rfc1459 STATUSMSG=@%+ CHARSET=ascii TOPICLEN=" << MAXTOPIC << " KICKLEN=" << MAXKICK << " MAXTARGETS=" << Config->MaxTargets << " AWAYLEN=";
        v << MAXAWAY << " CHANMODES=" << this->Modes->ChanModes() << " FNC NETWORK=" << Config->Network << " MAXPARA=32";
        Config->data005 = v.str();
@@ -896,6 +911,14 @@ void InspIRCd::DoOneIteration(bool process_module_sockets)
        /* if any users was quit, take them out */
        GlobalCulls.Apply();
 
+       /* If any inspsockets closed, remove them */
+       for (std::map<InspSocket*,InspSocket*>::iterator x = SocketCull.begin(); x != SocketCull.end(); ++x)
+       {
+               SE->DelFd(x->second);
+               x->second->Close();
+               delete x->second;
+       }
+       SocketCull.clear();
 }
 
 bool InspIRCd::IsIdent(const char* n)
@@ -918,7 +941,6 @@ bool InspIRCd::IsIdent(const char* n)
        return true;
 }
 
-
 int InspIRCd::Run()
 {
        while (true)