Blob Blame History Raw
---
 multipathd/main.c |   38 +++++++++++++++++++++++++++++---------
 1 file changed, 29 insertions(+), 9 deletions(-)

Index: multipath-tools-130222/multipathd/main.c
===================================================================
--- multipath-tools-130222.orig/multipathd/main.c
+++ multipath-tools-130222/multipathd/main.c
@@ -87,6 +87,7 @@ unsigned int mpath_mx_alloc_len;
 int logsink;
 enum daemon_status running_state;
 pid_t daemon_pid;
+pid_t parent_pid = -1;
 
 static sem_t exit_sem;
 /*
@@ -1718,6 +1719,12 @@ sigusr2 (int sig)
 }
 
 static void
+sigalrm (int sig)
+{
+	exit(0);
+}
+
+static void
 signal_init(void)
 {
 	sigset_t set;
@@ -1820,6 +1827,9 @@ child (void * param)
 	}
 
 	running_state = DAEMON_START;
+	pid_rc = pidfile_create(DEFAULT_PIDFILE, daemon_pid);
+	if (parent_pid > 0)
+		kill(parent_pid, SIGALRM);
 
 	condlog(2, "--------start up--------");
 	condlog(2, "read " DEFAULT_CONFIGFILE);
@@ -1911,8 +1921,6 @@ child (void * param)
 	}
 	pthread_attr_destroy(&misc_attr);
 
-	/* Startup complete, create logfile */
-	pid_rc = pidfile_create(DEFAULT_PIDFILE, daemon_pid);
 	update_timestamp(1);
 	/* Ignore errors, we can live without */
 
@@ -1992,7 +2000,10 @@ daemonize(void)
 {
 	int pid;
 	int dev_null_fd;
+	struct sigaction oldsig;
 
+	oldsig.sa_handler = signal_set(SIGALRM, sigalrm);
+	parent_pid = getpid();
 	if( (pid = fork()) < 0){
 		fprintf(stderr, "Failed first fork : %s\n", strerror(errno));
 		return -1;
@@ -2000,10 +2011,13 @@ daemonize(void)
 	else if (pid != 0)
 		return pid;
 
+	signal_set(SIGALRM, oldsig.sa_handler);
 	setsid();
 
-	if ( (pid = fork()) < 0)
+	if ( (pid = fork()) < 0) {
 		fprintf(stderr, "Failed second fork : %s\n", strerror(errno));
+		goto fail;
+	}
 	else if (pid != 0)
 		_exit(0);
 
@@ -2014,30 +2028,34 @@ daemonize(void)
 	if (dev_null_fd < 0){
 		fprintf(stderr, "cannot open /dev/null for input & output : %s\n",
 			strerror(errno));
-		_exit(0);
+		goto fail;
 	}
 
 	close(STDIN_FILENO);
 	if (dup(dev_null_fd) < 0) {
 		fprintf(stderr, "cannot dup /dev/null to stdin : %s\n",
 			strerror(errno));
-		_exit(0);
+		goto fail;
 	}
 	close(STDOUT_FILENO);
 	if (dup(dev_null_fd) < 0) {
 		fprintf(stderr, "cannot dup /dev/null to stdout : %s\n",
 			strerror(errno));
-		_exit(0);
+		goto fail;
 	}
 	close(STDERR_FILENO);
 	if (dup(dev_null_fd) < 0) {
 		fprintf(stderr, "cannot dup /dev/null to stderr : %s\n",
 			strerror(errno));
-		_exit(0);
+		goto fail;
 	}
 	close(dev_null_fd);
 	daemon_pid = getpid();
 	return 0;
+
+fail:
+	kill(parent_pid, SIGALRM);
+	_exit(0);
 }
 
 int
@@ -2116,10 +2134,12 @@ main (int argc, char *argv[])
 	if (err < 0)
 		/* error */
 		exit(1);
-	else if (err > 0)
+	else if (err > 0) {
+		/* wait up to 3 seconds for the child to start */
+		sleep(3);
 		/* parent dies */
 		exit(0);
-	else
+	} else
 		/* child lives */
 		return (child(NULL));
 }