From 08ea11ab0749a7977e6d47cd0fa7b3c9cc10af32 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Thu, 11 Sep 2008 19:51:11 +0000 Subject: [PATCH] runsvd: shrink by Vladimir *: use unified trivial signal handler function old new delta record_signo - 10 +10 process_stdin 433 443 +10 bbunpack 383 391 +8 wc_main 598 605 +7 conescape 293 296 +3 nmeter_main 670 672 +2 fallbackSort 1717 1719 +2 bb_got_signal - 1 +1 microcom_main 713 712 -1 signalled 2 - -2 pack_gzip 1661 1659 -2 evalvar 1376 1374 -2 compare_keys 737 735 -2 parse_command 1460 1456 -4 expand 1748 1744 -4 s_term 37 29 -8 s_hangup 8 - -8 fgotsig 10 - -10 find_pair 187 169 -18 signal_handler 190 170 -20 runsvdir_main 1701 1583 -118 ------------------------------------------------------------------------------ (add/remove: 2/3 grow/shrink: 6/10 up/down: 43/-199) Total: -156 bytes --- include/libbb.h | 3 +++ libbb/signals.c | 8 ++++++++ miscutils/inotifyd.c | 11 ++--------- miscutils/microcom.c | 20 ++++++-------------- networking/telnet.c | 21 +++++++-------------- runit/runsvdir.c | 38 +++++++++----------------------------- 6 files changed, 35 insertions(+), 66 deletions(-) diff --git a/include/libbb.h b/include/libbb.h index 388e2f9ef..34c7e417b 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -373,6 +373,9 @@ void sig_unblock(int sig) FAST_FUNC; int sigaction_set(int sig, const struct sigaction *act) FAST_FUNC; /* SIG_BLOCK/SIG_UNBLOCK all signals: */ int sigprocmask_allsigs(int how) FAST_FUNC; +/* Standard handler which just records signo */ +extern smallint bb_got_signal; +void record_signo(int signo); /* not FAST_FUNC! */ void xsetgid(gid_t gid) FAST_FUNC; diff --git a/libbb/signals.c b/libbb/signals.c index 959114679..f56ce65a8 100644 --- a/libbb/signals.c +++ b/libbb/signals.c @@ -11,6 +11,14 @@ #include "libbb.h" +/* All known arches use small ints for signals */ +smallint bb_got_signal; + +void record_signo(int signo) +{ + bb_got_signal = signo; +} + /* Saves 2 bytes on x86! Oh my... */ int FAST_FUNC sigaction_set(int signum, const struct sigaction *act) { diff --git a/miscutils/inotifyd.c b/miscutils/inotifyd.c index 2a1a15348..3b11dc271 100644 --- a/miscutils/inotifyd.c +++ b/miscutils/inotifyd.c @@ -30,13 +30,6 @@ #include "libbb.h" #include -static volatile smallint signalled; - -static void signal_handler(int signo) -{ - signalled = signo; -} - static const char mask_names[] ALIGN1 = "a" // 0x00000001 File was accessed "c" // 0x00000002 File was modified @@ -104,14 +97,14 @@ int inotifyd_main(int argc UNUSED_PARAM, char **argv) + (1 << SIGINT) + (1 << SIGTERM) + (1 << SIGPIPE) - , signal_handler); + , record_signo); // do watch // pfd.fd = fd; pfd.events = POLLIN; - while (!signalled && poll(&pfd, 1, -1) > 0) { + while (!bb_got_signal && poll(&pfd, 1, -1) > 0) { ssize_t len; void *buf; struct inotify_event *ie; diff --git a/miscutils/microcom.c b/miscutils/microcom.c index ac3e5514f..a322197b8 100644 --- a/miscutils/microcom.c +++ b/miscutils/microcom.c @@ -9,14 +9,6 @@ */ #include "libbb.h" -/* All known arches use small ints for signals */ -static volatile smallint signalled; - -static void signal_handler(int signo) -{ - signalled = signo; -} - // set raw tty mode static void xget1(int fd, struct termios *t, struct termios *oldt) { @@ -91,10 +83,10 @@ int microcom_main(int argc UNUSED_PARAM, char **argv) + (1 << SIGINT) + (1 << SIGTERM) + (1 << SIGPIPE) - , signal_handler); + , record_signo); // error exit code if we fail to open the device - signalled = 1; + bb_got_signal = 1; // open device sfd = open_or_warn(argv[0], O_RDWR | O_NOCTTY | O_NONBLOCK); @@ -123,9 +115,9 @@ int microcom_main(int argc UNUSED_PARAM, char **argv) pfd[1].fd = STDIN_FILENO; pfd[1].events = POLLIN; - signalled = 0; + bb_got_signal = 0; nfd = 2; - while (!signalled && safe_poll(pfd, nfd, timeout) > 0) { + while (!bb_got_signal && safe_poll(pfd, nfd, timeout) > 0) { if (nfd > 1 && pfd[1].revents) { char c; // read from stdin -> write to device @@ -159,7 +151,7 @@ skip_write: ; full_write(STDOUT_FILENO, iobuf, len); else { // EOF/error -> bail out - signalled = SIGHUP; + bb_got_signal = SIGHUP; break; } } @@ -175,5 +167,5 @@ done: if (device_lock_file) unlink(device_lock_file); - return signalled; + return bb_got_signal; } diff --git a/networking/telnet.c b/networking/telnet.c index 63ee38088..5d7ecef3b 100644 --- a/networking/telnet.c +++ b/networking/telnet.c @@ -60,7 +60,6 @@ struct globals { byte telwish; /* DO, DONT, WILL, WONT */ byte charmode; byte telflags; - byte gotsig; byte do_termios; #if ENABLE_FEATURE_TELNET_TTYPE char *ttype; @@ -113,7 +112,7 @@ static void conescape(void) { char b; - if (G.gotsig) /* came from line mode... go raw */ + if (bb_got_signal) /* came from line mode... go raw */ rawmode(); write_str(1, "\r\nConsole escape. Commands are:\r\n\n" @@ -127,13 +126,13 @@ static void conescape(void) switch (b) { case 'l': - if (!G.gotsig) { + if (!bb_got_signal) { do_linemode(); goto rrturn; } break; case 'c': - if (G.gotsig) { + if (bb_got_signal) { will_charmode(); goto rrturn; } @@ -149,11 +148,11 @@ static void conescape(void) write_str(1, "continuing...\r\n"); - if (G.gotsig) + if (bb_got_signal) cookmode(); rrturn: - G.gotsig = 0; + bb_got_signal = 0; } @@ -524,12 +523,6 @@ static int subneg(byte c) return FALSE; } -static void fgotsig(int sig) -{ - G.gotsig = sig; -} - - static void rawmode(void) { if (G.do_termios) @@ -592,7 +585,7 @@ int telnet_main(int argc UNUSED_PARAM, char **argv) setsockopt(netfd, SOL_SOCKET, SO_KEEPALIVE, &const_int_1, sizeof(const_int_1)); - signal(SIGINT, fgotsig); + signal(SIGINT, record_signo); #ifdef USE_POLL ufds[0].fd = 0; ufds[1].fd = netfd; @@ -617,7 +610,7 @@ int telnet_main(int argc UNUSED_PARAM, char **argv) /* timeout */ case -1: /* error, ignore and/or log something, bay go to loop */ - if (G.gotsig) + if (bb_got_signal) conescape(); else sleep(1); diff --git a/runit/runsvdir.c b/runit/runsvdir.c index aaa4c470c..0dedd5c77 100644 --- a/runit/runsvdir.c +++ b/runit/runsvdir.c @@ -52,7 +52,6 @@ struct globals { struct pollfd pfd[1]; unsigned stamplog; smallint check; /* = 1; */ - smallint exitsoon; smallint set_pgrp; }; #define G (*(struct globals*)&bb_common_bufsiz1) @@ -65,7 +64,6 @@ struct globals { #define pfd (G.pfd ) #define stamplog (G.stamplog ) #define check (G.check ) -#define exitsoon (G.exitsoon ) #define set_pgrp (G.set_pgrp ) #define INIT_G() do { \ check = 1; \ @@ -89,15 +87,6 @@ static void warnx(const char *m1) warn3x(m1, "", ""); } -static void s_term(int sig_no UNUSED_PARAM) -{ - exitsoon = 1; -} -static void s_hangup(int sig_no UNUSED_PARAM) -{ - exitsoon = 2; -} - static void runsv(int no, const char *name) { pid_t pid; @@ -246,20 +235,11 @@ int runsvdir_main(int argc UNUSED_PARAM, char **argv) INIT_G(); - argv++; - if (!*argv) - bb_show_usage(); - if (argv[0][0] == '-') { - switch (argv[0][1]) { - case 'P': set_pgrp = 1; - case '-': ++argv; - } - if (!*argv) - bb_show_usage(); - } + opt_complementary = "-1"; + set_pgrp = getopt32(argv, "P"); + argv += optind; - bb_signals_recursive(1 << SIGTERM, s_term); - bb_signals_recursive(1 << SIGHUP, s_hangup); + bb_signals_recursive((1 << SIGTERM) | (1 << SIGHUP), record_signo); svdir = *argv++; if (argv && *argv) { rplog = *argv; @@ -346,14 +326,14 @@ int runsvdir_main(int argc UNUSED_PARAM, char **argv) } } - switch (exitsoon) { - case 1: - _exit(EXIT_SUCCESS); - case 2: + switch (bb_got_signal) { + case SIGHUP: for (i = 0; i < svnum; i++) if (sv[i].pid) kill(sv[i].pid, SIGTERM); - _exit(111); + // N.B. fall through + case SIGTERM: + _exit((SIGHUP == bb_got_signal) ? 111 : EXIT_SUCCESS); } } /* not reached */ -- 2.25.1