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:
parent
6bb80870b8
commit
97310d0253
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user