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()
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);
if (setrlimit(RLIMIT_CORE, &rl) == -1)
this->Log(DEFAULT,"setrlimit() failed, cannot increase coredump size.");
}
-
+
return true;
}
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");