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
diff --git a/util-linux/more.c b/util-linux/more.c
index d7b7ce2..04b29de 100644
--- a/util-linux/more.c
+++ b/util-linux/more.c
@@ -67,6 +67,7 @@
int please_display_more_prompt = -1;
struct stat st;
FILE *file;
+ FILE *in_file = stdin;
int len, page_height;
argc--;
@@ -78,6 +79,7 @@
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 @@
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)