diff options
Diffstat (limited to 'lib/vty_cli.h')
-rw-r--r-- | lib/vty_cli.h | 202 |
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 */ |