]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/proc.c
ngIRCd Release 27
[ngircd-alex.git] / src / ngircd / proc.c
index 7addb47ef30c804e889b6a49d390e2505ae8e1b2..af00dd3d3e9c81ca1345a10513ce8a4250292f15 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2014 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
  * Process management
  */
 
-#include "imp.h"
 #include <assert.h>
 #include <errno.h>
 #include <signal.h>
 #include <string.h>
 #include <stdlib.h>
+#include <sys/types.h>
 #include <unistd.h>
+#include <time.h>
 
 #include "log.h"
 #include "io.h"
-#include "conn.h"
-
-#include "exp.h"
 #include "sighandlers.h"
+
 #include "proc.h"
 
 /**
@@ -50,7 +49,9 @@ GLOBAL pid_t
 Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout)
 {
        pid_t pid;
+#ifndef HAVE_ARC4RANDOM
        unsigned int seed;
+#endif
 
        assert(proc != NULL);
        assert(pipefds != NULL);
@@ -62,7 +63,9 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout
                return -1;
        }
 
+#ifndef HAVE_ARC4RANDOM
        seed = (unsigned int)rand();
+#endif
        pid = fork();
        switch (pid) {
        case -1:
@@ -73,7 +76,12 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout
                return -1;
        case 0:
                /* New child process: */
+#ifdef HAVE_ARC4RANDOM_STIR
+               arc4random_stir();
+#endif
+#ifndef HAVE_ARC4RANDOM
                srand(seed ^ (unsigned int)time(NULL) ^ getpid());
+#endif
                Signals_Exit();
                signal(SIGTERM, Proc_GenericSignalHandler);
                signal(SIGALRM, Proc_GenericSignalHandler);
@@ -106,14 +114,10 @@ Proc_GenericSignalHandler(int Signal)
 {
        switch(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);
        }
 }
@@ -154,7 +158,10 @@ Proc_Read(PROC_STAT *proc, void *buffer, size_t buflen)
 GLOBAL void
 Proc_Close(PROC_STAT *proc)
 {
-       io_close(proc->pipe_fd);
+       /* Close socket, if it exists */
+       if (proc->pipe_fd >= 0)
+               io_close(proc->pipe_fd);
+
        Proc_InitStruct(proc);
 }