diff options
author | Amitay Isaacs <amitay@gmail.com> | 2014-11-13 11:02:26 +1100 |
---|---|---|
committer | Martin Schwenke <martins@samba.org> | 2014-11-14 03:06:12 +0100 |
commit | d04bfc6ec6ad7a4749ebfee2284253c4a91a81aa (patch) | |
tree | 602bee1878f26658a4750200e6bc57e5288777b4 | |
parent | 04a9a1ac6def992fe0ed97ad96b706bec709ec18 (diff) | |
download | samba-d04bfc6ec6ad7a4749ebfee2284253c4a91a81aa.tar.gz samba-d04bfc6ec6ad7a4749ebfee2284253c4a91a81aa.tar.xz samba-d04bfc6ec6ad7a4749ebfee2284253c4a91a81aa.zip |
ctdb-daemon: Improve error handling for running event scripts
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
Autobuild-User(master): Martin Schwenke <martins@samba.org>
Autobuild-Date(master): Fri Nov 14 03:06:12 CET 2014 on sn-devel-104
-rw-r--r-- | ctdb/server/ctdb_event_helper.c | 48 | ||||
-rw-r--r-- | ctdb/server/eventscript.c | 10 |
2 files changed, 39 insertions, 19 deletions
diff --git a/ctdb/server/ctdb_event_helper.c b/ctdb/server/ctdb_event_helper.c index 9ff763c538..f14e336f25 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); + 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(1); + } if (WIFEXITED(status)) { - output = WEXITSTATUS(status); - if (output == ENOENT || output == ENOEXEC) { - output = -output; - } + 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(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 28bbb545b2..eaa6a20d31 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); |