diff options
| author | aldot <aldot@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2006-06-11 17:24:01 +0000 |
|---|---|---|
| committer | aldot <aldot@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2006-06-11 17:24:01 +0000 |
| commit | 5e80b79bca7db561f24d51f5156a5a3dc1b8ce47 (patch) | |
| tree | c6a139d9c660cf03cfa98721788c602500fe3ede /debianutils | |
| parent | 6b61d2c978017eeaaffb7f97b4cb3ea92f6ec72c (diff) | |
| download | busybox-w32-5e80b79bca7db561f24d51f5156a5a3dc1b8ce47.tar.gz busybox-w32-5e80b79bca7db561f24d51f5156a5a3dc1b8ce47.tar.bz2 busybox-w32-5e80b79bca7db561f24d51f5156a5a3dc1b8ce47.zip | |
- add fancy mode to start-stop-daemon to support --oknodo and --verbose
git-svn-id: svn://busybox.net/trunk/busybox@15360 69ca8d6d-28ef-0310-b511-8ec308f3f277
Diffstat (limited to 'debianutils')
| -rw-r--r-- | debianutils/Config.in | 9 | ||||
| -rw-r--r-- | debianutils/start_stop_daemon.c | 106 |
2 files changed, 68 insertions, 47 deletions
diff --git a/debianutils/Config.in b/debianutils/Config.in index 626272474..3dd2ef61b 100644 --- a/debianutils/Config.in +++ b/debianutils/Config.in | |||
| @@ -61,6 +61,15 @@ config CONFIG_START_STOP_DAEMON | |||
| 61 | termination of system-level processes, usually the ones | 61 | termination of system-level processes, usually the ones |
| 62 | started during the startup of the system. | 62 | started during the startup of the system. |
| 63 | 63 | ||
| 64 | config CONFIG_FEATURE_START_STOP_DAEMON_FANCY | ||
| 65 | bool "Support additional arguments" | ||
| 66 | default y | ||
| 67 | depends on CONFIG_START_STOP_DAEMON | ||
| 68 | help | ||
| 69 | Support additional arguments. | ||
| 70 | -o|--oknodo ignored since we exit with 0 anyway | ||
| 71 | -v|--verbose | ||
| 72 | |||
| 64 | config CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS | 73 | config CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS |
| 65 | bool "Enable long options" | 74 | bool "Enable long options" |
| 66 | default n | 75 | default n |
diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c index b83a75994..3a0fbd2c6 100644 --- a/debianutils/start_stop_daemon.c +++ b/debianutils/start_stop_daemon.c | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | 22 | ||
| 23 | static int signal_nr = 15; | 23 | static int signal_nr = 15; |
| 24 | static int user_id = -1; | 24 | static int user_id = -1; |
| 25 | static int quiet = 0; | 25 | static int quiet; |
| 26 | static char *userspec = NULL; | 26 | static char *userspec = NULL; |
| 27 | static char *cmdname = NULL; | 27 | static char *cmdname = NULL; |
| 28 | static char *execname = NULL; | 28 | static char *execname = NULL; |
| @@ -35,8 +35,7 @@ struct pid_list { | |||
| 35 | 35 | ||
| 36 | static struct pid_list *found = NULL; | 36 | static struct pid_list *found = NULL; |
| 37 | 37 | ||
| 38 | static inline void | 38 | static inline void push(pid_t pid) |
| 39 | push(pid_t pid) | ||
| 40 | { | 39 | { |
| 41 | struct pid_list *p; | 40 | struct pid_list *p; |
| 42 | 41 | ||
| @@ -46,8 +45,7 @@ push(pid_t pid) | |||
| 46 | found = p; | 45 | found = p; |
| 47 | } | 46 | } |
| 48 | 47 | ||
| 49 | static int | 48 | static int pid_is_exec(pid_t pid, const char *name) |
| 50 | pid_is_exec(pid_t pid, const char *name) | ||
| 51 | { | 49 | { |
| 52 | char buf[32]; | 50 | char buf[32]; |
| 53 | struct stat sb, exec_stat; | 51 | struct stat sb, exec_stat; |
| @@ -61,8 +59,7 @@ pid_is_exec(pid_t pid, const char *name) | |||
| 61 | return (sb.st_dev == exec_stat.st_dev && sb.st_ino == exec_stat.st_ino); | 59 | return (sb.st_dev == exec_stat.st_dev && sb.st_ino == exec_stat.st_ino); |
| 62 | } | 60 | } |
| 63 | 61 | ||
| 64 | static int | 62 | static int pid_is_user(int pid, int uid) |
| 65 | pid_is_user(int pid, int uid) | ||
| 66 | { | 63 | { |
| 67 | struct stat sb; | 64 | struct stat sb; |
| 68 | char buf[32]; | 65 | char buf[32]; |
| @@ -73,8 +70,7 @@ pid_is_user(int pid, int uid) | |||
| 73 | return (sb.st_uid == uid); | 70 | return (sb.st_uid == uid); |
| 74 | } | 71 | } |
| 75 | 72 | ||
| 76 | static int | 73 | static int pid_is_cmd(pid_t pid, const char *name) |
| 77 | pid_is_cmd(pid_t pid, const char *name) | ||
| 78 | { | 74 | { |
| 79 | char buf[32]; | 75 | char buf[32]; |
| 80 | FILE *f; | 76 | FILE *f; |
| @@ -98,8 +94,7 @@ pid_is_cmd(pid_t pid, const char *name) | |||
| 98 | } | 94 | } |
| 99 | 95 | ||
| 100 | 96 | ||
| 101 | static void | 97 | static void check(int pid) |
| 102 | check(int pid) | ||
| 103 | { | 98 | { |
| 104 | if (execname && !pid_is_exec(pid, execname)) { | 99 | if (execname && !pid_is_exec(pid, execname)) { |
| 105 | return; | 100 | return; |
| @@ -114,8 +109,7 @@ check(int pid) | |||
| 114 | } | 109 | } |
| 115 | 110 | ||
| 116 | 111 | ||
| 117 | static void | 112 | static void do_pidfile(void) |
| 118 | do_pidfile(void) | ||
| 119 | { | 113 | { |
| 120 | FILE *f; | 114 | FILE *f; |
| 121 | pid_t pid; | 115 | pid_t pid; |
| @@ -130,8 +124,7 @@ do_pidfile(void) | |||
| 130 | 124 | ||
| 131 | } | 125 | } |
| 132 | 126 | ||
| 133 | static void | 127 | static void do_procinit(void) |
| 134 | do_procinit(void) | ||
| 135 | { | 128 | { |
| 136 | DIR *procdir; | 129 | DIR *procdir; |
| 137 | struct dirent *entry; | 130 | struct dirent *entry; |
| @@ -157,17 +150,16 @@ do_procinit(void) | |||
| 157 | } | 150 | } |
| 158 | 151 | ||
| 159 | 152 | ||
| 160 | static void | 153 | static int do_stop(void) |
| 161 | do_stop(void) | ||
| 162 | { | 154 | { |
| 163 | char what[1024]; | 155 | RESERVE_CONFIG_BUFFER(what, 1024); |
| 164 | struct pid_list *p; | 156 | struct pid_list *p; |
| 165 | int killed = 0; | 157 | int killed = 0; |
| 166 | 158 | ||
| 167 | do_procinit(); | 159 | do_procinit(); |
| 168 | 160 | ||
| 169 | if (cmdname) | 161 | if (cmdname) |
| 170 | strcpy(what, cmdname); | 162 | what=cmdname;//strcpy(what, cmdname); |
| 171 | else if (execname) | 163 | else if (execname) |
| 172 | strcpy(what, execname); | 164 | strcpy(what, execname); |
| 173 | else if (pidfile) | 165 | else if (pidfile) |
| @@ -180,7 +172,9 @@ do_stop(void) | |||
| 180 | if (!found) { | 172 | if (!found) { |
| 181 | if (!quiet) | 173 | if (!quiet) |
| 182 | printf("no %s found; none killed.\n", what); | 174 | printf("no %s found; none killed.\n", what); |
| 183 | return; | 175 | if (ENABLE_FEATURE_CLEAN_UP) |
| 176 | RELEASE_CONFIG_BUFFER(what); | ||
| 177 | return -1; | ||
| 184 | } | 178 | } |
| 185 | for (p = found; p; p = p->next) { | 179 | for (p = found; p; p = p->next) { |
| 186 | if (kill(p->pid, signal_nr) == 0) { | 180 | if (kill(p->pid, signal_nr) == 0) { |
| @@ -197,21 +191,31 @@ do_stop(void) | |||
| 197 | printf(" %d", -p->pid); | 191 | printf(" %d", -p->pid); |
| 198 | printf(").\n"); | 192 | printf(").\n"); |
| 199 | } | 193 | } |
| 194 | if (ENABLE_FEATURE_CLEAN_UP) | ||
| 195 | RELEASE_CONFIG_BUFFER(what); | ||
| 196 | return killed; | ||
| 200 | } | 197 | } |
| 201 | 198 | ||
| 202 | #if ENABLE_FEATURE_START_STOP_DAEMON_LONG_OPTIONS | 199 | #if ENABLE_FEATURE_START_STOP_DAEMON_LONG_OPTIONS |
| 203 | static const struct option ssd_long_options[] = { | 200 | static const struct option ssd_long_options[] = { |
| 204 | { "stop", 0, NULL, 'K' }, | 201 | { "stop", 0, NULL, 'K' }, |
| 205 | { "start", 0, NULL, 'S' }, | 202 | { "start", 0, NULL, 'S' }, |
| 206 | { "background", 0, NULL, 'b' }, | 203 | { "background", 0, NULL, 'b' }, |
| 207 | { "quiet", 0, NULL, 'q' }, | 204 | { "quiet", 0, NULL, 'q' }, |
| 208 | { "make-pidfile", 0, NULL, 'm' }, | 205 | { "make-pidfile", 0, NULL, 'm' }, |
| 209 | { "startas", 1, NULL, 'a' }, | 206 | #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY |
| 207 | { "oknodo", 0, NULL, 'o' }, | ||
| 208 | { "verbose", 0, NULL, 'v' }, | ||
| 209 | #endif | ||
| 210 | { "startas", 1, NULL, 'a' }, | ||
| 210 | { "name", 1, NULL, 'n' }, | 211 | { "name", 1, NULL, 'n' }, |
| 211 | { "signal", 1, NULL, 's' }, | 212 | { "signal", 1, NULL, 's' }, |
| 212 | { "user", 1, NULL, 'u' }, | 213 | { "user", 1, NULL, 'u' }, |
| 213 | { "exec", 1, NULL, 'x' }, | 214 | { "exec", 1, NULL, 'x' }, |
| 214 | { "pidfile", 1, NULL, 'p' }, | 215 | { "pidfile", 1, NULL, 'p' }, |
| 216 | #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY | ||
| 217 | { "retry", 1, NULL, 'R' }, | ||
| 218 | #endif | ||
| 215 | { 0, 0, 0, 0 } | 219 | { 0, 0, 0, 0 } |
| 216 | }; | 220 | }; |
| 217 | #endif | 221 | #endif |
| @@ -221,42 +225,48 @@ static const struct option ssd_long_options[] = { | |||
| 221 | #define SSD_OPT_BACKGROUND 4 | 225 | #define SSD_OPT_BACKGROUND 4 |
| 222 | #define SSD_OPT_QUIET 8 | 226 | #define SSD_OPT_QUIET 8 |
| 223 | #define SSD_OPT_MAKEPID 16 | 227 | #define SSD_OPT_MAKEPID 16 |
| 228 | #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY | ||
| 229 | #define SSD_OPT_OKNODO 32 | ||
| 230 | #define SSD_OPT_VERBOSE 64 | ||
| 224 | 231 | ||
| 225 | int | 232 | #endif |
| 226 | start_stop_daemon_main(int argc, char **argv) | 233 | |
| 234 | int start_stop_daemon_main(int argc, char **argv) | ||
| 227 | { | 235 | { |
| 228 | unsigned long opt; | 236 | unsigned long opt; |
| 229 | char *signame = NULL; | 237 | char *signame = NULL; |
| 230 | char *startas = NULL; | 238 | char *startas = NULL; |
| 231 | 239 | #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY | |
| 240 | // char *retry_arg = NULL; | ||
| 241 | // int retries = -1; | ||
| 242 | #endif | ||
| 232 | #if ENABLE_FEATURE_START_STOP_DAEMON_LONG_OPTIONS | 243 | #if ENABLE_FEATURE_START_STOP_DAEMON_LONG_OPTIONS |
| 233 | bb_applet_long_options = ssd_long_options; | 244 | bb_applet_long_options = ssd_long_options; |
| 234 | #endif | 245 | #endif |
| 235 | 246 | ||
| 236 | /* Check required one context option was given */ | 247 | /* Check required one context option was given */ |
| 237 | bb_opt_complementally = "K:S:?:K--S:S--K"; | 248 | bb_opt_complementally = "K:S:?:K--S:S--K:m?p:K?xpun:S?xa"; |
| 238 | opt = bb_getopt_ulflags(argc, argv, "KSbqma:n:s:u:x:p:", | 249 | opt = bb_getopt_ulflags(argc, argv, "KSbqm" |
| 239 | &startas, &cmdname, &signame, &userspec, &execname, &pidfile); | 250 | // USE_FEATURE_START_STOP_DAEMON_FANCY("ovR:") |
| 240 | 251 | USE_FEATURE_START_STOP_DAEMON_FANCY("ov") | |
| 252 | "a:n:s:u:x:p:" | ||
| 253 | // USE_FEATURE_START_STOP_DAEMON_FANCY(,&retry_arg) | ||
| 254 | ,&startas, &cmdname, &signame, &userspec, &execname, &pidfile); | ||
| 241 | 255 | ||
| 242 | quiet = opt & SSD_OPT_QUIET; | 256 | quiet = (opt & SSD_OPT_QUIET) |
| 257 | USE_FEATURE_START_STOP_DAEMON_FANCY(&& !(opt & SSD_OPT_VERBOSE)); | ||
| 243 | 258 | ||
| 244 | if (signame) { | 259 | if (signame) { |
| 245 | signal_nr = bb_xgetlarg(signame, 10, 0, NSIG); | 260 | signal_nr = bb_xgetlarg(signame, 10, 0, NSIG); |
| 246 | } | 261 | } |
| 247 | 262 | ||
| 248 | if (!execname && !pidfile && !userspec && !cmdname) | ||
| 249 | bb_error_msg_and_die ("need at least one of -x, -p, -u, or -n"); | ||
| 250 | |||
| 251 | if (!startas) | 263 | if (!startas) |
| 252 | startas = execname; | 264 | startas = execname; |
| 253 | 265 | ||
| 254 | if ((opt & SSD_CTX_START) && !startas) | 266 | // USE_FEATURE_START_STOP_DAEMON_FANCY( |
| 255 | bb_error_msg_and_die ("-S needs -x or -a"); | 267 | // if (retry_arg) |
| 256 | 268 | // retries = bb_xgetlarg(retry_arg, 10, 0, INT_MAX); | |
| 257 | if ((opt & SSD_OPT_MAKEPID) && pidfile == NULL) | 269 | // ) |
| 258 | bb_error_msg_and_die ("-m needs -p"); | ||
| 259 | |||
| 260 | argc -= optind; | 270 | argc -= optind; |
| 261 | argv += optind; | 271 | argv += optind; |
| 262 | 272 | ||
| @@ -264,8 +274,10 @@ start_stop_daemon_main(int argc, char **argv) | |||
| 264 | user_id = bb_xgetpwnam(userspec); | 274 | user_id = bb_xgetpwnam(userspec); |
| 265 | 275 | ||
| 266 | if (opt & SSD_CTX_STOP) { | 276 | if (opt & SSD_CTX_STOP) { |
| 267 | do_stop(); | 277 | int i = do_stop(); |
| 268 | return EXIT_SUCCESS; | 278 | return |
| 279 | USE_FEATURE_START_STOP_DAEMON_FANCY((opt & SSD_OPT_OKNODO) | ||
| 280 | ? 0 :) !!(i<=0); | ||
| 269 | } | 281 | } |
| 270 | 282 | ||
| 271 | do_procinit(); | 283 | do_procinit(); |
| @@ -273,7 +285,8 @@ start_stop_daemon_main(int argc, char **argv) | |||
| 273 | if (found) { | 285 | if (found) { |
| 274 | if (!quiet) | 286 | if (!quiet) |
| 275 | printf("%s already running.\n%d\n", execname ,found->pid); | 287 | printf("%s already running.\n%d\n", execname ,found->pid); |
| 276 | return EXIT_SUCCESS; | 288 | USE_FEATURE_START_STOP_DAEMON_FANCY(return !(opt & SSD_OPT_OKNODO);) |
| 289 | SKIP_FEATURE_START_STOP_DAEMON_FANCY(return EXIT_FAILURE;) | ||
| 277 | } | 290 | } |
| 278 | *--argv = startas; | 291 | *--argv = startas; |
| 279 | if (opt & SSD_OPT_BACKGROUND) { | 292 | if (opt & SSD_OPT_BACKGROUND) { |
| @@ -282,10 +295,9 @@ start_stop_daemon_main(int argc, char **argv) | |||
| 282 | } | 295 | } |
| 283 | if (opt & SSD_OPT_MAKEPID) { | 296 | if (opt & SSD_OPT_MAKEPID) { |
| 284 | /* user wants _us_ to make the pidfile */ | 297 | /* user wants _us_ to make the pidfile */ |
| 285 | FILE *pidf = fopen(pidfile, "w"); | 298 | FILE *pidf = bb_xfopen(pidfile, "w"); |
| 299 | |||
| 286 | pid_t pidt = getpid(); | 300 | pid_t pidt = getpid(); |
| 287 | if (pidf == NULL) | ||
| 288 | bb_perror_msg_and_die("Unable to write pidfile '%s'", pidfile); | ||
| 289 | fprintf(pidf, "%d\n", pidt); | 301 | fprintf(pidf, "%d\n", pidt); |
| 290 | fclose(pidf); | 302 | fclose(pidf); |
| 291 | } | 303 | } |
