/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
+ * 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"
/**
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);
return -1;
}
+#ifndef HAVE_ARC4RANDOM
seed = (unsigned int)rand();
+#endif
pid = fork();
switch (pid) {
case -1:
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);
close(pipefds[0]);
alarm(timeout);
- Conn_CloseAllSockets();
return 0;
}
{
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);
}
}
return 0;
Log(LOG_CRIT, "Can't read from child process %ld: %s",
proc->pid, strerror(errno));
+ Proc_Close(proc);
bytes_read = 0;
+ } else if (bytes_read == 0) {
+ /* EOF: clean up */
+ LogDebug("Child process %ld: EOF reached, closing pipe.",
+ proc->pid);
+ Proc_Close(proc);
}
-#if DEBUG
- else if (bytes_read == 0)
- LogDebug("Can't read from child process %ld: EOF", proc->pid);
-#endif
- Proc_InitStruct(proc);
return (size_t)bytes_read;
}
+/**
+ * Close pipe to a forked child process.
+ */
+GLOBAL void
+Proc_Close(PROC_STAT *proc)
+{
+ /* Close socket, if it exists */
+ if (proc->pipe_fd >= 0)
+ io_close(proc->pipe_fd);
+
+ Proc_InitStruct(proc);
+}
+
/* -eof- */