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 | } |
