summaryrefslogtreecommitdiffstats
path: root/0150-RHBZ-1253913-fix-startup-msg.patch
blob: ca661e8803dddb83ab3f58f8d319b739fcd3cdcf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
---
 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));
 }