/* ** Copyright 2000-2006 Double Precision, Inc. ** See COPYING for distribution information. */ #include "config.h" #include "waitlib.h" #include #include #include #include #if HAVE_UNISTD_H #include #endif static pid_t *static_pid_buf=0; static void start_reaper(pid_t pid, int exit_stat) { } static void start_reap(int signum) { wait_reap(start_reaper, start_reap); } void wait_forchild( void (*)(pid_t, int), /* Reaper */ void (*)(int)); /* Signal handler stub */ int wait_startchildren(unsigned nchildren, pid_t **pidptr) { int pipefd[2]; pid_t p; unsigned i; if (!pidptr) { if (static_pid_buf) free(static_pid_buf); static_pid_buf=0; pidptr= &static_pid_buf; } if (*pidptr == 0 && (*pidptr=malloc(nchildren * sizeof(pid_t))) == 0) return (-1); if (pipe(pipefd) < 0) return (-1); signal(SIGCHLD, start_reap); wait_block(); for (i=0; i= nchildren) return (0); switch ((pidptr[i]=fork())) { case 0: wait_restore(); /* Just in case */ return (1); case -1: return (-1); default: break; } return (0); }