Annotation of embedaddon/quagga/lib/command.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Zebra configuration command interface routine
! 3: * Copyright (C) 1997, 98 Kunihiro Ishiguro
! 4: *
! 5: * This file is part of GNU Zebra.
! 6: *
! 7: * GNU Zebra is free software; you can redistribute it and/or modify
! 8: * it under the terms of the GNU General Public License as published
! 9: * by the Free Software Foundation; either version 2, or (at your
! 10: * option) any later version.
! 11: *
! 12: * GNU Zebra is distributed in the hope that it will be useful, but
! 13: * WITHOUT ANY WARRANTY; without even the implied warranty of
! 14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 15: * General Public License for more details.
! 16: *
! 17: * You should have received a copy of the GNU General Public License
! 18: * along with GNU Zebra; see the file COPYING. If not, write to the
! 19: * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
! 20: * Boston, MA 02111-1307, USA.
! 21: */
! 22:
! 23: #ifndef _ZEBRA_COMMAND_H
! 24: #define _ZEBRA_COMMAND_H
! 25:
! 26: #include "vector.h"
! 27: #include "vty.h"
! 28: #include "lib/route_types.h"
! 29:
! 30: /* Host configuration variable */
! 31: struct host
! 32: {
! 33: /* Host name of this router. */
! 34: char *name;
! 35:
! 36: /* Password for vty interface. */
! 37: char *password;
! 38: char *password_encrypt;
! 39:
! 40: /* Enable password */
! 41: char *enable;
! 42: char *enable_encrypt;
! 43:
! 44: /* System wide terminal lines. */
! 45: int lines;
! 46:
! 47: /* Log filename. */
! 48: char *logfile;
! 49:
! 50: /* config file name of this host */
! 51: char *config;
! 52:
! 53: /* Flags for services */
! 54: int advanced;
! 55: int encrypt;
! 56:
! 57: /* Banner configuration. */
! 58: const char *motd;
! 59: char *motdfile;
! 60: };
! 61:
! 62: /* There are some command levels which called from command node. */
! 63: enum node_type
! 64: {
! 65: AUTH_NODE, /* Authentication mode of vty interface. */
! 66: RESTRICTED_NODE, /* Restricted view mode */
! 67: VIEW_NODE, /* View node. Default mode of vty interface. */
! 68: AUTH_ENABLE_NODE, /* Authentication mode for change enable. */
! 69: ENABLE_NODE, /* Enable node. */
! 70: CONFIG_NODE, /* Config node. Default mode of config file. */
! 71: SERVICE_NODE, /* Service node. */
! 72: DEBUG_NODE, /* Debug node. */
! 73: AAA_NODE, /* AAA node. */
! 74: KEYCHAIN_NODE, /* Key-chain node. */
! 75: KEYCHAIN_KEY_NODE, /* Key-chain key node. */
! 76: INTERFACE_NODE, /* Interface mode node. */
! 77: ZEBRA_NODE, /* zebra connection node. */
! 78: TABLE_NODE, /* rtm_table selection node. */
! 79: RIP_NODE, /* RIP protocol mode node. */
! 80: RIPNG_NODE, /* RIPng protocol mode node. */
! 81: BGP_NODE, /* BGP protocol mode which includes BGP4+ */
! 82: BGP_VPNV4_NODE, /* BGP MPLS-VPN PE exchange. */
! 83: BGP_IPV4_NODE, /* BGP IPv4 unicast address family. */
! 84: BGP_IPV4M_NODE, /* BGP IPv4 multicast address family. */
! 85: BGP_IPV6_NODE, /* BGP IPv6 address family */
! 86: BGP_IPV6M_NODE, /* BGP IPv6 multicast address family. */
! 87: OSPF_NODE, /* OSPF protocol mode */
! 88: OSPF6_NODE, /* OSPF protocol for IPv6 mode */
! 89: ISIS_NODE, /* ISIS protocol mode */
! 90: MASC_NODE, /* MASC for multicast. */
! 91: IRDP_NODE, /* ICMP Router Discovery Protocol mode. */
! 92: IP_NODE, /* Static ip route node. */
! 93: ACCESS_NODE, /* Access list node. */
! 94: PREFIX_NODE, /* Prefix list node. */
! 95: ACCESS_IPV6_NODE, /* Access list node. */
! 96: PREFIX_IPV6_NODE, /* Prefix list node. */
! 97: AS_LIST_NODE, /* AS list node. */
! 98: COMMUNITY_LIST_NODE, /* Community list node. */
! 99: RMAP_NODE, /* Route map node. */
! 100: SMUX_NODE, /* SNMP configuration node. */
! 101: DUMP_NODE, /* Packet dump node. */
! 102: FORWARDING_NODE, /* IP forwarding node. */
! 103: PROTOCOL_NODE, /* protocol filtering node */
! 104: VTY_NODE, /* Vty node. */
! 105: };
! 106:
! 107: /* Node which has some commands and prompt string and configuration
! 108: function pointer . */
! 109: struct cmd_node
! 110: {
! 111: /* Node index. */
! 112: enum node_type node;
! 113:
! 114: /* Prompt character at vty interface. */
! 115: const char *prompt;
! 116:
! 117: /* Is this node's configuration goes to vtysh ? */
! 118: int vtysh;
! 119:
! 120: /* Node's configuration write function */
! 121: int (*func) (struct vty *);
! 122:
! 123: /* Vector of this node's command list. */
! 124: vector cmd_vector;
! 125: };
! 126:
! 127: enum
! 128: {
! 129: CMD_ATTR_DEPRECATED = 1,
! 130: CMD_ATTR_HIDDEN,
! 131: };
! 132:
! 133: /* Structure of command element. */
! 134: struct cmd_element
! 135: {
! 136: const char *string; /* Command specification by string. */
! 137: int (*func) (struct cmd_element *, struct vty *, int, const char *[]);
! 138: const char *doc; /* Documentation of this command. */
! 139: int daemon; /* Daemon to which this command belong. */
! 140: vector strvec; /* Pointing out each description vector. */
! 141: unsigned int cmdsize; /* Command index count. */
! 142: char *config; /* Configuration string */
! 143: vector subconfig; /* Sub configuration string */
! 144: u_char attr; /* Command attributes */
! 145: };
! 146:
! 147: /* Command description structure. */
! 148: struct desc
! 149: {
! 150: char *cmd; /* Command string. */
! 151: char *str; /* Command's description. */
! 152: };
! 153:
! 154: /* Return value of the commands. */
! 155: #define CMD_SUCCESS 0
! 156: #define CMD_WARNING 1
! 157: #define CMD_ERR_NO_MATCH 2
! 158: #define CMD_ERR_AMBIGUOUS 3
! 159: #define CMD_ERR_INCOMPLETE 4
! 160: #define CMD_ERR_EXEED_ARGC_MAX 5
! 161: #define CMD_ERR_NOTHING_TODO 6
! 162: #define CMD_COMPLETE_FULL_MATCH 7
! 163: #define CMD_COMPLETE_MATCH 8
! 164: #define CMD_COMPLETE_LIST_MATCH 9
! 165: #define CMD_SUCCESS_DAEMON 10
! 166:
! 167: /* Argc max counts. */
! 168: #define CMD_ARGC_MAX 25
! 169:
! 170: /* Turn off these macros when uisng cpp with extract.pl */
! 171: #ifndef VTYSH_EXTRACT_PL
! 172:
! 173: /* helper defines for end-user DEFUN* macros */
! 174: #define DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attrs, dnum) \
! 175: struct cmd_element cmdname = \
! 176: { \
! 177: .string = cmdstr, \
! 178: .func = funcname, \
! 179: .doc = helpstr, \
! 180: .attr = attrs, \
! 181: .daemon = dnum, \
! 182: };
! 183:
! 184: #define DEFUN_CMD_FUNC_DECL(funcname) \
! 185: static int funcname (struct cmd_element *, struct vty *, int, const char *[]);
! 186:
! 187: #define DEFUN_CMD_FUNC_TEXT(funcname) \
! 188: static int funcname \
! 189: (struct cmd_element *self __attribute__ ((unused)), \
! 190: struct vty *vty __attribute__ ((unused)), \
! 191: int argc __attribute__ ((unused)), \
! 192: const char *argv[] __attribute__ ((unused)) )
! 193:
! 194: /* DEFUN for vty command interafce. Little bit hacky ;-). */
! 195: #define DEFUN(funcname, cmdname, cmdstr, helpstr) \
! 196: DEFUN_CMD_FUNC_DECL(funcname) \
! 197: DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0) \
! 198: DEFUN_CMD_FUNC_TEXT(funcname)
! 199:
! 200: #define DEFUN_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
! 201: DEFUN_CMD_FUNC_DECL(funcname) \
! 202: DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, 0) \
! 203: DEFUN_CMD_FUNC_TEXT(funcname)
! 204:
! 205: #define DEFUN_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
! 206: DEFUN_ATTR (funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN)
! 207:
! 208: #define DEFUN_DEPRECATED(funcname, cmdname, cmdstr, helpstr) \
! 209: DEFUN_ATTR (funcname, cmdname, cmdstr, helpstr, CMD_ATTR_DEPRECATED) \
! 210:
! 211: /* DEFUN_NOSH for commands that vtysh should ignore */
! 212: #define DEFUN_NOSH(funcname, cmdname, cmdstr, helpstr) \
! 213: DEFUN(funcname, cmdname, cmdstr, helpstr)
! 214:
! 215: /* DEFSH for vtysh. */
! 216: #define DEFSH(daemon, cmdname, cmdstr, helpstr) \
! 217: DEFUN_CMD_ELEMENT(NULL, cmdname, cmdstr, helpstr, 0, daemon) \
! 218:
! 219: /* DEFUN + DEFSH */
! 220: #define DEFUNSH(daemon, funcname, cmdname, cmdstr, helpstr) \
! 221: DEFUN_CMD_FUNC_DECL(funcname) \
! 222: DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, daemon) \
! 223: DEFUN_CMD_FUNC_TEXT(funcname)
! 224:
! 225: /* DEFUN + DEFSH with attributes */
! 226: #define DEFUNSH_ATTR(daemon, funcname, cmdname, cmdstr, helpstr, attr) \
! 227: DEFUN_CMD_FUNC_DECL(funcname) \
! 228: DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, daemon) \
! 229: DEFUN_CMD_FUNC_TEXT(funcname)
! 230:
! 231: #define DEFUNSH_HIDDEN(daemon, funcname, cmdname, cmdstr, helpstr) \
! 232: DEFUNSH_ATTR (daemon, funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN)
! 233:
! 234: #define DEFUNSH_DEPRECATED(daemon, funcname, cmdname, cmdstr, helpstr) \
! 235: DEFUNSH_ATTR (daemon, funcname, cmdname, cmdstr, helpstr, CMD_ATTR_DEPRECATED)
! 236:
! 237: /* ALIAS macro which define existing command's alias. */
! 238: #define ALIAS(funcname, cmdname, cmdstr, helpstr) \
! 239: DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0)
! 240:
! 241: #define ALIAS_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
! 242: DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, 0)
! 243:
! 244: #define ALIAS_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
! 245: DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, 0)
! 246:
! 247: #define ALIAS_DEPRECATED(funcname, cmdname, cmdstr, helpstr) \
! 248: DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_DEPRECATED, 0)
! 249:
! 250: #define ALIAS_SH(daemon, funcname, cmdname, cmdstr, helpstr) \
! 251: DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, daemon)
! 252:
! 253: #define ALIAS_SH_HIDDEN(daemon, funcname, cmdname, cmdstr, helpstr) \
! 254: DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, daemon)
! 255:
! 256: #define ALIAS_SH_DEPRECATED(daemon, funcname, cmdname, cmdstr, helpstr) \
! 257: DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_DEPRECATED, daemon)
! 258:
! 259: #endif /* VTYSH_EXTRACT_PL */
! 260:
! 261: /* Some macroes */
! 262: #define CMD_OPTION(S) ((S[0]) == '[')
! 263: #define CMD_VARIABLE(S) (((S[0]) >= 'A' && (S[0]) <= 'Z') || ((S[0]) == '<'))
! 264: #define CMD_VARARG(S) ((S[0]) == '.')
! 265: #define CMD_RANGE(S) ((S[0] == '<'))
! 266:
! 267: #define CMD_IPV4(S) ((strcmp ((S), "A.B.C.D") == 0))
! 268: #define CMD_IPV4_PREFIX(S) ((strcmp ((S), "A.B.C.D/M") == 0))
! 269: #define CMD_IPV6(S) ((strcmp ((S), "X:X::X:X") == 0))
! 270: #define CMD_IPV6_PREFIX(S) ((strcmp ((S), "X:X::X:X/M") == 0))
! 271:
! 272: /* Common descriptions. */
! 273: #define SHOW_STR "Show running system information\n"
! 274: #define IP_STR "IP information\n"
! 275: #define IPV6_STR "IPv6 information\n"
! 276: #define NO_STR "Negate a command or set its defaults\n"
! 277: #define REDIST_STR "Redistribute information from another routing protocol\n"
! 278: #define CLEAR_STR "Reset functions\n"
! 279: #define RIP_STR "RIP information\n"
! 280: #define BGP_STR "BGP information\n"
! 281: #define OSPF_STR "OSPF information\n"
! 282: #define NEIGHBOR_STR "Specify neighbor router\n"
! 283: #define DEBUG_STR "Debugging functions (see also 'undebug')\n"
! 284: #define UNDEBUG_STR "Disable debugging functions (see also 'debug')\n"
! 285: #define ROUTER_STR "Enable a routing process\n"
! 286: #define AS_STR "AS number\n"
! 287: #define MBGP_STR "MBGP information\n"
! 288: #define MATCH_STR "Match values from routing table\n"
! 289: #define SET_STR "Set values in destination routing protocol\n"
! 290: #define OUT_STR "Filter outgoing routing updates\n"
! 291: #define IN_STR "Filter incoming routing updates\n"
! 292: #define V4NOTATION_STR "specify by IPv4 address notation(e.g. 0.0.0.0)\n"
! 293: #define OSPF6_NUMBER_STR "Specify by number\n"
! 294: #define INTERFACE_STR "Interface infomation\n"
! 295: #define IFNAME_STR "Interface name(e.g. ep0)\n"
! 296: #define IP6_STR "IPv6 Information\n"
! 297: #define OSPF6_STR "Open Shortest Path First (OSPF) for IPv6\n"
! 298: #define OSPF6_ROUTER_STR "Enable a routing process\n"
! 299: #define OSPF6_INSTANCE_STR "<1-65535> Instance ID\n"
! 300: #define SECONDS_STR "<1-65535> Seconds\n"
! 301: #define ROUTE_STR "Routing Table\n"
! 302: #define PREFIX_LIST_STR "Build a prefix list\n"
! 303: #define OSPF6_DUMP_TYPE_LIST \
! 304: "(neighbor|interface|area|lsa|zebra|config|dbex|spf|route|lsdb|redistribute|hook|asbr|prefix|abr)"
! 305: #define ISIS_STR "IS-IS information\n"
! 306: #define AREA_TAG_STR "[area tag]\n"
! 307:
! 308: #define CONF_BACKUP_EXT ".sav"
! 309:
! 310: /* IPv4 only machine should not accept IPv6 address for peer's IP
! 311: address. So we replace VTY command string like below. */
! 312: #ifdef HAVE_IPV6
! 313: #define NEIGHBOR_CMD "neighbor (A.B.C.D|X:X::X:X) "
! 314: #define NO_NEIGHBOR_CMD "no neighbor (A.B.C.D|X:X::X:X) "
! 315: #define NEIGHBOR_ADDR_STR "Neighbor address\nIPv6 address\n"
! 316: #define NEIGHBOR_CMD2 "neighbor (A.B.C.D|X:X::X:X|WORD) "
! 317: #define NO_NEIGHBOR_CMD2 "no neighbor (A.B.C.D|X:X::X:X|WORD) "
! 318: #define NEIGHBOR_ADDR_STR2 "Neighbor address\nNeighbor IPv6 address\nNeighbor tag\n"
! 319: #else
! 320: #define NEIGHBOR_CMD "neighbor A.B.C.D "
! 321: #define NO_NEIGHBOR_CMD "no neighbor A.B.C.D "
! 322: #define NEIGHBOR_ADDR_STR "Neighbor address\n"
! 323: #define NEIGHBOR_CMD2 "neighbor (A.B.C.D|WORD) "
! 324: #define NO_NEIGHBOR_CMD2 "no neighbor (A.B.C.D|WORD) "
! 325: #define NEIGHBOR_ADDR_STR2 "Neighbor address\nNeighbor tag\n"
! 326: #endif /* HAVE_IPV6 */
! 327:
! 328: /* Prototypes. */
! 329: extern void install_node (struct cmd_node *, int (*) (struct vty *));
! 330: extern void install_default (enum node_type);
! 331: extern void install_element (enum node_type, struct cmd_element *);
! 332: extern void sort_node (void);
! 333:
! 334: /* Concatenates argv[shift] through argv[argc-1] into a single NUL-terminated
! 335: string with a space between each element (allocated using
! 336: XMALLOC(MTYPE_TMP)). Returns NULL if shift >= argc. */
! 337: extern char *argv_concat (const char **argv, int argc, int shift);
! 338:
! 339: extern vector cmd_make_strvec (const char *);
! 340: extern void cmd_free_strvec (vector);
! 341: extern vector cmd_describe_command (vector, struct vty *, int *status);
! 342: extern char **cmd_complete_command (vector, struct vty *, int *status);
! 343: extern const char *cmd_prompt (enum node_type);
! 344: extern int config_from_file (struct vty *, FILE *);
! 345: extern enum node_type node_parent (enum node_type);
! 346: extern int cmd_execute_command (vector, struct vty *, struct cmd_element **, int);
! 347: extern int cmd_execute_command_strict (vector, struct vty *, struct cmd_element **);
! 348: extern void config_replace_string (struct cmd_element *, char *, ...);
! 349: extern void cmd_init (int);
! 350: extern void cmd_terminate (void);
! 351:
! 352: /* Export typical functions. */
! 353: extern struct cmd_element config_end_cmd;
! 354: extern struct cmd_element config_exit_cmd;
! 355: extern struct cmd_element config_quit_cmd;
! 356: extern struct cmd_element config_help_cmd;
! 357: extern struct cmd_element config_list_cmd;
! 358: extern char *host_config_file (void);
! 359: extern void host_config_set (char *);
! 360:
! 361: extern void print_version (const char *);
! 362:
! 363: /* struct host global, ick */
! 364: extern struct host host;
! 365:
! 366: /* "<cr>" global */
! 367: extern char *command_cr;
! 368: #endif /* _ZEBRA_COMMAND_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>