X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fproc.c;h=614aef4c39a741044c745ac4c5e7232f1a54d2bf;hb=76f40bdb988440a73431eb14a27f30aeaa18ebe5;hp=f5438834c1842fa3453b6cc6da62a817e3fd9042;hpb=79be1c477e167892b12b77dcef1d298d9d017d3c;p=ngircd-alex.git diff --git a/src/ngircd/proc.c b/src/ngircd/proc.c index f5438834..614aef4c 100644 --- a/src/ngircd/proc.c +++ b/src/ngircd/proc.c @@ -23,8 +23,10 @@ #include "log.h" #include "io.h" +#include "conn.h" #include "exp.h" +#include "sighandlers.h" #include "proc.h" /** @@ -42,7 +44,7 @@ Proc_InitStruct (PROC_STAT *proc) * Fork a child process. */ GLOBAL pid_t -Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short)) +Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout) { pid_t pid; @@ -66,7 +68,12 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short)) return -1; case 0: /* New child process: */ + Signals_Exit(); + signal(SIGTERM, Proc_GenericSignalHandler); + signal(SIGALRM, Proc_GenericSignalHandler); close(pipefds[0]); + alarm(timeout); + Conn_CloseAllSockets(); return 0; } @@ -86,21 +93,6 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short)) return pid; } -/** - * Kill forked child process. - */ -GLOBAL void -Proc_Kill(PROC_STAT *proc) -{ - assert(proc != NULL); - - if (proc->pipe_fd > 0) - io_close(proc->pipe_fd); - if (proc->pid > 0) - kill(proc->pid, SIGTERM); - Proc_InitStruct(proc); -} - /** * Generic signal handler for forked child processes. */ @@ -111,6 +103,11 @@ Proc_GenericSignalHandler(int Signal) case SIGTERM: #ifdef DEBUG Log_Subprocess(LOG_DEBUG, "Child got TERM signal, exiting."); +#endif + exit(1); + case SIGALRM: +#ifdef DEBUG + Log_Subprocess(LOG_DEBUG, "Child got ALARM signal, exiting."); #endif exit(1); } @@ -118,6 +115,8 @@ Proc_GenericSignalHandler(int Signal) /** * Read bytes from a pipe of a forked child process. + * In addition, this function makes sure that the child process is ignored + * after all data has been read or a fatal error occurred. */ GLOBAL size_t Proc_Read(PROC_STAT *proc, void *buffer, size_t buflen) @@ -139,7 +138,7 @@ Proc_Read(PROC_STAT *proc, void *buffer, size_t buflen) else if (bytes_read == 0) LogDebug("Can't read from child process %ld: EOF", proc->pid); #endif - Proc_Kill(proc); + Proc_InitStruct(proc); return (size_t)bytes_read; }