Brian Pomerantz writes:

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
This commit is contained in:
Eric Andersen 2004-03-23 23:15:36 +00:00
parent 6bb80870b8
commit 97310d0253
3 changed files with 5 additions and 3 deletions

View File

@ -982,7 +982,7 @@ extern int ls_main(int argc, char **argv)
#ifdef CONFIG_FEATURE_AUTOWIDTH #ifdef CONFIG_FEATURE_AUTOWIDTH
/* Obtain the terminal width. */ /* Obtain the terminal width. */
get_terminal_width_height(0, &terminal_width, NULL); get_terminal_width_height(fileno(stdout), &terminal_width, NULL);
/* Go one less... */ /* Go one less... */
terminal_width--; terminal_width--;
#endif #endif

View File

@ -36,7 +36,7 @@ void get_terminal_width_height(int fd, int *width, int *height)
{ {
struct winsize win = { 0, 0, 0, 0 }; struct winsize win = { 0, 0, 0, 0 };
#ifdef CONFIG_FEATURE_AUTOWIDTH #ifdef CONFIG_FEATURE_AUTOWIDTH
if (ioctl(0, TIOCGWINSZ, &win) != 0) { if (ioctl(fd, TIOCGWINSZ, &win) != 0) {
win.ws_row = 24; win.ws_row = 24;
win.ws_col = 80; win.ws_col = 80;
} }

View File

@ -67,6 +67,7 @@ extern int more_main(int argc, char **argv)
int please_display_more_prompt = -1; int please_display_more_prompt = -1;
struct stat st; struct stat st;
FILE *file; FILE *file;
FILE *in_file = stdin;
int len, page_height; int len, page_height;
argc--; argc--;
@ -78,6 +79,7 @@ extern int more_main(int argc, char **argv)
cin = fopen(CURRENT_TTY, "r"); cin = fopen(CURRENT_TTY, "r");
if (!cin) if (!cin)
cin = bb_xfopen(CONSOLE_DEV, "r"); cin = bb_xfopen(CONSOLE_DEV, "r");
in_file = cin;
please_display_more_prompt = 0; please_display_more_prompt = 0;
#ifdef CONFIG_FEATURE_USE_TERMIOS #ifdef CONFIG_FEATURE_USE_TERMIOS
getTermSettings(fileno(cin), &initial_settings); getTermSettings(fileno(cin), &initial_settings);
@ -108,7 +110,7 @@ extern int more_main(int argc, char **argv)
if(please_display_more_prompt>0) if(please_display_more_prompt>0)
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) if (terminal_height > 4)
terminal_height -= 2; terminal_height -= 2;
if (terminal_width > 0) if (terminal_width > 0)