X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Flib%2Fbpipe.c;h=975c5f6896f5efbec918dbbc07091f58a9f6c8f7;hb=3ab946b1d2677cb3d8095e54767487d569457542;hp=98478bc38051ce1622e70ab726ef8ba4b716ca9a;hpb=f9ce984a95bee03cf26737a16564c197afca7ecf;p=bacula%2Fbacula diff --git a/bacula/src/lib/bpipe.c b/bacula/src/lib/bpipe.c index 98478bc380..975c5f6896 100644 --- a/bacula/src/lib/bpipe.c +++ b/bacula/src/lib/bpipe.c @@ -163,20 +163,25 @@ int close_bpipe(BPIPE *bpipe) break; } if (remaining_wait > 0) { - sleep(1); /* wait one second */ + bmicrosleep(1, 0); /* wait one second */ remaining_wait--; } else { - stat = ETIME; /* set timeout, if no other status */ + stat = 1; /* set error status */ + errno = ETIME; /* set timed out */ wpid = -1; break; /* don't wait any longer */ } } - if (wpid != -1 && WIFEXITED(chldstatus)) { - stat = WEXITSTATUS(chldstatus); + if (wpid > 0) { + if (WIFEXITED(chldstatus)) { /* process exit()ed */ + stat = WEXITSTATUS(chldstatus); + } else if (WIFSIGNALED(chldstatus)) { /* process died */ + stat = 1; + } if (stat != 0) { - errno = ECHILD; + errno = ECHILD; /* set child errno */ } - } + } if (bpipe->timer_id) { stop_child_timer(bpipe->timer_id); } @@ -192,6 +197,11 @@ int close_bpipe(BPIPE *bpipe) * Run an external program. Optionally wait a specified number * of seconds. Program killed if wait exceeded. Optionally * return the output from the program (normally a single line). + * + * Contrary to my normal calling conventions, this program + * + * Returns: 0 on success + * non-zero on error */ int run_program(char *prog, int wait, POOLMEM *results) { @@ -206,12 +216,12 @@ int run_program(char *prog, int wait, POOLMEM *results) } if (results) { results[0] = 0; - stat1 = fgets(results, sizeof_pool_memory(results), bpipe->rfd) != NULL; + stat1 = fgets(results, sizeof_pool_memory(results), bpipe->rfd) == NULL; } else { - stat1 = 1; + stat1 = 0; } stat2 = close_bpipe(bpipe); - return stat1 && stat2; + return stat2 != 0 ? stat2 : stat1; }