]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/proc.c
startup: open /dev/null before chroot
[ngircd-alex.git] / src / ngircd / proc.c
index 1e8cac36eea9d92a9eea14ba0b4797e5cbe3a063..dbcff6f1aa5cfe0edf16ac4b90aace58a681698f 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "log.h"
 #include "io.h"
+#include "conn.h"
 
 #include "exp.h"
 #include "proc.h"
@@ -42,7 +43,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;
 
@@ -67,7 +68,10 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short))
        case 0:
                /* New child process: */
                signal(SIGTERM, Proc_GenericSignalHandler);
+               signal(SIGALRM, Proc_GenericSignalHandler);
                close(pipefds[0]);
+               alarm(timeout);
+               Conn_CloseAllSockets();
                return 0;
        }
 
@@ -87,21 +91,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.
  */
@@ -112,6 +101,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);
        }
@@ -119,7 +113,7 @@ 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 dead
+ * 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
@@ -142,7 +136,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;
 }