diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-11-06 22:39:57 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-11-06 22:39:57 +0000 |
| commit | 3854c5ddf4eb267e4e53796eaa1051421dcb4e08 (patch) | |
| tree | 7110eecec665bc64fefcdedaa29eb2e2fdf2df41 | |
| parent | 70e8f49f71b824bbc7c5ec825eb33108134d1ee5 (diff) | |
| download | busybox-w32-3854c5ddf4eb267e4e53796eaa1051421dcb4e08.tar.gz busybox-w32-3854c5ddf4eb267e4e53796eaa1051421dcb4e08.tar.bz2 busybox-w32-3854c5ddf4eb267e4e53796eaa1051421dcb4e08.zip | |
runsvdir: alternative methon of supporting runsvdir-as-init. +66 bytes.
*: s/int/pid_t where appropriate
| -rw-r--r-- | include/libbb.h | 8 | ||||
| -rw-r--r-- | libbb/vfork_daemon_rexec.c | 8 | ||||
| -rw-r--r-- | networking/tcpudp.c | 2 | ||||
| -rw-r--r-- | runit/runsv.c | 4 | ||||
| -rw-r--r-- | runit/runsvdir.c | 54 | ||||
| -rw-r--r-- | runit/svlogd.c | 3 |
6 files changed, 46 insertions, 33 deletions
diff --git a/include/libbb.h b/include/libbb.h index a6229a5e1..746db1c0e 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
| @@ -743,7 +743,7 @@ int bb_execvp(const char *file, char *const argv[]) FAST_FUNC; | |||
| 743 | pid_t spawn(char **argv) FAST_FUNC; | 743 | pid_t spawn(char **argv) FAST_FUNC; |
| 744 | pid_t xspawn(char **argv) FAST_FUNC; | 744 | pid_t xspawn(char **argv) FAST_FUNC; |
| 745 | 745 | ||
| 746 | int safe_waitpid(int pid, int *wstat, int options) FAST_FUNC; | 746 | pid_t safe_waitpid(pid_t pid, int *wstat, int options) FAST_FUNC; |
| 747 | /* Unlike waitpid, waits ONLY for one process. | 747 | /* Unlike waitpid, waits ONLY for one process. |
| 748 | * It's safe to pass negative 'pids' from failed [v]fork - | 748 | * It's safe to pass negative 'pids' from failed [v]fork - |
| 749 | * wait4pid will return -1 (and will not clobber [v]fork's errno). | 749 | * wait4pid will return -1 (and will not clobber [v]fork's errno). |
| @@ -751,14 +751,14 @@ int safe_waitpid(int pid, int *wstat, int options) FAST_FUNC; | |||
| 751 | * if (rc < 0) bb_perror_msg("%s", argv[0]); | 751 | * if (rc < 0) bb_perror_msg("%s", argv[0]); |
| 752 | * if (rc > 0) bb_error_msg("exit code: %d", rc); | 752 | * if (rc > 0) bb_error_msg("exit code: %d", rc); |
| 753 | */ | 753 | */ |
| 754 | int wait4pid(int pid) FAST_FUNC; | 754 | int wait4pid(pid_t pid) FAST_FUNC; |
| 755 | int wait_any_nohang(int *wstat) FAST_FUNC; | 755 | pid_t wait_any_nohang(int *wstat) FAST_FUNC; |
| 756 | #define wait_crashed(w) ((w) & 127) | 756 | #define wait_crashed(w) ((w) & 127) |
| 757 | #define wait_exitcode(w) ((w) >> 8) | 757 | #define wait_exitcode(w) ((w) >> 8) |
| 758 | #define wait_stopsig(w) ((w) >> 8) | 758 | #define wait_stopsig(w) ((w) >> 8) |
| 759 | #define wait_stopped(w) (((w) & 127) == 127) | 759 | #define wait_stopped(w) (((w) & 127) == 127) |
| 760 | /* wait4pid(spawn(argv)) + NOFORK/NOEXEC (if configured) */ | 760 | /* wait4pid(spawn(argv)) + NOFORK/NOEXEC (if configured) */ |
| 761 | int spawn_and_wait(char **argv) FAST_FUNC; | 761 | pid_t spawn_and_wait(char **argv) FAST_FUNC; |
| 762 | struct nofork_save_area { | 762 | struct nofork_save_area { |
| 763 | jmp_buf die_jmp; | 763 | jmp_buf die_jmp; |
| 764 | const char *applet_name; | 764 | const char *applet_name; |
diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c index 17b373cd1..50dc3affe 100644 --- a/libbb/vfork_daemon_rexec.c +++ b/libbb/vfork_daemon_rexec.c | |||
| @@ -66,9 +66,9 @@ pid_t FAST_FUNC xspawn(char **argv) | |||
| 66 | return pid; | 66 | return pid; |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | int FAST_FUNC safe_waitpid(int pid, int *wstat, int options) | 69 | pid_t FAST_FUNC safe_waitpid(pid_t pid, int *wstat, int options) |
| 70 | { | 70 | { |
| 71 | int r; | 71 | pid_t r; |
| 72 | 72 | ||
| 73 | do | 73 | do |
| 74 | r = waitpid(pid, wstat, options); | 74 | r = waitpid(pid, wstat, options); |
| @@ -76,13 +76,13 @@ int FAST_FUNC safe_waitpid(int pid, int *wstat, int options) | |||
| 76 | return r; | 76 | return r; |
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | int FAST_FUNC wait_any_nohang(int *wstat) | 79 | pid_t FAST_FUNC wait_any_nohang(int *wstat) |
| 80 | { | 80 | { |
| 81 | return safe_waitpid(-1, wstat, WNOHANG); | 81 | return safe_waitpid(-1, wstat, WNOHANG); |
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | // Wait for the specified child PID to exit, returning child's error return. | 84 | // Wait for the specified child PID to exit, returning child's error return. |
| 85 | int FAST_FUNC wait4pid(int pid) | 85 | int FAST_FUNC wait4pid(pid_t pid) |
| 86 | { | 86 | { |
| 87 | int status; | 87 | int status; |
| 88 | 88 | ||
diff --git a/networking/tcpudp.c b/networking/tcpudp.c index d6731198c..0d8217e02 100644 --- a/networking/tcpudp.c +++ b/networking/tcpudp.c | |||
| @@ -147,7 +147,7 @@ static void connection_status(void) | |||
| 147 | static void sig_child_handler(int sig UNUSED_PARAM) | 147 | static void sig_child_handler(int sig UNUSED_PARAM) |
| 148 | { | 148 | { |
| 149 | int wstat; | 149 | int wstat; |
| 150 | int pid; | 150 | pid_t pid; |
| 151 | 151 | ||
| 152 | while ((pid = wait_any_nohang(&wstat)) > 0) { | 152 | while ((pid = wait_any_nohang(&wstat)) > 0) { |
| 153 | if (max_per_host) | 153 | if (max_per_host) |
diff --git a/runit/runsv.c b/runit/runsv.c index bd0f3dcc2..56244d03f 100644 --- a/runit/runsv.c +++ b/runit/runsv.c | |||
| @@ -247,7 +247,7 @@ static void update_status(struct svdir *s) | |||
| 247 | 247 | ||
| 248 | static unsigned custom(struct svdir *s, char c) | 248 | static unsigned custom(struct svdir *s, char c) |
| 249 | { | 249 | { |
| 250 | int pid; | 250 | pid_t pid; |
| 251 | int w; | 251 | int w; |
| 252 | char a[10]; | 252 | char a[10]; |
| 253 | struct stat st; | 253 | struct stat st; |
| @@ -584,7 +584,7 @@ int runsv_main(int argc UNUSED_PARAM, char **argv) | |||
| 584 | continue; | 584 | continue; |
| 585 | 585 | ||
| 586 | for (;;) { | 586 | for (;;) { |
| 587 | int child; | 587 | pid_t child; |
| 588 | int wstat; | 588 | int wstat; |
| 589 | 589 | ||
| 590 | child = wait_any_nohang(&wstat); | 590 | child = wait_any_nohang(&wstat); |
diff --git a/runit/runsvdir.c b/runit/runsvdir.c index 581787f03..9d560e097 100644 --- a/runit/runsvdir.c +++ b/runit/runsvdir.c | |||
| @@ -107,7 +107,7 @@ static NOINLINE pid_t runsv(const char *name) | |||
| 107 | } | 107 | } |
| 108 | if (pid == 0) { | 108 | if (pid == 0) { |
| 109 | /* child */ | 109 | /* child */ |
| 110 | if (option_mask32) /* -P option? */ | 110 | if (option_mask32 & 1) /* -P option? */ |
| 111 | setsid(); | 111 | setsid(); |
| 112 | /* man execv: | 112 | /* man execv: |
| 113 | * "Signals set to be caught by the calling process image | 113 | * "Signals set to be caught by the calling process image |
| @@ -217,17 +217,20 @@ int runsvdir_main(int argc UNUSED_PARAM, char **argv) | |||
| 217 | time_t last_mtime = 0; | 217 | time_t last_mtime = 0; |
| 218 | int wstat; | 218 | int wstat; |
| 219 | int curdir; | 219 | int curdir; |
| 220 | int pid; | 220 | pid_t pid; |
| 221 | unsigned deadline; | 221 | unsigned deadline; |
| 222 | unsigned now; | 222 | unsigned now; |
| 223 | unsigned stampcheck; | 223 | unsigned stampcheck; |
| 224 | int i; | 224 | int i; |
| 225 | int need_rescan = 1; | 225 | int need_rescan = 1; |
| 226 | char *opt_s_argv[3]; | ||
| 226 | 227 | ||
| 227 | INIT_G(); | 228 | INIT_G(); |
| 228 | 229 | ||
| 229 | opt_complementary = "-1"; | 230 | opt_complementary = "-1"; |
| 230 | getopt32(argv, "P"); | 231 | opt_s_argv[0] = NULL; |
| 232 | opt_s_argv[2] = NULL; | ||
| 233 | getopt32(argv, "Ps:", &opt_s_argv[0]); | ||
| 231 | argv += optind; | 234 | argv += optind; |
| 232 | 235 | ||
| 233 | bb_signals(0 | 236 | bb_signals(0 |
| @@ -335,7 +338,6 @@ int runsvdir_main(int argc UNUSED_PARAM, char **argv) | |||
| 335 | pfd[0].revents = 0; | 338 | pfd[0].revents = 0; |
| 336 | #endif | 339 | #endif |
| 337 | deadline = (need_rescan ? 1 : 5); | 340 | deadline = (need_rescan ? 1 : 5); |
| 338 | do_sleep: | ||
| 339 | sig_block(SIGCHLD); | 341 | sig_block(SIGCHLD); |
| 340 | #if ENABLE_FEATURE_RUNSVDIR_LOG | 342 | #if ENABLE_FEATURE_RUNSVDIR_LOG |
| 341 | if (rplog) | 343 | if (rplog) |
| @@ -357,27 +359,37 @@ int runsvdir_main(int argc UNUSED_PARAM, char **argv) | |||
| 357 | } | 359 | } |
| 358 | } | 360 | } |
| 359 | #endif | 361 | #endif |
| 362 | if (!bb_got_signal) | ||
| 363 | continue; | ||
| 364 | |||
| 365 | /* -s SCRIPT: useful if we are init. | ||
| 366 | * In this case typically script never returns, | ||
| 367 | * it halts/powers off/reboots the system. */ | ||
| 368 | if (opt_s_argv[0]) { | ||
| 369 | /* Single parameter: signal# */ | ||
| 370 | opt_s_argv[1] = utoa(bb_got_signal); | ||
| 371 | pid = spawn(opt_s_argv); | ||
| 372 | if (pid > 0) { | ||
| 373 | /* Remebering to wait for _any_ children, | ||
| 374 | * not just pid */ | ||
| 375 | while (wait(NULL) != pid) | ||
| 376 | continue; | ||
| 377 | } | ||
| 378 | } | ||
| 379 | |||
| 360 | switch (bb_got_signal) { | 380 | switch (bb_got_signal) { |
| 361 | case 0: /* we are not signaled, business as usual */ | ||
| 362 | break; | ||
| 363 | case SIGHUP: | 381 | case SIGHUP: |
| 364 | for (i = 0; i < svnum; i++) | 382 | for (i = 0; i < svnum; i++) |
| 365 | if (sv[i].pid) | 383 | if (sv[i].pid) |
| 366 | kill(sv[i].pid, SIGTERM); | 384 | kill(sv[i].pid, SIGTERM); |
| 367 | /* fall through */ | 385 | /* Fall through */ |
| 368 | case SIGTERM: | 386 | default: /* SIGTERM (or SIGUSRn if we are init) */ |
| 369 | /* exit, unless we are init */ | 387 | /* Exit unless we are init */ |
| 370 | if (getpid() != 1) | 388 | if (getpid() == 1) |
| 371 | goto ret; | 389 | break; |
| 372 | default: | 390 | return (SIGHUP == bb_got_signal) ? 111 : EXIT_SUCCESS; |
| 373 | /* so we are init. do not exit, | ||
| 374 | * and pause respawning - we may be rebooting | ||
| 375 | * (but SIGHUP is not a reboot, make short pause) */ | ||
| 376 | deadline = (SIGHUP == bb_got_signal) ? 5 : 60; | ||
| 377 | bb_got_signal = 0; | ||
| 378 | goto do_sleep; | ||
| 379 | } | 391 | } |
| 380 | } | 392 | |
| 381 | ret: | 393 | bb_got_signal = 0; |
| 382 | return (SIGHUP == bb_got_signal) ? 111 : EXIT_SUCCESS; | 394 | } /* for (;;) */ |
| 383 | } | 395 | } |
diff --git a/runit/svlogd.c b/runit/svlogd.c index 960879513..64191281e 100644 --- a/runit/svlogd.c +++ b/runit/svlogd.c | |||
| @@ -797,7 +797,8 @@ static void sig_term_handler(int sig_no UNUSED_PARAM) | |||
| 797 | 797 | ||
| 798 | static void sig_child_handler(int sig_no UNUSED_PARAM) | 798 | static void sig_child_handler(int sig_no UNUSED_PARAM) |
| 799 | { | 799 | { |
| 800 | int pid, l; | 800 | pid_t pid; |
| 801 | int l; | ||
| 801 | 802 | ||
| 802 | if (verbose) | 803 | if (verbose) |
| 803 | bb_error_msg(INFO"sig%s received", "child"); | 804 | bb_error_msg(INFO"sig%s received", "child"); |
