[SCM] Samba Shared Repository - branch master updated

Martin Schwenke martins at samba.org
Thu Nov 13 19:07:03 MST 2014


The branch, master has been updated
       via  d04bfc6 ctdb-daemon: Improve error handling for running event scripts
      from  04a9a1a lib: Slightly simplify strupper_m

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit d04bfc6ec6ad7a4749ebfee2284253c4a91a81aa
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Thu Nov 13 11:02:26 2014 +1100

    ctdb-daemon: Improve error handling for running event scripts
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>
    
    Autobuild-User(master): Martin Schwenke <martins at samba.org>
    Autobuild-Date(master): Fri Nov 14 03:06:12 CET 2014 on sn-devel-104

-----------------------------------------------------------------------

Summary of changes:
 ctdb/server/ctdb_event_helper.c | 48 ++++++++++++++++++++++++++---------------
 ctdb/server/eventscript.c       | 10 +++++++--
 2 files changed, 39 insertions(+), 19 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ctdb/server/ctdb_event_helper.c b/ctdb/server/ctdb_event_helper.c
index 9ff763c..f14e336 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 28bbb54..eaa6a20 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], &current->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);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list