less: fix fallout from "use common routine to set raw termios"
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 16 Apr 2018 08:24:48 +0000 (10:24 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 16 Apr 2018 08:24:48 +0000 (10:24 +0200)
Testcase: (sleep 10; ls) | busybox less

[...]
~           LICENSE
~                  Makefile
~                          Makefile.custom
~                                         Makefile.flags
[...]

less did not want this part:
+ /* dont convert NL to CR+NL on output */
+ newterm->c_oflag &= ~(ONLCR);

function                                             old     new   delta
get_termios_and_make_raw                             108     115      +7

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

index c7bf33ef830eeb6461ba592f29847f97fa039c35..646c58bf23abdffdc65a15c7c44b513731475505 100644 (file)
@@ -1597,9 +1597,11 @@ int get_terminal_width_height(int fd, unsigned *width, unsigned *height) FAST_FU
 int get_terminal_width(int fd) FAST_FUNC;
 
 int tcsetattr_stdin_TCSANOW(const struct termios *tp) FAST_FUNC;
-#define TERMIOS_CLEAR_ISIG (1 << 0)
-#define TERMIOS_RAW_CRNL   (1 << 1)
-#define TERMIOS_RAW_INPUT  (1 << 2)
+#define TERMIOS_CLEAR_ISIG      (1 << 0)
+#define TERMIOS_RAW_CRNL_INPUT  (1 << 1)
+#define TERMIOS_RAW_CRNL_OUTPUT (1 << 2)
+#define TERMIOS_RAW_CRNL        (TERMIOS_RAW_CRNL_INPUT|TERMIOS_RAW_CRNL_OUTPUT)
+#define TERMIOS_RAW_INPUT       (1 << 3)
 int get_termios_and_make_raw(int fd, struct termios *newterm, struct termios *oldterm, int flags) FAST_FUNC;
 int set_termios_to_raw(int fd, struct termios *oldterm, int flags) FAST_FUNC;
 
index e8c027f1769954dae24ba2fd5227ef893ffab593..b4d512bd67063c0885ef278bcb92550162b70638 100644 (file)
@@ -330,7 +330,6 @@ int FAST_FUNC get_termios_and_make_raw(int fd, struct termios *newterm, struct t
        newterm->c_cc[VMIN] = 1;
        /* no timeout (reads block forever) */
        newterm->c_cc[VTIME] = 0;
-       if (flags & TERMIOS_RAW_CRNL) {
 /* IXON, IXOFF, and IXANY:
  * IXOFF=1: sw flow control is enabled on input queue:
  * tty transmits a STOP char when input queue is close to full
@@ -340,9 +339,12 @@ int FAST_FUNC get_termios_and_make_raw(int fd, struct termios *newterm, struct t
  * and resume sending if START is received, or if any char
  * is received and IXANY=1.
  */
+       if (flags & TERMIOS_RAW_CRNL_INPUT) {
                /* IXON=0: XON/XOFF chars are treated as normal chars (why we do this?) */
                /* dont convert CR to NL on input */
                newterm->c_iflag &= ~(IXON | ICRNL);
+       }
+       if (flags & TERMIOS_RAW_CRNL_OUTPUT) {
                /* dont convert NL to CR+NL on output */
                newterm->c_oflag &= ~(ONLCR);
                /* Maybe clear more c_oflag bits? Usually, only OPOST and ONLCR are set.
@@ -363,9 +365,12 @@ int FAST_FUNC get_termios_and_make_raw(int fd, struct termios *newterm, struct t
 #ifndef IXANY
 # define IXANY 0
 #endif
-               /* IXOFF=0: disable sending XON/XOFF if input buf is full */
-               /* IXON=0: input XON/XOFF chars are not special */
-               /* dont convert anything on input */
+               /* IXOFF=0: disable sending XON/XOFF if input buf is full
+                * IXON=0: input XON/XOFF chars are not special
+                * BRKINT=0: dont send SIGINT on break
+                * IMAXBEL=0: dont echo BEL on input line too long
+                * INLCR,ICRNL,IUCLC: dont convert anything on input
+                */
                newterm->c_iflag &= ~(IXOFF|IXON|IXANY|BRKINT|INLCR|ICRNL|IUCLC|IMAXBEL);
        }
        return r;
index 6029b68091c2846157845dfd08803e641760f2b8..938d9842f3b5f64aec6fe5dadb323e64f85d6326 100644 (file)
@@ -1891,7 +1891,7 @@ int less_main(int argc, char **argv)
        G.kbd_fd_orig_flags = ndelay_on(tty_fd);
        kbd_fd = tty_fd; /* save in a global */
 
-       get_termios_and_make_raw(tty_fd, &term_less, &term_orig, TERMIOS_RAW_CRNL);
+       get_termios_and_make_raw(tty_fd, &term_less, &term_orig, TERMIOS_RAW_CRNL_INPUT);
 
        IF_FEATURE_LESS_ASK_TERMINAL(G.winsize_err =) get_terminal_width_height(tty_fd, &width, &max_displayed_line);
        /* 20: two tabstops + 4 */