--- 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; /* @@ -1704,6 +1705,12 @@ sigusr2 (int sig) } static void +sigalrm (int sig) +{ + exit(0); +} + +static void signal_init(void) { sigset_t set; @@ -1806,6 +1813,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); @@ -1897,8 +1907,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 */ @@ -1978,7 +1986,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; @@ -1986,10 +1997,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); @@ -2000,30 +2014,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 @@ -2102,10 +2120,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)); }