X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fproc.c;h=a5afb5011cb1c468732561d5944fa9f685c1c4e4;hp=217eb6d3ba17a3d22613caabfb2662e6c9f4cccc;hb=8e6db769ac549cfe26042f7d51ae8a301d8fc569;hpb=e70e81460b99d6b00cb6d13d7ce7537dcd4965f8;ds=sidebyside diff --git a/src/ngircd/proc.c b/src/ngircd/proc.c index 217eb6d3..a5afb501 100644 --- a/src/ngircd/proc.c +++ b/src/ngircd/proc.c @@ -1,6 +1,6 @@ /* * 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 @@ -50,7 +50,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 +64,9 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout return -1; } - seed = (unsigned int)random(); +#ifndef HAVE_ARC4RANDOM + seed = (unsigned int)rand(); +#endif pid = fork(); switch (pid) { case -1: @@ -73,13 +77,17 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout return -1; case 0: /* New child process: */ - srandom(seed ^ (unsigned int)time(NULL) ^ getpid()); +#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; } @@ -138,14 +146,28 @@ Proc_Read(PROC_STAT *proc, void *buffer, size_t buflen) 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- */