summaryrefslogtreecommitdiffstats
path: root/lib/command_common.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/command_common.h')
-rw-r--r--lib/command_common.h290
1 files changed, 290 insertions, 0 deletions
diff --git a/lib/command_common.h b/lib/command_common.h
new file mode 100644
index 00000000..4dd26753
--- /dev/null
+++ b/lib/command_common.h
@@ -0,0 +1,290 @@
+/* Command handler node_type stuff -- header
+ * Copyright (C) 1997, 98 Kunihiro Ishiguro
+ *
+ * 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_COMMAND_COMMON_H
+#define _ZEBRA_COMMAND_COMMON_H
+
+#include "misc.h"
+#include "vector.h"
+
+/*------------------------------------------------------------------------------
+ * These are the command levels/contexts.
+ *
+ * NB: this is the order in which configuration is written to the
+ * configuration file.
+ */
+enum node_type
+{
+ NULL_NODE = 0, /* For when need "not a node" */
+
+ AUTH_NODE, /* VTY login -> VIEW_NODE */
+ RESTRICTED_NODE, /* if no login required, may use this node */
+ VIEW_NODE, /* aka user EXEC */
+ AUTH_ENABLE_NODE, /* enable login -> ENABLE_NODE/CONFIG_NODE */
+ ENABLE_NODE, /* aka privileged EXEC */
+
+ MIN_DO_SHORTCUT_NODE = ENABLE_NODE,
+ /* May not "do xx" at any node lower */
+ MAX_NON_CONFIG_NODE = ENABLE_NODE,
+ /* May not be higher than this without owning
+ * the configuration symbol of power */
+
+ CONFIG_NODE, /* aka global configuration mode */
+
+ MIN_CONFIG_NODE = CONFIG_NODE,
+ /* May not change context to any node lower */
+
+ SERVICE_NODE, /* unused ! */
+ DEBUG_NODE, /* debug config write only */
+ AAA_NODE, /* unused ! */
+ KEYCHAIN_NODE, /* see: keychain.c */
+ KEYCHAIN_KEY_NODE, /* see: keychain.c -- child of KEYCHAIN_NODE */
+ INTERFACE_NODE, /* interface commands */
+ ZEBRA_NODE, /* router zebra commands */
+ TABLE_NODE, /* rtm_table config write -- see zserv.c */
+ RIP_NODE, /* router rip commands */
+ RIPNG_NODE, /* router ripng commands */
+ BGP_NODE, /* router bgp commands */
+ BGP_VPNV4_NODE, /* address-family vpnv4 -- child of BGP_NODE */
+ BGP_IPV4_NODE, /* address-family ipv4 (unicast) -- child of BGP_NODE */
+ BGP_IPV4M_NODE, /* address-family ipv4 multicast -- child of BGP_NODE */
+ BGP_IPV6_NODE, /* address-family ipv6 (unicast) -- child of BGP_NODE */
+ BGP_IPV6M_NODE, /* address-family ipv6 multicast -- child of BGP_NODE */
+ OSPF_NODE, /* router ospf commands */
+ OSPF6_NODE, /* router ospf6 commands */
+ ISIS_NODE, /* router isis commands */
+ MASC_NODE, /* unused ! RFC 2909 Multicast Address-Set Claim */
+ IRDP_NODE, /* unused ! ICMP Router Discovery Protocol */
+ IP_NODE, /* zebra_ip_config write only -- see zebra_vty.c */
+ ACCESS_NODE, /* access list config write only -- see filter.c */
+ PREFIX_NODE, /* prefix list config write only -- see plist.c */
+ ACCESS_IPV6_NODE, /* access list config write only -- see filter.c */
+ PREFIX_IPV6_NODE, /* prefix list config write only -- see plist.c */
+ AS_LIST_NODE, /* AS list config write only -- see bgp_filter.c */
+ COMMUNITY_LIST_NODE, /* Community list config write only -- see bgp_vty.c */
+ RMAP_NODE, /* route-map commands */
+ SMUX_NODE, /* SNMP config write only -- see smux.c */
+ DUMP_NODE, /* BGP dump config write only -- see bgp_dump.c */
+ FORWARDING_NODE, /* forwarding config write -- see zserv.c */
+ PROTOCOL_NODE, /* protocol config write -- see zebra_vty.c */
+ VTY_NODE, /* line vty commands */
+
+ MAX_PLUS_1_NODE,
+ MAX_NODE = MAX_PLUS_1_NODE - 1
+} ;
+typedef enum node_type node_type_t ;
+
+/*------------------------------------------------------------------------------
+ * Return values for command handling.
+ *
+ * NB: when a command is executed it may return CMD_SUCCESS, CMD_WARNING
+ * or CMD_ERROR.
+ *
+ * In all cases any output required (including any warning or error
+ * messages) must already have been output.
+ *
+ * CMD_WARNING will stop configuration reader, unless ignore warning
+ * option is set.
+ *
+ * CMD_ERROR will always stop the configuration reader.
+ *
+ * If there is no output and either CMD_WARNING or CMD_ERROR, then will
+ * output a general warning message.
+ *
+ * All other return codes are for use within the command handler.
+ */
+enum cmd_return_code
+{
+ CMD_SUCCESS = 0, /* used generally */
+
+ /* Return codes suitable for command execution functions */
+
+ CMD_WARNING = 1, /* command: not 100% successful */
+ CMD_ERROR, /* command: failed badly */
+
+ CMD_CLOSE, /* command: finish up and close vty */
+
+ /* Return codes from the command parser */
+
+ CMD_EMPTY, /* parser: nothing to execute */
+
+ CMD_ERR_PARSING, /* parser: general parser error */
+ CMD_ERR_NO_MATCH, /* parser: command/argument not recognised */
+ CMD_ERR_AMBIGUOUS, /* parser: more than on command matches */
+ CMD_ERR_INCOMPLETE,
+
+ /* Return codes used in command loop */
+
+ CMD_HIATUS, /* loop: something requires attention */
+ CMD_STOP, /* loop: stop and close vty (final) */
+
+ CMD_CANCEL, /* loop: stop and close down to base
+ * vin/vout and discard output. */
+
+ /* Return codes from I/O layers */
+
+ CMD_WAITING, /* I/O: waiting for more input */
+ CMD_EOF, /* I/O: nothing more to come */
+ CMD_IO_ERROR, /* I/O: error or time-out */
+
+ /* For the chop ???? */
+
+//CMD_COMPLETE_FULL_MATCH, /* cmd_completion returns */
+//CMD_COMPLETE_MATCH,
+//CMD_COMPLETE_LIST_MATCH,
+//CMD_COMPLETE_ALREADY,
+
+
+ CMD_SUCCESS_DAEMON, /* parser: success & command is for vtysh ? */
+} ;
+
+typedef enum cmd_return_code cmd_return_code_t ;
+
+/*------------------------------------------------------------------------------
+ * Structure for each node -- root of all commands for the node.
+ *
+ * See install_node().
+ */
+struct vty ; /* Forward reference */
+
+struct cmd_node
+{
+ node_type_t node ; /* who we are */
+
+ const char* prompt ; /* prompt string for vty */
+
+ bool config_to_vtysh ; /* configuration goes to vtysh ? */
+
+ node_type_t parent ; /* parent when parsing commands */
+ node_type_t exit_to ; /* where to go on "exit" */
+ node_type_t end_to ; /* where to go on "end", "^C" or "^Z" */
+
+ int (*config_write) (struct vty*) ; /* configuration write function */
+
+ vector_t cmd_vector; /* Vector of this node's commands. */
+} ;
+
+typedef struct cmd_node cmd_node_t ;
+typedef struct cmd_node* cmd_node ;
+
+/*------------------------------------------------------------------------------
+ * Commands -- contents of the nodes' cmd_vector(s).
+ *
+ * A cmd_command is a static structure, which contains dynamic elements
+ * which are set when a command is installed. Note that is not uncommon for
+ * one cmd_command to appear in more than one node.
+ *
+ * The command attributes affect:
+ *
+ * * the parsing of the command -- in particular how the next_node is
+ * established.
+ *
+ * * whether the command is shown in help (or some forms of help if
+ * deprecated.
+ *
+ * * whether the command can be executed directly in the cli thread
+ * (avoiding having to wait for the cmd thread's attention -- this may be
+ * less useful now that all commands are treated a "priority" messages
+ * going into the cmd thread).
+ *
+ * If the command is marked CMD_ATTR_NODE, then the CMD_ATTR_MASK will
+ * extract the node_type_t that the command will set, if CMD_SUCCESS. This
+ * means that can parse commands without executing them.
+ *
+ * If the command is not marked CMD_ATTR_NODE, then the CMD_ATTR_MASK will
+ * extract the cmd_special_t value for the command -- which will be
+ * interesting if it isn't cmd_sp_simple.
+ */
+enum cmd_attr
+{
+ CMD_ATTR_SIMPLE = 0, /* bit significant */
+
+ CMD_ATTR_NODE = BIT(7), /* sets given node */
+ CMD_ATTR_MASK = CMD_ATTR_NODE - 1,
+
+ CMD_ATTR_DEPRECATED = BIT(12),
+ CMD_ATTR_HIDDEN = BIT(13), /* not shown in help */
+ CMD_ATTR_DIRECT = BIT(14), /* can run in cli thread */
+};
+typedef enum cmd_attr cmd_attr_t ;
+
+CONFIRM(CMD_ATTR_MASK >= (cmd_attr_t)MAX_NODE) ;
+
+/* Special commands, which require extra processing at parse time. */
+enum cmd_special
+{
+ cmd_sp_simple = 0,
+
+ cmd_sp_end,
+ cmd_sp_exit,
+ cmd_sp_enable,
+ cmd_sp_configure,
+
+ cmd_sp_max_plus_1,
+ cmd_sp_max = cmd_sp_max_plus_1 - 1
+} ;
+typedef enum cmd_special cmd_special_t ;
+
+CONFIRM(CMD_ATTR_MASK >= (cmd_attr_t)cmd_sp_max) ;
+
+/* Command functions and macros to define same */
+
+struct cmd_command ;
+typedef struct cmd_command* cmd_command ;
+
+typedef const char* const argv_t[] ;
+
+#define DEFUN_CMD_ARG_UNUSED __attribute__ ((unused))
+#define DEFUN_CMD_FUNCTION(name) \
+ enum cmd_return_code name (cmd_command self DEFUN_CMD_ARG_UNUSED, \
+ struct vty* vty DEFUN_CMD_ARG_UNUSED, \
+ int argc DEFUN_CMD_ARG_UNUSED, \
+ argv_t argv DEFUN_CMD_ARG_UNUSED)
+
+typedef DEFUN_CMD_FUNCTION((cmd_function)) ;
+
+/* The cmd_command structure itself */
+
+struct cmd_item ; /* Defined in command_parse.h */
+
+struct cmd_command
+{
+ const char* string ; /* Command specification by string. */
+ cmd_function* func ;
+ const char* doc ; /* Documentation of this command. */
+ int daemon ; /* Daemon to which this command belong. */
+ cmd_attr_t attr ; /* Command attributes */
+
+ vector items ; /* Vector of pointers to cmd_item(s) */
+
+ uint nt_min ; /* excluding [option](s) */
+ uint nt ; /* count of all items */
+ uint nt_max ; /* "infinite" if .vararg */
+
+ struct cmd_item* vararg ; /* if there is a vararg item */
+
+ char* r_doc ; /* rendered documentation */
+
+//char* config ; /* Configuration string */
+//vector subconfig ; /* Sub configuration string */
+};
+
+#endif /* _ZEBRA_COMMAND_COMMON_H */