aboutsummaryrefslogtreecommitdiff
path: root/debianutils
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2006-10-08 23:36:17 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2006-10-08 23:36:17 +0000
commitca3c981c07ade7f8fd50ba4bb452a2fadaddc326 (patch)
tree8763d9f89197adda0ef45ac57418743766345fe4 /debianutils
parent7039a66b58706457c7423de60556e04545432943 (diff)
downloadbusybox-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.c73
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
14static int signal_nr = 15; 15static int signal_nr = 15;
15static int user_id = -1; 16static 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
193static const struct option ssd_long_options[] = { 194static 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
228int start_stop_daemon_main(int argc, char **argv) 230int 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}