diff --git a/ctdb/server/ctdb_event_helper.c b/ctdb/server/ctdb_event_helper.c index 9ff763c538a..f14e336f25c 100644 --- a/ctdb/server/ctdb_event_helper.c +++ b/ctdb/server/ctdb_event_helper.c @@ -67,7 +67,7 @@ int main(int argc, char *argv[]) { int log_fd, write_fd; pid_t pid; - int status, output; + int status, output, ret; progname = argv[0]; @@ -99,33 +99,47 @@ int main(int argc, char *argv[]) pid = fork(); if (pid < 0) { + int save_errno = errno; fprintf(stderr, "Failed to fork - %s\n", strerror(errno)); - exit(errno); + sys_write(write_fd, &save_errno, sizeof(save_errno)); + exit(1); } if (pid == 0) { - int save_errno; - - execv(argv[3], &argv[3]); - if (errno == EACCES) { - save_errno = check_executable(argv[3]); - } else { - save_errno = errno; + ret = check_executable(argv[3]); + if (ret != 0) { + _exit(ret); + } + ret = execv(argv[3], &argv[3]); + if (ret != 0) { + int save_errno = errno; fprintf(stderr, "Error executing '%s' - %s\n", - argv[3], strerror(errno)); + argv[3], strerror(save_errno)); } - _exit(save_errno); + /* This should never happen */ + _exit(ENOEXEC); } - waitpid(pid, &status, 0); - if (WIFEXITED(status)) { - output = WEXITSTATUS(status); - if (output == ENOENT || output == ENOEXEC) { - output = -output; - } + ret = waitpid(pid, &status, 0); + if (ret == -1) { + output = -errno; + fprintf(stderr, "waitpid() failed - %s\n", strerror(errno)); sys_write(write_fd, &output, sizeof(output)); - exit(output); + exit(1); + } + if (WIFEXITED(status)) { + output = -WEXITSTATUS(status); + sys_write(write_fd, &output, sizeof(output)); + exit(0); + } + if (WIFSIGNALED(status)) { + output = -EINTR; + fprintf(stderr, "Process terminated with signal - %d\n", + WTERMSIG(status)); + sys_write(write_fd, &output, sizeof(output)); + exit(0); } + fprintf(stderr, "waitpid() status=%d\n", status); exit(1); } diff --git a/ctdb/server/eventscript.c b/ctdb/server/eventscript.c index 28bbb545b2f..eaa6a20d31a 100644 --- a/ctdb/server/eventscript.c +++ b/ctdb/server/eventscript.c @@ -367,6 +367,8 @@ static void ctdb_event_script_handler(struct event_context *ev, struct fd_event r = sys_read(state->fd[0], ¤t->status, sizeof(current->status)); if (r < 0) { current->status = -errno; + } else if (r == 0) { + current->status = -EINTR; } else if (r != sizeof(current->status)) { current->status = -EIO; } @@ -384,8 +386,12 @@ static void ctdb_event_script_handler(struct event_context *ev, struct fd_event /* Aborted or finished all scripts? We're done. */ if (status != 0 || state->current+1 == state->scripts->num_scripts) { - DEBUG(DEBUG_INFO,(__location__ " Eventscript %s %s finished with state %d\n", - ctdb_eventscript_call_names[state->call], state->options, status)); + if (status != 0) { + DEBUG(DEBUG_INFO, + ("Eventscript %s %s finished with state %d\n", + ctdb_eventscript_call_names[state->call], + state->options, status)); + } ctdb->event_script_timeouts = 0; talloc_free(state);