--- libaitio/src/exec.c 2013/12/05 12:57:35 1.1.2.2 +++ libaitio/src/exec.c 2013/12/05 15:18:22 1.1.2.6 @@ -37,8 +37,10 @@ io_progInit(const char *progName, u_int initNum, u_int pthread_mutex_init(&prg->prog_mtx, NULL); - if (!io_progOpen(prg, prg->prog_inin)) + if (io_progOpen(prg, prg->prog_inin) < 0) { io_progDestroy(&prg); + prg = NULL; + } return prg; } @@ -87,7 +89,7 @@ io_progClose(prog_t * __restrict prg, u_int closeNum) for (i = array_Size(prg->prog_fds) - 1; (closeNum ? ret < closeNum : 42) && i > -1; i--) if (array_Get(prg->prog_fds, i)) { - pclose(array(prg->prog_fds, i, FILE*)); + e_pclose(array(prg->prog_fds, i, FILE*)); array_Del(prg->prog_fds, i, 0); prg->prog_cnum--; ret++; @@ -108,8 +110,9 @@ int io_progOpen(prog_t * __restrict prg, u_int execNum) { FILE *f; - int ret = 0; + int stat, ret = 0; register int i; + pid_t pid; if (!prg) return 0; @@ -121,11 +124,16 @@ io_progOpen(prog_t * __restrict prg, u_int execNum) pthread_mutex_lock(&prg->prog_mtx); for (i = 0; (execNum ? ret < execNum : 42) && i < array_Size(prg->prog_fds); i++) if (!array_Get(prg->prog_fds, i)) { - f = popen(prg->prog_name, "r+"); + f = e_popen(prg->prog_name, "r+", &pid); if (!f) { LOGERR; - ret *= -1; + ret = -1; break; + } else if (waitpid(pid, &stat, WNOHANG)) { + io_SetErr(ECHILD, "Program with pid=%d exit with status %d", + pid, WIFEXITED(stat) ? WEXITSTATUS(stat) : -1); + ret = -1; + break; } else array_Set(prg->prog_fds, i, f); prg->prog_cnum++; @@ -161,7 +169,7 @@ io_progVacuum(prog_t * __restrict prg, u_int toNum) pthread_mutex_lock(&prg->prog_mtx); for (i = array_Size(prg->prog_fds) - 1; prg->prog_cnum > toNum && i > -1; i--) if (array_Get(prg->prog_fds, i)) { - pclose(array(prg->prog_fds, i, FILE*)); + e_pclose(array(prg->prog_fds, i, FILE*)); array_Del(prg->prog_fds, i, 0); prg->prog_cnum--; ret++;