From: Paul Jakma <[email protected]>

* Support the standard ctrl-v <literal> control sequence. Otherwise there
  is no way to do this from the venerable telnet vty. vtysh supports this
  (configurably) via readline.
* lib/vty.c: (VTY_ESC_LITERAL) New mode, for ctrl-v.
  (vty_read) Additional mode to go ctrl-v -> VTY_ESC_LITERAL, and
  always insert next char.

Acked-by: [email protected]
---
 doc/basic.texi |  9 +++++++++
 lib/vty.c      | 21 ++++++++++++++++++---
 2 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/doc/basic.texi b/doc/basic.texi
index 4485665..92e8d9e 100644
--- a/doc/basic.texi
+++ b/doc/basic.texi
@@ -552,6 +552,12 @@ Kill line from the beginning, erasing input.
 @kindex C-t
 Transpose character.
 
+@item C-v
+@kindex C-v
+Interpret following character literally. Do not treat it specially.
+This can be used to, e.g., type in a literal @kbd{?} rather than do
+help completion.
+
 @end table
 
 @node CLI Advanced Commands
@@ -593,4 +599,7 @@ You can use command line help by typing @code{help} at the 
beginning of
 the line.  Typing @kbd{?} at any point in the line will show possible
 completions.
 
+To enter an actual @kbd{?} character rather show completions, e.g. to
+enter into a regexp, use @kbd{@key{C}-v ?}.
+
 @end table
diff --git a/lib/vty.c b/lib/vty.c
index 7ba277f..2c5911a 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -1340,8 +1340,9 @@ vty_execute (struct vty *vty)
 
 #define CONTROL(X)  ((X) - '@')
 #define VTY_NORMAL     0
-#define VTY_PRE_ESCAPE 1
-#define VTY_ESCAPE     2
+#define VTY_PRE_ESCAPE 1  /* Esc seen */
+#define VTY_ESCAPE     2  /* ANSI terminal escape (Esc-[) seen */
+#define VTY_ESC_LITERAL 3 /* Escape next char as literal */
 
 /* Escape character command map. */
 static void
@@ -1469,7 +1470,14 @@ vty_read (struct thread *thread)
          vty_escape_map (buf[i], vty);
          continue;
        }
-
+      
+      if (vty->escape == VTY_ESC_LITERAL)
+        {
+          vty_self_insert (vty, buf[i]);
+          vty->escape = VTY_NORMAL;
+          continue;
+        }
+      
       /* Pre-escape status. */
       if (vty->escape == VTY_PRE_ESCAPE)
        {
@@ -1495,6 +1503,10 @@ vty_read (struct thread *thread)
              vty_backward_kill_word (vty);
              vty->escape = VTY_NORMAL;
              break;
+            case '?':
+              vty_self_insert (vty, buf[i]);
+              vty->escape = VTY_NORMAL;
+              break;
            default:
              vty->escape = VTY_NORMAL;
              break;
@@ -1541,6 +1553,9 @@ vty_read (struct thread *thread)
        case CONTROL('U'):
          vty_kill_line_from_beginning (vty);
          break;
+        case CONTROL('V'):
+          vty->escape = VTY_ESC_LITERAL;
+          break;
        case CONTROL('W'):
          vty_backward_kill_word (vty);
          break;
-- 
2.7.4


_______________________________________________
Quagga-dev mailing list
[email protected]
https://lists.quagga.net/mailman/listinfo/quagga-dev

Reply via email to