less: switch off nonblock on kbd_fd before exit

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@googlemail.com>
This commit is contained in:
Denys Vlasenko 2016-09-13 21:05:48 +02:00
parent 3c0e579a06
commit 7fa799a97d

View File

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