diff --git a/include/libbb.h b/include/libbb.h index 654643743..d059ac9de 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -278,7 +278,7 @@ char *xmalloc_follow_symlinks(const char *path); enum { - /* bb_signals(BB_SIGS_FATAL, handler) catches all signals which + /* bb_signals(BB_FATAL_SIGS, handler) catches all signals which * otherwise would kill us, except for those resulting from bugs: * SIGSEGV, SIGILL, SIGFPE. * Other fatal signals not included (TODO?): @@ -288,7 +288,7 @@ enum { * SIGSYS Bad argument to routine * SIGTRAP Trace/breakpoint trap */ - BB_SIGS_FATAL = 0 + BB_FATAL_SIGS = 0 + (1 << SIGHUP) + (1 << SIGINT) + (1 << SIGTERM) diff --git a/miscutils/less.c b/miscutils/less.c index 3a9dea039..1a67ca7ce 100644 --- a/miscutils/less.c +++ b/miscutils/less.c @@ -1400,7 +1400,7 @@ int less_main(int argc, char **argv) term_less.c_cc[VTIME] = 0; /* We want to restore term_orig on exit */ - bb_signals(BB_SIGS_FATAL, sig_catcher); + bb_signals(BB_FATAL_SIGS, sig_catcher); reinitialize(); while (1) { diff --git a/miscutils/watchdog.c b/miscutils/watchdog.c index 7fb16b861..a5061f5d7 100644 --- a/miscutils/watchdog.c +++ b/miscutils/watchdog.c @@ -46,7 +46,7 @@ int watchdog_main(int argc, char **argv) bb_daemonize_or_rexec(DAEMON_CHDIR_ROOT, argv); } - bb_signals(BB_SIGS_FATAL, watchdog_shutdown); + bb_signals(BB_FATAL_SIGS, watchdog_shutdown); /* Use known fd # - avoid needing global 'int fd' */ xmove_fd(xopen(argv[argc - 1], O_WRONLY), 3); diff --git a/networking/tcpudp.c b/networking/tcpudp.c index f97787497..5da4de505 100644 --- a/networking/tcpudp.c +++ b/networking/tcpudp.c @@ -264,7 +264,7 @@ int tcpudpsvd_main(int argc ATTRIBUTE_UNUSED, char **argv) sig_block(SIGCHLD); signal(SIGCHLD, sig_child_handler); - bb_signals(BB_SIGS_FATAL, sig_term_handler); + bb_signals(BB_FATAL_SIGS, sig_term_handler); signal(SIGPIPE, SIG_IGN); if (max_per_host) diff --git a/procps/top.c b/procps/top.c index fdd7584c8..85ceaccf7 100644 --- a/procps/top.c +++ b/procps/top.c @@ -108,8 +108,13 @@ enum { LINE_BUF_SIZE = COMMON_BUFSIZE - offsetof(struct globals, line_buf) }; #define total_pcpu (G.total_pcpu ) #define line_buf (G.line_buf ) - -#define OPT_BATCH_MODE (option_mask32 & 0x4) +enum { + OPT_d = (1 << 0), + OPT_n = (1 << 1), + OPT_b = (1 << 2), + OPT_EOF = (1 << 3), /* pseudo: "we saw EOF in stdin" */ +}; +#define OPT_BATCH_MODE (option_mask32 & OPT_b) #if ENABLE_FEATURE_USE_TERMIOS @@ -165,7 +170,7 @@ static void get_jiffy_counts(void) if (fscanf(fp, "cpu %lld %lld %lld %lld %lld %lld %lld %lld", &jif.usr,&jif.nic,&jif.sys,&jif.idle, &jif.iowait,&jif.irq,&jif.softirq,&jif.steal) < 4) { - bb_error_msg_and_die("failed to read /proc/stat"); + bb_error_msg_and_die("can't read /proc/stat"); } fclose(fp); jif.total = jif.usr + jif.nic + jif.sys + jif.idle @@ -506,7 +511,7 @@ static void clearmems(void) static void reset_term(void) { - tcsetattr(0, TCSANOW, (void *) &initial_settings); + tcsetattr(0, TCSANOW, &initial_settings); if (ENABLE_FEATURE_CLEAN_UP) { clearmems(); #if ENABLE_FEATURE_TOP_CPU_USAGE_PERCENTAGE @@ -753,13 +758,13 @@ int top_main(int argc ATTRIBUTE_UNUSED, char **argv) INIT_G(); - interval = 5; /* default update rate is 5 seconds */ + interval = 5; /* default update interval is 5 seconds */ iterations = 0; /* infinite */ - /* do normal option parsing */ + /* all args are options; -n NUM */ opt_complementary = "-:n+"; getopt32(argv, "d:n:b", &sinterval, &iterations); - if (option_mask32 & 0x1) { + if (option_mask32 & OPT_d) { /* Need to limit it to not overflow poll timeout */ interval = xatou16(sinterval); // -d } @@ -772,12 +777,8 @@ int top_main(int argc ATTRIBUTE_UNUSED, char **argv) /* unbuffered input, turn off echo */ new_settings.c_lflag &= ~(ISIG | ICANON | ECHO | ECHONL); - bb_signals(0 - + (1 << SIGTERM) - + (1 << SIGINT) - , sig_catcher); + bb_signals(BB_FATAL_SIGS, sig_catcher); tcsetattr(0, TCSANOW, (void *) &new_settings); - atexit(reset_term); #endif /* FEATURE_USE_TERMIOS */ #if ENABLE_FEATURE_TOP_CPU_USAGE_PERCENTAGE @@ -794,7 +795,8 @@ int top_main(int argc ATTRIBUTE_UNUSED, char **argv) lines = 24; /* default */ col = 79; #if ENABLE_FEATURE_USE_TERMIOS - get_terminal_width_height(0, &col, &lines); + /* We output to stdout, we need size of stdout (not stdin)! */ + get_terminal_width_height(STDOUT_FILENO, &col, &lines); if (lines < 5 || col < 10) { sleep(interval); continue; @@ -839,9 +841,10 @@ int top_main(int argc ATTRIBUTE_UNUSED, char **argv) topmem[n].stack = p->stack; #endif } - } + } /* end of "while we read /proc" */ if (ntop == 0) { - bb_error_msg_and_die("no process info in /proc"); + bb_error_msg("no process info in /proc"); + break; } if (scan_mask == TOP_MASK) { @@ -875,9 +878,14 @@ int top_main(int argc ATTRIBUTE_UNUSED, char **argv) #if !ENABLE_FEATURE_USE_TERMIOS sleep(interval); #else - if (safe_poll(pfd, 1, interval * 1000) > 0) { - if (read(0, &c, 1) != 1) /* signal */ - break; + if (option_mask32 & (OPT_b|OPT_EOF)) + /* batch mode, or EOF on stdin ("top 0) { + if (safe_read(0, &c, 1) != 1) { /* error/EOF? */ + option_mask32 |= OPT_EOF; + continue; + } if (c == initial_settings.c_cc[VINTR]) break; c |= 0x20; /* lowercase */ @@ -922,7 +930,9 @@ int top_main(int argc ATTRIBUTE_UNUSED, char **argv) #endif } #endif /* FEATURE_USE_TERMIOS */ - } + } /* end of "while (1)" */ + bb_putchar('\n'); + reset_term(); return EXIT_SUCCESS; }