Brian Pomerantz writes:
authorEric Andersen <andersen@codepoet.org>
Tue, 23 Mar 2004 23:15:36 +0000 (23:15 -0000)
committerEric Andersen <andersen@codepoet.org>
Tue, 23 Mar 2004 23:15:36 +0000 (23:15 -0000)
I've noticed a bug in the "autowidth" feature more, and is probably in
others.  The call to the function get_terminal_width_height() passes
in a file descriptor but that file descriptor is never used, instead
the ioctl() is called with 0.  In more_main() the call to
get_terminal_width_height() passes 0 as the file descriptor instead of
fileno(cin).  This isn't a problem when you more a file (e.g. "more
/etc/passwd") but when you pipe a file to it (e.g. "cat /etc/passwd |
more") the size of the terminal cannot be determined because file
descriptor 0 is not a terminal.  The fix is simple, I've attached a
patch for more.c and get_terminal_width_height.c.

BAPper

coreutils/ls.c
libbb/get_terminal_width_height.c
util-linux/more.c

index f7fa9a1..8b5065a 100644 (file)
@@ -982,7 +982,7 @@ extern int ls_main(int argc, char **argv)
 
 #ifdef CONFIG_FEATURE_AUTOWIDTH
        /* Obtain the terminal width.  */
-       get_terminal_width_height(0, &terminal_width, NULL);
+       get_terminal_width_height(fileno(stdout), &terminal_width, NULL);
        /* Go one less... */
        terminal_width--;
 #endif
index ef90463..7a1af6d 100644 (file)
@@ -36,7 +36,7 @@ void get_terminal_width_height(int fd, int *width, int *height)
 {
        struct winsize win = { 0, 0, 0, 0 };
 #ifdef CONFIG_FEATURE_AUTOWIDTH
-       if (ioctl(0, TIOCGWINSZ, &win) != 0) {
+       if (ioctl(fd, TIOCGWINSZ, &win) != 0) {
                win.ws_row = 24;
                win.ws_col = 80;
        }
index d7b7ce2..04b29de 100644 (file)
@@ -67,6 +67,7 @@ extern int more_main(int argc, char **argv)
        int please_display_more_prompt = -1;
        struct stat st;
        FILE *file;
+       FILE *in_file = stdin;
        int len, page_height;
 
        argc--;
@@ -78,6 +79,7 @@ extern int more_main(int argc, char **argv)
                cin = fopen(CURRENT_TTY, "r");
                if (!cin)
                        cin = bb_xfopen(CONSOLE_DEV, "r");
+               in_file = cin;
                please_display_more_prompt = 0;
 #ifdef CONFIG_FEATURE_USE_TERMIOS
                getTermSettings(fileno(cin), &initial_settings);
@@ -108,7 +110,7 @@ extern int more_main(int argc, char **argv)
                if(please_display_more_prompt>0)
                        please_display_more_prompt = 0;
 
-               get_terminal_width_height(0, &terminal_width, &terminal_height);
+               get_terminal_width_height(fileno(in_file), &terminal_width, &terminal_height);
                if (terminal_height > 4)
                        terminal_height -= 2;
                if (terminal_width > 0)