diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2006-10-08 23:36:17 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2006-10-08 23:36:17 +0000 |
commit | ca3c981c07ade7f8fd50ba4bb452a2fadaddc326 (patch) | |
tree | 8763d9f89197adda0ef45ac57418743766345fe4 /debianutils | |
parent | 7039a66b58706457c7423de60556e04545432943 (diff) | |
download | busybox-w32-ca3c981c07ade7f8fd50ba4bb452a2fadaddc326.tar.gz busybox-w32-ca3c981c07ade7f8fd50ba4bb452a2fadaddc326.tar.bz2 busybox-w32-ca3c981c07ade7f8fd50ba4bb452a2fadaddc326.zip |
start_stop_daemon: add -N <nice> compat
[re]nice: add support for -nNNN w/o spaces, -NNN (nice only),
simplified code
Diffstat (limited to 'debianutils')
-rw-r--r-- | debianutils/start_stop_daemon.c | 73 |
1 files changed, 43 insertions, 30 deletions
diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c index 6ced9caad..a9f82c5cc 100644 --- a/debianutils/start_stop_daemon.c +++ b/debianutils/start_stop_daemon.c | |||
@@ -10,6 +10,7 @@ | |||
10 | 10 | ||
11 | #include "busybox.h" | 11 | #include "busybox.h" |
12 | #include <getopt.h> | 12 | #include <getopt.h> |
13 | #include <sys/resource.h> | ||
13 | 14 | ||
14 | static int signal_nr = 15; | 15 | static int signal_nr = 15; |
15 | static int user_id = -1; | 16 | static int user_id = -1; |
@@ -191,38 +192,39 @@ static int do_stop(void) | |||
191 | 192 | ||
192 | #if ENABLE_FEATURE_START_STOP_DAEMON_LONG_OPTIONS | 193 | #if ENABLE_FEATURE_START_STOP_DAEMON_LONG_OPTIONS |
193 | static const struct option ssd_long_options[] = { | 194 | static const struct option ssd_long_options[] = { |
194 | { "stop", 0, NULL, 'K' }, | 195 | { "stop", 0, NULL, 'K' }, |
195 | { "start", 0, NULL, 'S' }, | 196 | { "start", 0, NULL, 'S' }, |
196 | { "background", 0, NULL, 'b' }, | 197 | { "background", 0, NULL, 'b' }, |
197 | { "quiet", 0, NULL, 'q' }, | 198 | { "quiet", 0, NULL, 'q' }, |
198 | { "make-pidfile", 0, NULL, 'm' }, | 199 | { "make-pidfile", 0, NULL, 'm' }, |
199 | #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY | 200 | #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY |
200 | { "oknodo", 0, NULL, 'o' }, | 201 | { "oknodo", 0, NULL, 'o' }, |
201 | { "verbose", 0, NULL, 'v' }, | 202 | { "verbose", 0, NULL, 'v' }, |
203 | { "nicelevel", 1, NULL, 'N' }, | ||
202 | #endif | 204 | #endif |
203 | { "startas", 1, NULL, 'a' }, | 205 | { "startas", 1, NULL, 'a' }, |
204 | { "name", 1, NULL, 'n' }, | 206 | { "name", 1, NULL, 'n' }, |
205 | { "signal", 1, NULL, 's' }, | 207 | { "signal", 1, NULL, 's' }, |
206 | { "user", 1, NULL, 'u' }, | 208 | { "user", 1, NULL, 'u' }, |
207 | { "chuid", 1, NULL, 'c' }, | 209 | { "chuid", 1, NULL, 'c' }, |
208 | { "exec", 1, NULL, 'x' }, | 210 | { "exec", 1, NULL, 'x' }, |
209 | { "pidfile", 1, NULL, 'p' }, | 211 | { "pidfile", 1, NULL, 'p' }, |
210 | #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY | 212 | #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY |
211 | { "retry", 1, NULL, 'R' }, | 213 | { "retry", 1, NULL, 'R' }, |
212 | #endif | 214 | #endif |
213 | { 0, 0, 0, 0 } | 215 | { 0, 0, 0, 0 } |
214 | }; | 216 | }; |
215 | #endif | 217 | #endif |
216 | 218 | ||
217 | #define SSD_CTX_STOP 1 | 219 | #define SSD_CTX_STOP 0x1 |
218 | #define SSD_CTX_START 2 | 220 | #define SSD_CTX_START 0x2 |
219 | #define SSD_OPT_BACKGROUND 4 | 221 | #define SSD_OPT_BACKGROUND 0x4 |
220 | #define SSD_OPT_QUIET 8 | 222 | #define SSD_OPT_QUIET 0x8 |
221 | #define SSD_OPT_MAKEPID 16 | 223 | #define SSD_OPT_MAKEPID 0x10 |
222 | #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY | 224 | #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY |
223 | #define SSD_OPT_OKNODO 32 | 225 | #define SSD_OPT_OKNODO 0x20 |
224 | #define SSD_OPT_VERBOSE 64 | 226 | #define SSD_OPT_VERBOSE 0x40 |
225 | 227 | #define SSD_OPT_NICELEVEL 0x80 | |
226 | #endif | 228 | #endif |
227 | 229 | ||
228 | int start_stop_daemon_main(int argc, char **argv) | 230 | int start_stop_daemon_main(int argc, char **argv) |
@@ -233,6 +235,7 @@ int start_stop_daemon_main(int argc, char **argv) | |||
233 | #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY | 235 | #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY |
234 | // char *retry_arg = NULL; | 236 | // char *retry_arg = NULL; |
235 | // int retries = -1; | 237 | // int retries = -1; |
238 | char *opt_N; | ||
236 | #endif | 239 | #endif |
237 | #if ENABLE_FEATURE_START_STOP_DAEMON_LONG_OPTIONS | 240 | #if ENABLE_FEATURE_START_STOP_DAEMON_LONG_OPTIONS |
238 | applet_long_options = ssd_long_options; | 241 | applet_long_options = ssd_long_options; |
@@ -241,9 +244,10 @@ int start_stop_daemon_main(int argc, char **argv) | |||
241 | /* Check required one context option was given */ | 244 | /* Check required one context option was given */ |
242 | opt_complementary = "K:S:?:K--S:S--K:m?p:K?xpun:S?xa"; | 245 | opt_complementary = "K:S:?:K--S:S--K:m?p:K?xpun:S?xa"; |
243 | opt = getopt32(argc, argv, "KSbqm" | 246 | opt = getopt32(argc, argv, "KSbqm" |
244 | // USE_FEATURE_START_STOP_DAEMON_FANCY("ovR:") | 247 | // USE_FEATURE_START_STOP_DAEMON_FANCY("ovN:R:") |
245 | USE_FEATURE_START_STOP_DAEMON_FANCY("ov") | 248 | USE_FEATURE_START_STOP_DAEMON_FANCY("ovN:") |
246 | "a:n:s:u:c:x:p:" | 249 | "a:n:s:u:c:x:p:" |
250 | USE_FEATURE_START_STOP_DAEMON_FANCY(,&opt_N) | ||
247 | // USE_FEATURE_START_STOP_DAEMON_FANCY(,&retry_arg) | 251 | // USE_FEATURE_START_STOP_DAEMON_FANCY(,&retry_arg) |
248 | ,&startas, &cmdname, &signame, &userspec, &chuid, &execname, &pidfile); | 252 | ,&startas, &cmdname, &signame, &userspec, &chuid, &execname, &pidfile); |
249 | 253 | ||
@@ -279,7 +283,7 @@ int start_stop_daemon_main(int argc, char **argv) | |||
279 | 283 | ||
280 | if (found) { | 284 | if (found) { |
281 | if (!quiet) | 285 | if (!quiet) |
282 | printf("%s already running.\n%d\n", execname ,found->pid); | 286 | printf("%s already running\n%d\n", execname, found->pid); |
283 | USE_FEATURE_START_STOP_DAEMON_FANCY(return !(opt & SSD_OPT_OKNODO);) | 287 | USE_FEATURE_START_STOP_DAEMON_FANCY(return !(opt & SSD_OPT_OKNODO);) |
284 | SKIP_FEATURE_START_STOP_DAEMON_FANCY(return EXIT_FAILURE;) | 288 | SKIP_FEATURE_START_STOP_DAEMON_FANCY(return EXIT_FAILURE;) |
285 | } | 289 | } |
@@ -296,11 +300,20 @@ int start_stop_daemon_main(int argc, char **argv) | |||
296 | fprintf(pidf, "%d\n", pidt); | 300 | fprintf(pidf, "%d\n", pidt); |
297 | fclose(pidf); | 301 | fclose(pidf); |
298 | } | 302 | } |
299 | if(chuid) { | 303 | if (chuid) { |
300 | if(sscanf(chuid, "%d", &user_id) != 1) | 304 | if (sscanf(chuid, "%d", &user_id) != 1) |
301 | user_id = bb_xgetpwnam(chuid); | 305 | user_id = bb_xgetpwnam(chuid); |
302 | setuid(user_id); | 306 | xsetuid(user_id); |
303 | } | 307 | } |
308 | #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY | ||
309 | if (opt & SSD_OPT_NICELEVEL) { | ||
310 | /* Set process priority */ | ||
311 | int prio = getpriority(PRIO_PROCESS, 0) + xatoi_range(opt_N, INT_MIN/2, INT_MAX/2); | ||
312 | if (setpriority(PRIO_PROCESS, 0, prio) < 0) { | ||
313 | bb_perror_msg_and_die("setpriority(%d)", prio); | ||
314 | } | ||
315 | } | ||
316 | #endif | ||
304 | execv(startas, argv); | 317 | execv(startas, argv); |
305 | bb_perror_msg_and_die ("unable to start %s", startas); | 318 | bb_perror_msg_and_die ("unable to start %s", startas); |
306 | } | 319 | } |