From: Andre Noll Date: Mon, 2 Jul 2012 06:40:31 +0000 (+0200) Subject: fade: Abort on client command failures. X-Git-Tag: v0.4.12~10^2~8 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=3a258056d2137c3a4c10d717c6bb2e92d91ee3e0 fade: Abort on client command failures. Currently, we check only the exit code of wait(), but do not look at the exit status of the child. So the fade command continues even if all para_client commands fail. Fix this by investigating the termination status of the child process. --- diff --git a/fade.c b/fade.c index ca9f08ae..36ff1fc1 100644 --- a/fade.c +++ b/fade.c @@ -176,7 +176,7 @@ out: static void client_cmd(const char *cmd) { - int ret, fds[3] = {0, 0, 0}; + int ret, status, fds[3] = {0, 0, 0}; pid_t pid; char *cmdline = make_message(BINDIR "/para_client %s", cmd); @@ -184,12 +184,22 @@ static void client_cmd(const char *cmd) ret = para_exec_cmdline_pid(&pid, cmdline, fds); free(cmdline); if (ret < 0) { - PARA_EMERG_LOG("%s\n", para_strerror(-ret)); - exit(EXIT_FAILURE); + PARA_ERROR_LOG("%s\n", para_strerror(-ret)); + goto fail; } do - ret = wait(NULL); - while (ret != -1 && errno != ECHILD); + pid = waitpid(pid, &status, 0); + while (pid == -1 && errno == EINTR); + if (pid < 0) { + PARA_ERROR_LOG("%s\n", strerror(errno)); + goto fail; + } + if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) + goto fail; + return; +fail: + PARA_EMERG_LOG("command \"%s\" failed\n", cmd); + exit(EXIT_FAILURE); } static void change_afs_mode_and_play(char *afs_mode)