]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
vt: Implement parsing for >, =, < private sequences.
authorMartin Hostettler <textshell@uchuujin.de>
Sat, 15 Dec 2018 14:34:21 +0000 (15:34 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 18 Jan 2019 12:56:41 +0000 (13:56 +0100)
Private sequences can start with '>', '=' and (in theory) '<'.
Implement correct parsing for these. The newly parsable sequences are
cleanly ignored as it is customary with terminal emulators.

This allows the vt to ignore various sequences used by more capable
terminal implementations such as "Secondary Device Attributes",
"Tertiary Device Attributes" and various advanced configuration commands
that don't have dedicated terminfo entries.

Signed-off-by: Martin Hostettler <textshell@uchuujin.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/vt/vt.c

index b59feeaaf02b2229fff8f5785c9474b622718ad7..ec61f83562456460db78cc85dadb6a61cafa28d0 100644 (file)
@@ -2236,9 +2236,21 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
                        vc->vc_state=ESfunckey;
                        return;
                }
-               vc->vc_priv = (c == '?') ? EPdec : EPecma;
-               if (vc->vc_priv != EPecma)
+               switch (c) {
+               case '?':
+                       vc->vc_priv = EPdec;
+                       return;
+               case '>':
+                       vc->vc_priv = EPgt;
+                       return;
+               case '=':
+                       vc->vc_priv = EPeq;
                        return;
+               case '<':
+                       vc->vc_priv = EPlt;
+                       return;
+               }
+               vc->vc_priv = EPecma;
                /* fall through */
        case ESgetpars:
                if (c == ';' && vc->vc_npar < NPAR - 1) {
@@ -2252,10 +2264,12 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
                vc->vc_state = ESnormal;
                switch(c) {
                case 'h':
-                       set_mode(vc, 1);
+                       if (vc->vc_priv <= EPdec)
+                               set_mode(vc, 1);
                        return;
                case 'l':
-                       set_mode(vc, 0);
+                       if (vc->vc_priv <= EPdec)
+                               set_mode(vc, 0);
                        return;
                case 'c':
                        if (vc->vc_priv == EPdec) {