X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=console-tools%2Fresize.c;h=a3342a1956bc43550450a98e850e8d79777afaee;hb=47cfbf32fd66563f8c4e09ad6cced6abfbe2fad5;hp=b4cdf50d0bf56fa5d483b5597fc862de03277a1a;hpb=9b49a5ed8551e46892af3f676e5d96d21b540e3c;p=oweals%2Fbusybox.git diff --git a/console-tools/resize.c b/console-tools/resize.c index b4cdf50d0..a3342a195 100644 --- a/console-tools/resize.c +++ b/console-tools/resize.c @@ -2,45 +2,57 @@ /* * resize - set terminal width and height. * - * Copyright 2006 Bernhard Fischer + * Copyright 2006 Bernhard Reutner-Fischer * - * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ /* no options, no getopt */ + +//usage:#define resize_trivial_usage +//usage: "" +//usage:#define resize_full_usage "\n\n" +//usage: "Resize the screen" + #include "libbb.h" +#include "common_bufsiz.h" #define ESC "\033" -#define old_termios (*(struct termios*)&bb_common_bufsiz1) +#define old_termios_p ((struct termios*)bb_common_bufsiz1) +#define INIT_G() do { setup_common_bufsiz(); } while (0) static void -onintr(int sig ATTRIBUTE_UNUSED) +onintr(int sig UNUSED_PARAM) { - tcsetattr(STDERR_FILENO, TCSANOW, &old_termios); - exit(1); + tcsetattr(STDERR_FILENO, TCSANOW, old_termios_p); + _exit(EXIT_FAILURE); } int resize_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; -int resize_main(int argc, char **argv) +int resize_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) { struct termios new; - struct winsize w = { 0,0,0,0 }; + struct winsize w = { 0, 0, 0, 0 }; int ret; + INIT_G(); + /* We use _stderr_ in order to make resize usable * in shell backticks (those redirect stdout away from tty). * NB: other versions of resize open "/dev/tty" * and operate on it - should we do the same? */ - tcgetattr(STDERR_FILENO, &old_termios); /* fiddle echo */ - new = old_termios; + tcgetattr(STDERR_FILENO, old_termios_p); /* fiddle echo */ + memcpy(&new, old_termios_p, sizeof(new)); new.c_cflag |= (CLOCAL | CREAD); new.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); - signal(SIGINT, onintr); - signal(SIGQUIT, onintr); - signal(SIGTERM, onintr); - signal(SIGALRM, onintr); + bb_signals(0 + + (1 << SIGINT) + + (1 << SIGQUIT) + + (1 << SIGTERM) + + (1 << SIGALRM) + , onintr); tcsetattr(STDERR_FILENO, TCSANOW, &new); /* save_cursor_pos 7 @@ -51,6 +63,7 @@ int resize_main(int argc, char **argv) */ fprintf(stderr, ESC"7" ESC"[r" ESC"[999;999H" ESC"[6n"); alarm(3); /* Just in case terminal won't answer */ +//BUG: death by signal won't restore termios scanf(ESC"[%hu;%huR", &w.ws_row, &w.ws_col); fprintf(stderr, ESC"8"); @@ -59,7 +72,7 @@ int resize_main(int argc, char **argv) * (gotten via TIOCGWINSZ) and recomputing *pixel values */ ret = ioctl(STDERR_FILENO, TIOCSWINSZ, &w); - tcsetattr(STDERR_FILENO, TCSANOW, &old_termios); + tcsetattr(STDERR_FILENO, TCSANOW, old_termios_p); if (ENABLE_FEATURE_RESIZE_PRINT) printf("COLUMNS=%d;LINES=%d;export COLUMNS LINES;\n",