aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2016-09-13 20:53:38 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2016-09-13 20:53:38 +0200
commit3c0e579a06c3f1d428d3642fc46beb4b635e5e6d (patch)
tree29e25faaa95b7cbe9b2998e94ed34d0daa71159b
parent20a3262cd756aadf8771969a4764cd3c571f0a3e (diff)
downloadbusybox-3c0e579a06c3f1d428d3642fc46beb4b635e5e6d.tar.gz
less: fall back to using fd #1 for keyboard reading. Closes 9231
function old new delta less_main 2535 2540 +5 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--miscutils/less.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/miscutils/less.c b/miscutils/less.c
index d1d4a71be..877ab6ef2 100644
--- a/miscutils/less.c
+++ b/miscutils/less.c
@@ -1797,9 +1797,10 @@ int less_main(int argc, char **argv)
/* Some versions of less can survive w/o controlling tty,
* try to do the same. This also allows to specify an alternative
* tty via "less 1<>TTY".
- * We don't try to use STDOUT_FILENO directly,
+ *
+ * We prefer not to use STDOUT_FILENO directly,
* since we want to set this fd to non-blocking mode,
- * and not bother with restoring it on exit.
+ * and not interfere with other processes which share stdout with us.
*/
tty_name = xmalloc_ttyname(STDOUT_FILENO);
if (tty_name) {
@@ -1811,8 +1812,15 @@ int less_main(int argc, char **argv)
/* Try controlling tty */
try_ctty:
tty_fd = open(CURRENT_TTY, O_RDONLY);
- if (tty_fd < 0)
- return bb_cat(argv);
+ if (tty_fd < 0) {
+ /*
+ * If all else fails, less 481 uses stdout. Mimic that.
+ * Testcase where usually both ttyname(STDOUT_FILENO)
+ * and open(CURRENT_TTY) fail:
+ * su -s /bin/sh -c 'busybox less FILE' - nobody
+ */
+ tty_fd = STDOUT_FILENO;
+ }
}
ndelay_on(tty_fd);
kbd_fd = tty_fd; /* save in a global */