]> 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 7390661dd119e17cc51a040089b0750a50acb544..670b244415a2d00f747a274598848e4310a56acb 100644 (file)
@@ -126,25 +126,7 @@ void InspIRCd::Restart(const std::string &reason)
        /* Figure out our filename (if theyve renamed it, we're boned) */
        std::string me = Config->MyDir + "/inspircd";
 
-       char* argv[10];
-       int endp = 2;
-       argv[0] = Config->argv[0];
-       argv[1] = "--restart";
-       if (Config->forcedebug)
-               argv[endp++] = "--debug";
-       if (Config->nofork)
-               argv[endp++] = "--nofork";
-       if (!Config->writelog)
-               argv[endp++] = "--nolog";
-       if (*this->LogFileName)
-       {
-               argv[endp++] = "--logfile";
-               argv[endp++] = this->LogFileName;
-       }
-
-       argv[endp] = NULL;
-
-       if (execv(me.c_str(), argv) == -1)
+       if (execv(me.c_str(), Config->argv) == -1)
        {
                /* Will raise a SIGABRT if not trapped */
                throw CoreException(std::string("Failed to execv()! error: ") + strerror(errno));
@@ -227,6 +209,8 @@ void InspIRCd::QuickExit(int status)
 
 bool InspIRCd::DaemonSeed()
 {
+       signal(SIGTERM, InspIRCd::QuickExit);
+
        int childpid;
        if ((childpid = fork ()) < 0)
                return false;
@@ -239,7 +223,6 @@ bool InspIRCd::DaemonSeed()
                 * if the child pid is still around. If theyre not,
                 * they threw an error and we should give up.
                 */
-               signal(SIGTERM, InspIRCd::QuickExit);
                while (kill(childpid, 0) != -1)
                        sleep(1);
                exit(0);
@@ -248,6 +231,8 @@ bool InspIRCd::DaemonSeed()
        umask (007);
        printf("InspIRCd Process ID: \033[1;32m%lu\033[0m\n",(unsigned long)getpid());
 
+       signal(SIGTERM, InspIRCd::Exit);
+
        rlimit rl;
        if (getrlimit(RLIMIT_CORE, &rl) == -1)
        {
@@ -301,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;    /* 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);
@@ -320,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;
@@ -336,7 +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 }
        };
 
@@ -359,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);
@@ -372,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;
@@ -386,7 +379,22 @@ InspIRCd::InspIRCd(int argc, char** argv)
        this->XLines = new XLineManager(this);
        Config->ClearStack();
        Config->Read(true, NULL);
-       this->CheckRoot();
+
+       if (!do_root)
+               this->CheckRoot();
+       else
+       {
+               printf("* WARNING * WARNING * WARNING * WARNING * WARNING * \n\n");
+               printf("YOU ARE RUNNING INSPIRCD AS ROOT. THIS IS UNSUPPORTED\n");
+               printf("AND IF YOU ARE HACKED, CRACKED, SPINDLED OR MUTILATED\n");
+               printf("OR ANYTHING ELSE UNEXPECTED HAPPENS TO YOU OR YOUR\n");
+               printf("SERVER, THEN IT IS YOUR OWN FAULT. IF YOU DID NOT MEAN\n");
+               printf("TO START INSPIRCD AS ROOT, HIT CTRL+C NOW AND RESTART\n");
+               printf("THE PROGRAM AS A NORMAL USER. YOU HAVE BEEN WARNED!\n");
+               printf("\nInspIRCd starting in 20 seconds, ctrl+c to abort...\n");
+               sleep(20);
+       }
+
        this->Modes = new ModeParser(this);
        this->AddServerName(Config->ServerName);
        CheckDie();
@@ -455,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);
@@ -478,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);
@@ -618,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();
@@ -800,7 +816,7 @@ bool InspIRCd::LoadModule(const char* filename)
                }
                catch (CoreException& modexcept)
                {
-                       this->Log(DEFAULT,"Unable to load %s: ",modfile,modexcept.GetReason());
+                       this->Log(DEFAULT,"Unable to load %s: %s",modfile,modexcept.GetReason());
                        snprintf(MODERR,MAXBUF,"Factory function of %s threw an exception: %s", modexcept.GetSource(), modexcept.GetReason());
                        return false;
                }
@@ -895,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)
@@ -917,7 +941,6 @@ bool InspIRCd::IsIdent(const char* n)
        return true;
 }
 
-
 int InspIRCd::Run()
 {
        while (true)