[git commit] less: switch off nonblock on kbd_fd before exit

Denys Vlasenko vda.linux at googlemail.com
Tue Sep 13 19:05:48 UTC 2016


commit: https://git.busybox.net/busybox/commit/?id=7fa799a97d381902ab27556918722a6e2d138b9e
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

This is only necessary if we use stdout fd.

function                                             old     new   delta
less_exit                                             32      51     +19
less_main                                           2540    2543      +3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 22/0)               Total: 22 bytes

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 miscutils/less.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/miscutils/less.c b/miscutils/less.c
index 877ab6e..61acfdc 100644
--- a/miscutils/less.c
+++ b/miscutils/less.c
@@ -169,6 +169,7 @@ enum { pattern_valid = 0 };
 struct globals {
 	int cur_fline; /* signed */
 	int kbd_fd;  /* fd to get input from */
+	int kbd_fd_orig_flags;
 	int less_gets_pos;
 /* last position in last line, taking into account tabs */
 	size_t last_line_pos;
@@ -304,6 +305,8 @@ static void print_statusline(const char *str)
 static void less_exit(int code)
 {
 	set_tty_cooked();
+	if (!(G.kbd_fd_orig_flags & O_NONBLOCK))
+		ndelay_off(kbd_fd);
 	clear_line();
 	if (code < 0)
 		kill_myself_with_sig(- code); /* does not return */
@@ -1813,16 +1816,11 @@ int less_main(int argc, char **argv)
  try_ctty:
 		tty_fd = open(CURRENT_TTY, O_RDONLY);
 		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
-			 */
+			/* If all else fails, less 481 uses stdout. Mimic that */
 			tty_fd = STDOUT_FILENO;
 		}
 	}
-	ndelay_on(tty_fd);
+	G.kbd_fd_orig_flags = ndelay_on(tty_fd);
 	kbd_fd = tty_fd; /* save in a global */
 
 	tcgetattr(kbd_fd, &term_orig);


More information about the busybox-cvs mailing list