You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
2.8 KiB
128 lines
2.8 KiB
--- |
|
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)); |
|
}
|
|
|