less: fall back to using fd #1 for keyboard reading. Closes 9231
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 13 Sep 2016 18:53:38 +0000 (20:53 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 13 Sep 2016 18:53:38 +0000 (20:53 +0200)
function                                             old     new   delta
less_main                                           2535    2540      +5

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
miscutils/less.c

index d1d4a71be815fbf09c3b0c8513776c16d615e015..877ab6ef2c2fadf8be6d6de1da4573cb408b8275 100644 (file)
@@ -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 */