diff options
-rw-r--r-- | debianutils/start_stop_daemon.c | 11 | ||||
-rw-r--r-- | init/start_stop_daemon.c | 11 |
2 files changed, 20 insertions, 2 deletions
diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c index c6b704329..ed4503caf 100644 --- a/debianutils/start_stop_daemon.c +++ b/debianutils/start_stop_daemon.c | |||
@@ -22,6 +22,7 @@ | |||
22 | 22 | ||
23 | static int start = 0; | 23 | static int start = 0; |
24 | static int stop = 0; | 24 | static int stop = 0; |
25 | static int fork_before_exec = 0; | ||
25 | static int signal_nr = 15; | 26 | static int signal_nr = 15; |
26 | static int user_id = -1; | 27 | static int user_id = -1; |
27 | static const char *userspec = NULL; | 28 | static const char *userspec = NULL; |
@@ -55,7 +56,7 @@ parse_options(int argc, char * const *argv) | |||
55 | int c; | 56 | int c; |
56 | 57 | ||
57 | for (;;) { | 58 | for (;;) { |
58 | c = getopt (argc, argv, "a:n:s:u:x:KS"); | 59 | c = getopt (argc, argv, "a:n:s:u:x:KSb"); |
59 | if (c == EOF) | 60 | if (c == EOF) |
60 | break; | 61 | break; |
61 | switch (c) { | 62 | switch (c) { |
@@ -81,6 +82,9 @@ parse_options(int argc, char * const *argv) | |||
81 | case 'x': | 82 | case 'x': |
82 | execname = optarg; | 83 | execname = optarg; |
83 | break; | 84 | break; |
85 | case 'b': | ||
86 | fork_before_exec = 1; | ||
87 | break; | ||
84 | default: | 88 | default: |
85 | show_usage(); | 89 | show_usage(); |
86 | } | 90 | } |
@@ -255,6 +259,11 @@ start_stop_daemon_main(int argc, char **argv) | |||
255 | return EXIT_SUCCESS; | 259 | return EXIT_SUCCESS; |
256 | } | 260 | } |
257 | *--argv = startas; | 261 | *--argv = startas; |
262 | if (fork_before_exec) { | ||
263 | if (daemon(0, 0) == -1) | ||
264 | perror_msg_and_die ("unable to fork"); | ||
265 | } | ||
266 | setsid(); | ||
258 | execv(startas, argv); | 267 | execv(startas, argv); |
259 | perror_msg_and_die ("unable to start %s", startas); | 268 | perror_msg_and_die ("unable to start %s", startas); |
260 | } | 269 | } |
diff --git a/init/start_stop_daemon.c b/init/start_stop_daemon.c index c6b704329..ed4503caf 100644 --- a/init/start_stop_daemon.c +++ b/init/start_stop_daemon.c | |||
@@ -22,6 +22,7 @@ | |||
22 | 22 | ||
23 | static int start = 0; | 23 | static int start = 0; |
24 | static int stop = 0; | 24 | static int stop = 0; |
25 | static int fork_before_exec = 0; | ||
25 | static int signal_nr = 15; | 26 | static int signal_nr = 15; |
26 | static int user_id = -1; | 27 | static int user_id = -1; |
27 | static const char *userspec = NULL; | 28 | static const char *userspec = NULL; |
@@ -55,7 +56,7 @@ parse_options(int argc, char * const *argv) | |||
55 | int c; | 56 | int c; |
56 | 57 | ||
57 | for (;;) { | 58 | for (;;) { |
58 | c = getopt (argc, argv, "a:n:s:u:x:KS"); | 59 | c = getopt (argc, argv, "a:n:s:u:x:KSb"); |
59 | if (c == EOF) | 60 | if (c == EOF) |
60 | break; | 61 | break; |
61 | switch (c) { | 62 | switch (c) { |
@@ -81,6 +82,9 @@ parse_options(int argc, char * const *argv) | |||
81 | case 'x': | 82 | case 'x': |
82 | execname = optarg; | 83 | execname = optarg; |
83 | break; | 84 | break; |
85 | case 'b': | ||
86 | fork_before_exec = 1; | ||
87 | break; | ||
84 | default: | 88 | default: |
85 | show_usage(); | 89 | show_usage(); |
86 | } | 90 | } |
@@ -255,6 +259,11 @@ start_stop_daemon_main(int argc, char **argv) | |||
255 | return EXIT_SUCCESS; | 259 | return EXIT_SUCCESS; |
256 | } | 260 | } |
257 | *--argv = startas; | 261 | *--argv = startas; |
262 | if (fork_before_exec) { | ||
263 | if (daemon(0, 0) == -1) | ||
264 | perror_msg_and_die ("unable to fork"); | ||
265 | } | ||
266 | setsid(); | ||
258 | execv(startas, argv); | 267 | execv(startas, argv); |
259 | perror_msg_and_die ("unable to start %s", startas); | 268 | perror_msg_and_die ("unable to start %s", startas); |
260 | } | 269 | } |