aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libbb.h3
-rw-r--r--libbb/signals.c8
-rw-r--r--miscutils/inotifyd.c11
-rw-r--r--miscutils/microcom.c20
-rw-r--r--networking/telnet.c21
-rw-r--r--runit/runsvdir.c38
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 <linux/inotify.h>
-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 */