]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/proc.c
New function Proc_Close() to shutdown pipes to child processes
[ngircd-alex.git] / src / ngircd / proc.c
index dbcff6f1aa5cfe0edf16ac4b90aace58a681698f..2a5eda8304ea1c462612329118dbd698b00148c6 100644 (file)
@@ -1,18 +1,21 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
+ * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
  * Please read the file COPYING, README and AUTHORS for more information.
- *
- * Process management
  */
 
 #include "portab.h"
 
+/**
+ * @file
+ * Process management
+ */
+
 #include "imp.h"
 #include <assert.h>
 #include <errno.h>
@@ -26,6 +29,7 @@
 #include "conn.h"
 
 #include "exp.h"
+#include "sighandlers.h"
 #include "proc.h"
 
 /**
@@ -46,6 +50,7 @@ GLOBAL pid_t
 Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout)
 {
        pid_t pid;
+       unsigned int seed;
 
        assert(proc != NULL);
        assert(pipefds != NULL);
@@ -57,6 +62,7 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout
                return -1;
        }
 
+       seed = (unsigned int)rand();
        pid = fork();
        switch (pid) {
        case -1:
@@ -67,6 +73,8 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout
                return -1;
        case 0:
                /* New child process: */
+               srand(seed ^ (unsigned int)time(NULL) ^ getpid());
+               Signals_Exit();
                signal(SIGTERM, Proc_GenericSignalHandler);
                signal(SIGALRM, Proc_GenericSignalHandler);
                close(pipefds[0]);
@@ -140,4 +148,14 @@ Proc_Read(PROC_STAT *proc, void *buffer, size_t buflen)
        return (size_t)bytes_read;
 }
 
+/**
+ * Close pipe to a forked child process.
+ */
+GLOBAL void
+Proc_Close(PROC_STAT *proc)
+{
+       io_close(proc->pipe_fd);
+       Proc_InitStruct(proc);
+}
+
 /* -eof- */