]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Checking if child pid still exists, if it vanishes we exit
[user/henk/code/inspircd.git] / src / inspircd.cpp
index 3fddb2d8b47fdde47185968738302227840a6f2f..e8e93bcc52fbe169e4e79cbb0fa498f828acc356 100644 (file)
@@ -107,10 +107,11 @@ void InspIRCd::Rehash(int status)
 
 void InspIRCd::SetSignals(bool SEGVHandler)
 {
-       signal (SIGALRM, SIG_IGN);
-       signal (SIGHUP, InspIRCd::Rehash);
-       signal (SIGPIPE, SIG_IGN);
-       signal (SIGTERM, InspIRCd::Exit);
+       signal(SIGALRM, SIG_IGN);
+       signal(SIGHUP, InspIRCd::Rehash);
+       signal(SIGPIPE, SIG_IGN);
+       signal(SIGTERM, InspIRCd::Exit);
+       signal(SIGCHLD, SIG_IGN);
 }
 
 bool InspIRCd::DaemonSeed()
@@ -120,9 +121,18 @@ bool InspIRCd::DaemonSeed()
                return (ERROR);
        else if (childpid > 0)
        {
-               /* We wait a few seconds here, so that the shell prompt doesnt come back over the output */
-               sleep(6);
-               exit (0);
+               /* We wait here for the child process to kill us,
+                * so that the shell prompt doesnt come back over
+                * the output.
+                * Sending a kill with a signal of 0 just checks
+                * if the child pid is still around. If theyre not,
+                * they threw an error and we should give up.
+                */
+               while (kill(childpid, 0) != -1)
+               {
+                       sleep(1);
+               }
+               exit(ERROR);
        }
        setsid ();
        umask (007);
@@ -140,7 +150,7 @@ bool InspIRCd::DaemonSeed()
                if (setrlimit(RLIMIT_CORE, &rl) == -1)
                        this->Log(DEFAULT,"setrlimit() failed, cannot increase coredump size.");
        }
-  
+
        return true;
 }
 
@@ -303,9 +313,11 @@ InspIRCd::InspIRCd(int argc, char** argv)
 
        if (!Config->nofork)
        {
-               fclose(stdout);
-               fclose(stderr);
+               if (kill(getppid(), SIGTERM) == -1)
+                       printf("Error killing parent process: %s\n",strerror(errno));
                fclose(stdin);
+               fclose(stderr);
+               fclose(stdout);
        }
 
        printf("\nInspIRCd is now running!\n");