summaryrefslogtreecommitdiffstats
path: root/lib/vty_cli.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vty_cli.h')
-rw-r--r--lib/vty_cli.h202
1 files changed, 189 insertions, 13 deletions
diff --git a/lib/vty_cli.h b/lib/vty_cli.h
index f532616a..ec00965a 100644
--- a/lib/vty_cli.h
+++ b/lib/vty_cli.h
@@ -24,26 +24,202 @@
#ifndef _ZEBRA_VTY_CLI_H
#define _ZEBRA_VTY_CLI_H
+#include "misc.h"
+#include "vargs.h"
+
+#include "command_local.h"
#include "vty_io.h"
+#include "vty_io_basic.h"
+#include "vio_fifo.h"
+#include "vio_lines.h"
+#include "qstring.h"
+#include "qtimers.h"
#include "keystroke.h"
-extern void uty_cli_init(vty_io vio) ;
-extern enum vty_readiness uty_cli_start(vty_io vio) ;
-extern void uty_cli_close(vty_io vio) ;
+/*------------------------------------------------------------------------------
+ * The vty_cli structure pointed to by the vty_io structure.
+ */
+typedef struct vty_cli* vty_cli ;
+
+struct vty_cli
+{
+ vio_vf vf ; /* parent */
+
+ /* History of commands */
+ vector hist ; /* embedded */
+ uint hp ; /* current place in history */
+ uint h_now ; /* the present moment */
+ bool h_repeat ; /* latest entry is repeat */
+
+ /* Window width/height as reported by Telnet. 0 => unknown */
+ int width;
+ int height;
+
+ /* Configure lines. */
+ int lines;
+ bool lines_set ; /* true <=> explicitly set */
+
+ /* Terminal monitor. */
+ bool monitor ;
+ bool monitor_busy ;
+
+ /* The incoming stuff */
+ keystroke_stream key_stream ;
+
+ /* drawn <=> the current prompt and user input occupy the current
+ * line on the screen.
+ *
+ * This flag <=> the CLI "owns" the screen. This flag
+ * must be cleared -- by wiping the command line -- before
+ * any other output can use the screen.
+ *
+ * In particular, must be cleared before setting
+ * out_active -- see below.
+ *
+ * tilde_enabled <=> do the "~ " one command line ahead.
+ *
+ * If drawn is true, the following are valid:
+ *
+ * tilde_prompt -- the prompt is the "~ "
+ *
+ * prompt_len -- the length of the prompt part.
+ * (will be the "--more--" prompt in cli_more_wait)
+ *
+ * extra_len -- the length of any ^X at the cursor position
+ * (for when blocked waiting for queued command)
+ *
+ * echo_suppress -- the user part of the command line is suppressed
+ *
+ * NB: echo_suppress is only used for password entry.
+ */
+ bool drawn ;
+
+ bool tilde_prompt ;
+#if 0
+ bool tilde_enabled ;
+#endif
+
+ int prompt_len ;
+ int extra_len ;
+
+ /* "cache" for prompt -- when node or host name changes, prompt does */
+ node_type_t prompt_node ;
+ name_gen_t prompt_gen ;
+ qstring prompt_for_node ;
+
+ /* State of the CLI
+ *
+ * dispatched -- command dispatched by CLI
+ * in_progress -- command taken by the command loop
+ * blocked -- blocked until current command completes
+ * paused -- command dispatched and nothing else happened
+ *
+ * mon_active -- there is stuff in the logging monitor buffer
+ *
+ * out_active -- contents of the obuf FIFO are being written away
+ * though may be blocked in more_wait
+ *
+ * This flag <=> that the command output "owns" the screen.
+ *
+ * While this flag is set, the CLI may not write to the
+ * screen.
+ *
+ * Flag is cleared when obuf is empty, and is !in_progress.
+ *
+ * more_wait -- is in "--more--" wait state
+ * more_enter -- more_wait and waiting for "--more--" prompt to be
+ * written away and keystrokes to be consumed.
+ */
+ bool dispatched ;
+ bool in_progress ;
+ bool blocked ;
+ bool paused ;
+
+ bool mon_active ;
+ bool out_active ;
-extern enum vty_readiness uty_cli(vty_io vio) ;
-extern keystroke_callback uty_cli_iac_callback ;
+ bool more_wait ;
+ bool more_enter ;
-extern void uty_cli_hist_add (vty_io vio, const char* cmd_line) ;
-extern void uty_cli_enter_more_wait(vty_io vio) ;
-extern void uty_cli_exit_more_wait(vty_io vio) ;
+ /* This is set only if the "--more--" handling is enabled */
+ bool more_enabled ;
-extern void uty_free_host_name(void) ;
-extern void uty_check_host_name(void) ;
+ /* Timer for paused state -- multi-threaded only */
+ qtimer pause_timer ;
-extern bool uty_cli_draw_if_required(vty_io vio) ;
+ /* Command Line(s)
+ *
+ * context -- the node etc. that the CLI is in. This may be some way behind
+ * the VTY, but is updated when the CLI level command completes.
+ *
+ * Note that this is a copy of the state of exec->context when
+ * uty_want_command() was last called.
+ *
+ * auth_context -- true <=> context->node is AUTH_NODE or AUTH_ENABLE_NODE
+ *
+ * parsed -- the parsed object used to parse command for cli help
+ *
+ * to_do -- when current command being prepared is completed (by
+ * CR/LF or otherwise) this says what there now is to be done.
+ *
+ * cl -- current command line being prepared.
+ * cls -- current command line on the screen
+ *
+ * clx -- current command line being executed.
+ *
+ * dispatch -- the last action dispatched.
+ *
+ * NB: during command execution vty->buf is set to point at the '\0'
+ * terminated current command line being executed.
+ */
+ cmd_context context ;
+ bool auth_context ;
-extern void uty_cli_pre_monitor(vty_io vio, size_t len) ;
-extern int uty_cli_post_monitor(vty_io vio, const char* buf, size_t len) ;
+ cmd_parsed parsed ;
+
+ cmd_do_t to_do ;
+ qstring cl ;
+ qstring cls ;
+
+ qstring clx ;
+
+ cmd_action_t dispatch ;
+
+ /* CLI line buffering and line control */
+ vio_fifo cbuf ;
+ vio_line_control olc ;
+} ;
+
+/*------------------------------------------------------------------------------
+ * Functions
+ */
+extern vty_cli uty_cli_new(vio_vf vf) ;
+extern vty_cli uty_cli_close(vty_cli cli, bool final) ;
+
+extern void uty_cli_hist_show(vty_cli cli) ;
+extern ulen uty_cli_prompt_len(vty_cli cli) ;
+
+extern vty_readiness_t uty_cli(vty_cli cli) ;
+
+extern cmd_return_code_t uty_cli_want_command(vty_cli cli, cmd_action action,
+ cmd_context context) ;
+extern void uty_cli_out(vty_cli cli, const char *format, ...)
+ PRINTF_ATTRIBUTE(2, 3) ;
+extern void uty_cli_out_newline(vty_cli cli) ;
+extern void uty_cli_write(vty_cli cli, const char *this, int len) ;
+extern void uty_cli_wipe(vty_cli cli, int len) ;
+
+extern void uty_cli_set_lines(vty_cli cli, int lines, bool explicit) ;
+extern void uty_cli_set_window(vty_cli cli, int width, int height) ;
+extern void uty_cli_enter_more_wait(vty_cli cli) ;
+extern void uty_cli_exit_more_wait(vty_cli cli) ;
+
+extern void uty_cli_pre_monitor(vty_cli cli) ;
+extern void uty_cli_post_monitor(vty_cli cli) ;
+
+/*------------------------------------------------------------------------------
+ * Pro tem -- "\r\n" string
+ */
+extern const char* uty_cli_newline ;
#endif /* _ZEBRA_VTY_CLI_H */