summaryrefslogtreecommitdiffstats
path: root/lib/vty_io.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vty_io.h')
-rw-r--r--lib/vty_io.h297
1 files changed, 297 insertions, 0 deletions
diff --git a/lib/vty_io.h b/lib/vty_io.h
new file mode 100644
index 00000000..06cefe06
--- /dev/null
+++ b/lib/vty_io.h
@@ -0,0 +1,297 @@
+/* VTY IO Structure and Functions -- header
+ * Virtual terminal [aka TeletYpe] interface routine.
+ * Copyright (C) 1997, 98 Kunihiro Ishiguro
+ *
+ * Revisions: Copyright (C) 2010 Chris Hall (GMCH), Highwayman
+ *
+ * This file is part of GNU Zebra.
+ *
+ * GNU Zebra is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * GNU Zebra is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Zebra; see the file COPYING. If not, write to the Free
+ * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#ifndef _ZEBRA_VTY_IO_H
+#define _ZEBRA_VTY_IO_H
+
+#include <stdbool.h>
+#include <errno.h>
+
+#include "uty.h"
+#include "vty.h"
+#include "vio_fifo.h"
+#include "keystroke.h"
+#include "thread.h"
+#include "command.h"
+#include "qstring.h"
+
+/*==============================================================================
+ * Here are structures and other definitions which are shared by:
+ *
+ * vty.c -- the main vty handler
+ * vty_cli.c -- which handles the command line stuff
+ * vty_io.c -- ....
+ *
+ * The "struct vty" is used extensively across the Quagga daemons, where it
+ * has two functions relating to command handling as:
+ *
+ * 1) a "file handle" for output produced by commands
+ *
+ * 2) the holder of some context -- notably the current command "node" -- for
+ * command execution to use
+ *
+ * The bulk of "struct vty" is, therefore, private to vty.c and is factored
+ * out into the "struct vty_io".
+ *
+ * To reduce the size of vty.c, some groups of functions are separated into:
+ *
+ * vty_cli.c -- which looks after the keystroke by keystroke handling
+ * of the command line.
+ *
+ */
+
+/*------------------------------------------------------------------------------
+ * VTY file structure
+ *
+ * Used
+ */
+
+typedef int thread_action(struct thread *) ;
+
+union file_action
+{
+ qps_action* qnexus ;
+ thread_action* thread ;
+ void* anon ;
+} ;
+
+union timer_action
+{
+ qtimer_action* qnexus ;
+ thread_action* thread ;
+ void* anon ;
+} ;
+
+struct vio_file_actions
+{
+ union file_action read ;
+ union file_action write ;
+ union timer_action timer ;
+};
+
+typedef struct vio_file* vio_file ;
+struct vio_file
+{
+ int fd ;
+
+ void* info ; /* for action routines */
+
+ struct vio_file_actions action ;
+
+ bool read_open ; /* read returns 0 if not open */
+ bool write_open ; /* write completes instantly if not open */
+ int error_seen ; /* non-zero => failed */
+
+ qps_file qf ; /* when running qnexus */
+
+ struct thread *t_read; /* when running threads */
+ struct thread *t_write;
+
+ unsigned long v_timeout; /* time-out in seconds -- 0 => none */
+ bool timer_running ; /* true when timer is running */
+
+ qtimer qtr; /* when running qnexus */
+ struct thread *t_timer; /* when running threads */
+
+} ;
+
+struct vty_line_control
+{
+ int tba ;
+} ;
+
+enum
+{
+ off = false,
+ on = true
+};
+
+/*------------------------------------------------------------------------------
+ *
+ */
+
+struct vty_io {
+ /* List of all vty_io objects */
+ struct dl_list_pair(vty_io) vio_list ;
+
+ bool half_closed ; /* => on death watch list */
+ bool timed_out ; /* closed by timer */
+
+ /* List of all vty_io that are in monitor state */
+ struct dl_list_pair(vty_io) mon_list ;
+
+ /* The attached to this vty */
+ struct vty* vty ;
+
+ /* Type of VTY */
+ enum vty_type type;
+
+ /* File level stuff */
+ struct vio_file file ;
+
+ /* "name" of the VTY (for VTY_TERM is IP address) */
+ char *name ;
+
+ /* Keystroke stream and raw input buffer */
+ keystroke_stream key_stream ;
+ qstring_t ibuf ;
+
+ /*--------------------------------------------------------------------*/
+ /* Command line and related state */
+
+ /* cli_drawn <=> the current prompt and user input occupy the current
+ * line on the screen.
+ *
+ * If cli_drawn is true, the following are valid:
+ *
+ * cli_prompt_len -- the length of the prompt part.
+ *
+ * cli_extra_len -- the length of any ^X at the cursor position
+ * (for when blocked waiting for queued command)
+ *
+ * cli_echo_suppress -- the user part of the command line is suppressed
+ *
+ * NB: cli_echo_suppress is only used for password entry.
+ */
+ int cli_drawn ;
+
+ int cli_prompt_len ; /* for drawn line (if any) */
+ int cli_extra_len ; /* for for drawn line (if any) */
+
+ bool cli_echo_suppress ; /* non-zero => suppress cli echo */
+
+ /* "cache" for prompt -- when node or host name changes, prompt does */
+ enum node_type cli_prompt_node ;
+ bool cli_prompt_set ;
+ qstring_t cli_prompt_for_node ;
+
+ /* State of the CLI
+ *
+ * cli_blocked -- blocked from processing keystrokes
+ * cmd_in_progress -- command dispatched (may be queued)
+ *
+ * cli_wait_more -- is in "--more--" wait state
+ *
+ */
+ bool cli_blocked ;
+ bool cmd_in_progress ;
+
+ /* Command Line(s)
+ *
+ * cli_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.
+ */
+ enum cli_do cli_do ;
+
+ qstring_t cl ;
+ qstring_t clx ;
+
+ /* CLI output buffering */
+ qstring_t cli_vbuf ; /* for uty_cli_out */
+ vio_fifo_t cli_obuf ;
+
+ /* Command output buffering */
+ qstring_t cmd_vbuf ; /* for uty_vout() */
+ vio_fifo_t cmd_obuf ;
+
+ bool cmd_wait_more ;
+
+ struct vty_line_control line_control ;
+ /* Failure count for login attempts */
+ int fail;
+
+ /* History of commands */
+ vector_t hist ;
+ int hp ; /* History lookup current point */
+ int hindex; /* History insert end point */
+
+ /* Window width/height. */
+ int width;
+ int height;
+
+ /* Configure lines. */
+ int lines;
+
+ /* Terminal monitor. */
+ bool monitor ;
+
+ /* In configure mode. */
+ bool config;
+} ;
+
+/*==============================================================================
+ * Functions
+ */
+
+extern struct vty*
+uty_new (int fd, enum vty_type type) ;
+
+extern void
+uty_open_listeners(const char *addr, unsigned short port, const char *path) ;
+extern void
+uty_close_listeners(void) ;
+
+extern void
+uty_half_close (vty_io vio) ;
+extern void
+uty_close (vty_io vio) ;
+extern void
+uty_full_close (vty_io vio) ;
+extern void
+uty_watch_dog_stop(void) ;
+
+extern int
+uty_out (struct vty *vty, const char *format, ...) PRINTF_ATTRIBUTE(2, 3) ;
+extern int
+uty_vout(struct vty *vty, const char *format, va_list args) ;
+extern void
+uty_out_discard(vty_io vio) ;
+
+extern void
+uty_file_set_read(vio_file file, bool on) ;
+extern void
+uty_file_set_write(vio_file file, bool on) ;
+extern void
+uty_file_set_timer(vio_file file, unsigned long timeout) ;
+
+extern int
+uty_read (vty_io vio, keystroke steal) ;
+extern int
+utysh_read (vty_io vio, qstring cl, qstring buf) ;
+
+
+extern const char*
+uty_get_name(vty_io vio) ;
+
+extern void
+uty_set_monitor(vty_io vio, bool on) ;
+
+#endif /* _ZEBRA_VTY_IO_H */