aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debianutils/start_stop_daemon.c11
-rw-r--r--init/start_stop_daemon.c11
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
23static int start = 0; 23static int start = 0;
24static int stop = 0; 24static int stop = 0;
25static int fork_before_exec = 0;
25static int signal_nr = 15; 26static int signal_nr = 15;
26static int user_id = -1; 27static int user_id = -1;
27static const char *userspec = NULL; 28static 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
23static int start = 0; 23static int start = 0;
24static int stop = 0; 24static int stop = 0;
25static int fork_before_exec = 0;
25static int signal_nr = 15; 26static int signal_nr = 15;
26static int user_id = -1; 27static int user_id = -1;
27static const char *userspec = NULL; 28static 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}