Ian Kent 4816d7
autofs-5.0.4 - fix return start status on fail
Ian Kent 4816d7
Ian Kent 4816d7
From: Ian Kent <raven@themaw.net>
Ian Kent 4816d7
Ian Kent 4816d7
We're not returning the status to the parent when automount(8) is waiting
Ian Kent 4816d7
for the daemon to finish its startup.
Ian Kent 4816d7
---
Ian Kent 4816d7
Ian Kent 4816d7
 CHANGELOG          |    1 +
Ian Kent 4816d7
 daemon/automount.c |   27 +++++++++++++++++++++------
Ian Kent 4816d7
 2 files changed, 22 insertions(+), 6 deletions(-)
Ian Kent 4816d7
Ian Kent 4816d7
Ian Kent 4816d7
diff --git a/CHANGELOG b/CHANGELOG
Ian Kent 4816d7
index fdde400..2cb35dc 100644
Ian Kent 4816d7
--- a/CHANGELOG
Ian Kent 4816d7
+++ b/CHANGELOG
Ian Kent 4816d7
@@ -27,6 +27,7 @@
Ian Kent 4816d7
 - add WITH_LIBTIRPC to -V status report.
Ian Kent 4816d7
 - add nfs mount protocol default configuration option.
Ian Kent 4816d7
 - fix bad token declaration in master map parser.
Ian Kent 4816d7
+- fix return start status on fail.
Ian Kent 4816d7
 
Ian Kent 4816d7
 4/11/2008 autofs-5.0.4
Ian Kent 4816d7
 -----------------------
Ian Kent 4816d7
diff --git a/daemon/automount.c b/daemon/automount.c
Ian Kent 4816d7
index 776c92c..80691fa 100644
Ian Kent 4816d7
--- a/daemon/automount.c
Ian Kent 4816d7
+++ b/daemon/automount.c
Ian Kent 4816d7
@@ -60,7 +60,7 @@ long global_negative_timeout = -1;
Ian Kent 4816d7
 int do_force_unlink = 0;		/* Forceably unlink mount tree at startup */
Ian Kent 4816d7
 
Ian Kent 4816d7
 static int start_pipefd[2];
Ian Kent 4816d7
-static int st_stat = 0;
Ian Kent 4816d7
+static int st_stat = 1;
Ian Kent 4816d7
 static int *pst_stat = &st_stat;
Ian Kent 4816d7
 static pthread_t state_mach_thid;
Ian Kent 4816d7
 
Ian Kent 4816d7
@@ -1046,6 +1046,7 @@ static void become_daemon(unsigned foreground, unsigned daemon_check)
Ian Kent 4816d7
 {
Ian Kent 4816d7
 	FILE *pidfp;
Ian Kent 4816d7
 	char buf[MAX_ERR_BUF];
Ian Kent 4816d7
+	int res;
Ian Kent 4816d7
 	pid_t pid;
Ian Kent 4816d7
 
Ian Kent 4816d7
 	/* Don't BUSY any directories unnecessarily */
Ian Kent 4816d7
@@ -1072,10 +1073,9 @@ static void become_daemon(unsigned foreground, unsigned daemon_check)
Ian Kent 4816d7
 	} else {
Ian Kent 4816d7
 		pid = fork();
Ian Kent 4816d7
 		if (pid > 0) {
Ian Kent 4816d7
-			int r;
Ian Kent 4816d7
 			close(start_pipefd[1]);
Ian Kent 4816d7
-			r = read(start_pipefd[0], pst_stat, sizeof(*pst_stat));
Ian Kent 4816d7
-			if (r < 0)
Ian Kent 4816d7
+			res = read(start_pipefd[0], pst_stat, sizeof(*pst_stat));
Ian Kent 4816d7
+			if (res < 0)
Ian Kent 4816d7
 				exit(1);
Ian Kent 4816d7
 			exit(*pst_stat);
Ian Kent 4816d7
 		} else if (pid < 0) {
Ian Kent 4816d7
@@ -1088,8 +1088,13 @@ static void become_daemon(unsigned foreground, unsigned daemon_check)
Ian Kent 4816d7
 		if (daemon_check && !aquire_flag_file()) {
Ian Kent 4816d7
 			fprintf(stderr, "%s: program is already running.\n",
Ian Kent 4816d7
 				program);
Ian Kent 4816d7
+			/* Return success if already running */
Ian Kent 4816d7
+			st_stat = 0;
Ian Kent 4816d7
+			res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
Ian Kent 4816d7
+			if (res < 0)
Ian Kent 4816d7
+				exit(1);
Ian Kent 4816d7
 			close(start_pipefd[1]);
Ian Kent 4816d7
-			exit(1);
Ian Kent 4816d7
+			exit(*pst_stat);
Ian Kent 4816d7
 		}
Ian Kent 4816d7
 
Ian Kent 4816d7
 		/*
Ian Kent 4816d7
@@ -1099,8 +1104,9 @@ static void become_daemon(unsigned foreground, unsigned daemon_check)
Ian Kent 4816d7
 		if (setsid() == -1) {
Ian Kent 4816d7
 			char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
Ian Kent 4816d7
 			fprintf(stderr, "setsid: %s", estr);
Ian Kent 4816d7
+			res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
Ian Kent 4816d7
 			close(start_pipefd[1]);
Ian Kent 4816d7
-			exit(1);
Ian Kent 4816d7
+			exit(*pst_stat);
Ian Kent 4816d7
 		}
Ian Kent 4816d7
 		log_to_syslog();
Ian Kent 4816d7
 	}
Ian Kent 4816d7
@@ -1991,6 +1997,7 @@ int main(int argc, char *argv[])
Ian Kent 4816d7
 	if (!master_list) {
Ian Kent 4816d7
 		logerr("%s: can't create master map %s",
Ian Kent 4816d7
 			program, argv[0]);
Ian Kent 4816d7
+		res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
Ian Kent 4816d7
 		close(start_pipefd[1]);
Ian Kent 4816d7
 		release_flag_file();
Ian Kent 4816d7
 		exit(1);
Ian Kent 4816d7
@@ -1999,6 +2006,7 @@ int main(int argc, char *argv[])
Ian Kent 4816d7
 	if (pthread_attr_init(&th_attr)) {
Ian Kent 4816d7
 		logerr("%s: failed to init thread attribute struct!",
Ian Kent 4816d7
 		     program);
Ian Kent 4816d7
+		res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
Ian Kent 4816d7
 		close(start_pipefd[1]);
Ian Kent 4816d7
 		release_flag_file();
Ian Kent 4816d7
 		exit(1);
Ian Kent 4816d7
@@ -2007,6 +2015,7 @@ int main(int argc, char *argv[])
Ian Kent 4816d7
 	if (pthread_attr_init(&th_attr_detached)) {
Ian Kent 4816d7
 		logerr("%s: failed to init thread attribute struct!",
Ian Kent 4816d7
 		     program);
Ian Kent 4816d7
+		res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
Ian Kent 4816d7
 		close(start_pipefd[1]);
Ian Kent 4816d7
 		release_flag_file();
Ian Kent 4816d7
 		exit(1);
Ian Kent 4816d7
@@ -2016,6 +2025,7 @@ int main(int argc, char *argv[])
Ian Kent 4816d7
 			&th_attr_detached, PTHREAD_CREATE_DETACHED)) {
Ian Kent 4816d7
 		logerr("%s: failed to set detached thread attribute!",
Ian Kent 4816d7
 		     program);
Ian Kent 4816d7
+		res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
Ian Kent 4816d7
 		close(start_pipefd[1]);
Ian Kent 4816d7
 		release_flag_file();
Ian Kent 4816d7
 		exit(1);
Ian Kent 4816d7
@@ -2026,6 +2036,7 @@ int main(int argc, char *argv[])
Ian Kent 4816d7
 			&th_attr_detached, PTHREAD_STACK_MIN*64)) {
Ian Kent 4816d7
 		logerr("%s: failed to set stack size thread attribute!",
Ian Kent 4816d7
 		       program);
Ian Kent 4816d7
+		res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
Ian Kent 4816d7
 		close(start_pipefd[1]);
Ian Kent 4816d7
 		release_flag_file();
Ian Kent 4816d7
 		exit(1);
Ian Kent 4816d7
@@ -2043,6 +2054,7 @@ int main(int argc, char *argv[])
Ian Kent 4816d7
 		logerr("%s: failed to create thread data key for std env vars!",
Ian Kent 4816d7
 		       program);
Ian Kent 4816d7
 		master_kill(master_list);
Ian Kent 4816d7
+		res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
Ian Kent 4816d7
 		close(start_pipefd[1]);
Ian Kent 4816d7
 		release_flag_file();
Ian Kent 4816d7
 		exit(1);
Ian Kent 4816d7
@@ -2053,6 +2065,7 @@ int main(int argc, char *argv[])
Ian Kent 4816d7
 	if (!alarm_start_handler()) {
Ian Kent 4816d7
 		logerr("%s: failed to create alarm handler thread!", program);
Ian Kent 4816d7
 		master_kill(master_list);
Ian Kent 4816d7
+		res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
Ian Kent 4816d7
 		close(start_pipefd[1]);
Ian Kent 4816d7
 		release_flag_file();
Ian Kent 4816d7
 		exit(1);
Ian Kent 4816d7
@@ -2061,6 +2074,7 @@ int main(int argc, char *argv[])
Ian Kent 4816d7
 	if (!st_start_handler()) {
Ian Kent 4816d7
 		logerr("%s: failed to create FSM handler thread!", program);
Ian Kent 4816d7
 		master_kill(master_list);
Ian Kent 4816d7
+		res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
Ian Kent 4816d7
 		close(start_pipefd[1]);
Ian Kent 4816d7
 		release_flag_file();
Ian Kent 4816d7
 		exit(1);
Ian Kent 4816d7
@@ -2092,6 +2106,7 @@ int main(int argc, char *argv[])
Ian Kent 4816d7
 	 */
Ian Kent 4816d7
 	do_force_unlink = 0;
Ian Kent 4816d7
 
Ian Kent 4816d7
+	st_stat = 0;
Ian Kent 4816d7
 	res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
Ian Kent 4816d7
 	close(start_pipefd[1]);
Ian Kent 4816d7