[quagga-dev,16546] vty: Add ctrl-v <literal> to allow, e.g., '?' to be input for regex

Message ID 1484324909-29965-1-git-send-email-paul@jakma.org
State Under Review
Headers show

Commit Message

Paul Jakma Jan. 13, 2017, 4:28 p.m.
From: Paul Jakma <paul.jakma@hpe.com>

* 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: Vincent.Jardin@6wind.com
---
 doc/basic.texi |  9 +++++++++
 lib/vty.c      | 21 ++++++++++++++++++---
 2 files changed, 27 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

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;