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.h166
1 files changed, 153 insertions, 13 deletions
diff --git a/lib/vty_cli.h b/lib/vty_cli.h
index f532616a..94e502f0 100644
--- a/lib/vty_cli.h
+++ b/lib/vty_cli.h
@@ -24,26 +24,166 @@
#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 "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_t hist ; /* embedded */
+ int hp ; /* current place in history */
+ int h_now ; /* the present moment */
+
+ /* 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 ;
+
+ /* Terminal timeout in seconds -- 0 => none */
+ vty_timer_time v_timeout ;
+
+ /* The incoming stuff */
+ keystroke_stream key_stream ;
+
+ /* drawn <=> the current prompt and user input occupy the current
+ * line on the screen.
+ *
+ * dirty <=> the last command output did not end with a newline.
+ *
+ * If drawn is true, the following are valid:
+ *
+ * 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 dirty ;
+
+ int prompt_len ;
+ int extra_len ;
+
+ bool echo_suppress ;
+
+ /* "cache" for prompt -- when node or host name changes, prompt does */
+ node_type_t prompt_node ;
+ name_gen_t prompt_gen ;
+ qstring_t prompt_for_node ;
+
+ /* password failure count -- main login or enable login. */
+ int password_fail ;
+
+ /* State of the CLI
+ *
+ * in_progress -- command dispatched
+ * blocked -- blocked until current command completes
+ * out_active -- contents of the command FIFO are being written away
+ *
+ * more_wait -- is in "--more--" wait state
+ * more_active -- more_wait and waiting for "--more--" prompt to be
+ * written away.
+ */
+ bool in_progress ;
+ bool blocked ;
+ bool out_active ;
+
+ bool more_wait ;
+ bool more_active ;
+
+ /* This is used to control command output, so that each write_ready event
+ * generates at most one tranche of output.
+ */
+ bool out_done ;
+
+ /* This is set only if the "--more--" handling is enabled */
+ bool more_enabled ;
+
+ /* Command Line(s)
+ *
+ * node -- the node that the CLI is in. This may be some way behind
+ * the VTY, but is updated when the CLI level command completes.
+ *
+ * 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.
+ *
+ * clx -- current command line being executed.
+ *
+ * NB: during command execution vty->buf is set to point at the '\0'
+ * terminated current command line being executed.
+ */
+ node_type_t node ;
+
+ cmd_do_t to_do ;
+
+ qstring cl ;
+ qstring clx ;
+
+ cmd_parsed_t parsed ; /* embedded */
+
+ /* CLI line buffering */
+ vio_fifo_t cbuf ; /* embedded */
+
+ /* CLI line control for command output & "--more--" stuff */
+ vio_line_control_t olc ; /* embedded */
+} ;
+
+extern vty_cli uty_cli_new(vio_vf vf) ;
+extern void uty_cli_start(vty_cli cli, node_type_t node) ;
+
+extern vty_cli uty_cli_close(vty_cli cli, bool final) ;
+
+extern cmd_return_code_t uty_cli_auth(vty_cli) ;
+extern void uty_cli_hist_show(vty_cli cli) ;
+extern ulen uty_cli_prompt_len(vty_cli cli) ;
-extern enum vty_readiness uty_cli(vty_io vio) ;
-extern keystroke_callback uty_cli_iac_callback ;
+extern vty_readiness_t uty_cli(vty_cli cli) ;
+extern void uty_cli_out_push(vty_cli cli) ;
+extern void uty_cli_done_command(vty_cli cli, node_type_t node) ;
-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) ;
+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_out_clear(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_free_host_name(void) ;
-extern void uty_check_host_name(void) ;
+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 bool uty_cli_draw_if_required(vty_io vio) ;
+extern bool uty_cli_draw_if_required(vty_cli cli) ;
-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) ;
+extern void uty_cli_pre_monitor(vty_cli cli, size_t len) ;
+extern int uty_cli_post_monitor(vty_cli cli, const char* buf, size_t len) ;
#endif /* _ZEBRA_VTY_CLI_H */