File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / vtysh / vtysh.c
Revision 1.1.1.4 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Nov 2 10:09:10 2016 UTC (7 years, 7 months ago) by misho
Branches: quagga, MAIN
CVS tags: v1_0_20160315, HEAD
quagga 1.0.20160315

    1: /* Virtual terminal interface shell.
    2:  * Copyright (C) 2000 Kunihiro Ishiguro
    3:  *
    4:  * This file is part of GNU Zebra.
    5:  *
    6:  * GNU Zebra is free software; you can redistribute it and/or modify it
    7:  * under the terms of the GNU General Public License as published by the
    8:  * Free Software Foundation; either version 2, or (at your option) any
    9:  * later version.
   10:  *
   11:  * GNU Zebra is distributed in the hope that it will be useful, but
   12:  * WITHOUT ANY WARRANTY; without even the implied warranty of
   13:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   14:  * General Public License for more details.
   15:  *
   16:  * You should have received a copy of the GNU General Public License
   17:  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
   18:  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
   19:  * 02111-1307, USA.  
   20:  */
   21: 
   22: #include <zebra.h>
   23: 
   24: #include <sys/un.h>
   25: #include <setjmp.h>
   26: #include <sys/wait.h>
   27: #include <sys/resource.h>
   28: #include <sys/stat.h>
   29: 
   30: #include <readline/readline.h>
   31: #include <readline/history.h>
   32: 
   33: #include "command.h"
   34: #include "memory.h"
   35: #include "vtysh/vtysh.h"
   36: #include "log.h"
   37: #include "bgpd/bgp_vty.h"
   38: #include "vrf.h"
   39: 
   40: /* Struct VTY. */
   41: struct vty *vty;
   42: 
   43: /* VTY shell pager name. */
   44: char *vtysh_pager_name = NULL;
   45: 
   46: /* VTY shell client structure. */
   47: struct vtysh_client
   48: {
   49:   int fd;
   50:   const char *name;
   51:   int flag;
   52:   const char *path;
   53: } vtysh_client[] =
   54: {
   55:   { .fd = -1, .name = "zebra", .flag = VTYSH_ZEBRA, .path = ZEBRA_VTYSH_PATH},
   56:   { .fd = -1, .name = "ripd", .flag = VTYSH_RIPD, .path = RIP_VTYSH_PATH},
   57:   { .fd = -1, .name = "ripngd", .flag = VTYSH_RIPNGD, .path = RIPNG_VTYSH_PATH},
   58:   { .fd = -1, .name = "ospfd", .flag = VTYSH_OSPFD, .path = OSPF_VTYSH_PATH},
   59:   { .fd = -1, .name = "ospf6d", .flag = VTYSH_OSPF6D, .path = OSPF6_VTYSH_PATH},
   60:   { .fd = -1, .name = "bgpd", .flag = VTYSH_BGPD, .path = BGP_VTYSH_PATH},
   61:   { .fd = -1, .name = "isisd", .flag = VTYSH_ISISD, .path = ISIS_VTYSH_PATH},
   62:   { .fd = -1, .name = "pimd", .flag = VTYSH_PIMD, .path = PIM_VTYSH_PATH},
   63: };
   64: 
   65: 
   66: /* We need direct access to ripd to implement vtysh_exit_ripd_only. */
   67: static struct vtysh_client *ripd_client = NULL;
   68:  
   69: 
   70: /* Using integrated config from Quagga.conf. Default is no. */
   71: int vtysh_writeconfig_integrated = 0;
   72: 
   73: extern char config_default[];
   74: 
   75: static void
   76: vclient_close (struct vtysh_client *vclient)
   77: {
   78:   if (vclient->fd >= 0)
   79:     {
   80:       fprintf(stderr,
   81: 	      "Warning: closing connection to %s because of an I/O error!\n",
   82: 	      vclient->name);
   83:       close (vclient->fd);
   84:       vclient->fd = -1;
   85:     }
   86: }
   87: 
   88: /* Following filled with debug code to trace a problematic condition
   89:  * under load - it SHOULD handle it. */
   90: #define ERR_WHERE_STRING "vtysh(): vtysh_client_execute(): "
   91: static int
   92: vtysh_client_execute (struct vtysh_client *vclient, const char *line, FILE *fp)
   93: {
   94:   int ret;
   95:   char *buf;
   96:   size_t bufsz;
   97:   char *pbuf;
   98:   size_t left;
   99:   char *eoln;
  100:   int nbytes;
  101:   int i;
  102:   int readln;
  103:   int numnulls = 0;
  104: 
  105:   if (vclient->fd < 0)
  106:     return CMD_SUCCESS;
  107: 
  108:   ret = write (vclient->fd, line, strlen (line) + 1);
  109:   if (ret <= 0)
  110:     {
  111:       vclient_close (vclient);
  112:       return CMD_SUCCESS;
  113:     }
  114: 	
  115:   /* Allow enough room for buffer to read more than a few pages from socket. */
  116:   bufsz = 5 * getpagesize() + 1;
  117:   buf = XMALLOC(MTYPE_TMP, bufsz);
  118:   memset(buf, 0, bufsz);
  119:   pbuf = buf;
  120: 
  121:   while (1)
  122:     {
  123:       if (pbuf >= ((buf + bufsz) -1))
  124: 	{
  125: 	  fprintf (stderr, ERR_WHERE_STRING \
  126: 		   "warning - pbuf beyond buffer end.\n");
  127: 	  return CMD_WARNING;
  128: 	}
  129: 
  130:       readln = (buf + bufsz) - pbuf - 1;
  131:       nbytes = read (vclient->fd, pbuf, readln);
  132: 
  133:       if (nbytes <= 0)
  134: 	{
  135: 
  136: 	  if (errno == EINTR)
  137: 	    continue;
  138: 
  139: 	  fprintf(stderr, ERR_WHERE_STRING "(%u)", errno);
  140: 	  perror("");
  141: 
  142: 	  if (errno == EAGAIN || errno == EIO)
  143: 	    continue;
  144: 
  145: 	  vclient_close (vclient);
  146: 	  XFREE(MTYPE_TMP, buf);
  147: 	  return CMD_SUCCESS;
  148: 	}
  149:       /* If we have already seen 3 nulls, then current byte is ret code */
  150:       if ((numnulls == 3) && (nbytes == 1))
  151:         {
  152:            ret = pbuf[0];
  153:            break;
  154:         }
  155: 
  156:       pbuf[nbytes] = '\0';
  157: 
  158:        /* If the config needs to be written in file or stdout */
  159:        if (fp)
  160:        {
  161:          fputs(pbuf, fp);
  162:          fflush (fp);
  163:        }
  164: 
  165:        /* At max look last four bytes */
  166:        if (nbytes >= 4)
  167:        {
  168:          i = nbytes - 4;
  169:          numnulls = 0;
  170:        }
  171:        else
  172:          i = 0;
  173: 
  174:        /* Count the numnulls */ 
  175:        while (i < nbytes && numnulls <3)
  176:        {
  177:          if (pbuf[i++] == '\0')
  178:             numnulls++;
  179:          else
  180:             numnulls = 0;
  181:        }
  182:        /* We might have seen 3 consecutive nulls so store the ret code before updating pbuf*/
  183:        ret = pbuf[nbytes-1];
  184:        pbuf += nbytes;
  185: 
  186:        /* See if a line exists in buffer, if so parse and consume it, and
  187:         * reset read position. If 3 nulls has been encountered consume the buffer before 
  188:         * next read.
  189:         */
  190:        if (((eoln = strrchr(buf, '\n')) == NULL) && (numnulls<3))
  191:          continue;
  192: 
  193:        if (eoln >= ((buf + bufsz) - 1))
  194:        {
  195:           fprintf (stderr, ERR_WHERE_STRING \
  196:                "warning - eoln beyond buffer end.\n");
  197:        }
  198: 
  199:        /* If the config needs parsing, consume it */
  200:        if(!fp)
  201:          vtysh_config_parse(buf);
  202: 
  203:        eoln++;
  204:        left = (size_t)(buf + bufsz - eoln);
  205:        /*
  206:         * This check is required since when a config line split between two consecutive reads, 
  207:         * then buf will have first half of config line and current read will bring rest of the 
  208:         * line. So in this case eoln will be 1 here, hence calculation of left will be wrong. 
  209:         * In this case we don't need to do memmove, because we have already seen 3 nulls.  
  210:         */
  211:        if(left < bufsz)
  212:          memmove(buf, eoln, left);
  213: 
  214:        buf[bufsz-1] = '\0';
  215:        pbuf = buf + strlen(buf);
  216:        /* got 3 or more trailing NULs? */
  217:        if ((numnulls >=3) && (i < nbytes))
  218:        {
  219:           break;
  220:        }
  221:     }
  222: 
  223:   if(!fp)
  224:     vtysh_config_parse (buf);
  225: 
  226:   XFREE(MTYPE_TMP, buf);
  227:   return ret;
  228: }
  229:  
  230: 
  231: void
  232: vtysh_pager_init (void)
  233: {
  234:   char *pager_defined;
  235: 
  236:   pager_defined = getenv ("VTYSH_PAGER");
  237: 
  238:   if (pager_defined)
  239:     vtysh_pager_name = strdup (pager_defined);
  240:   else
  241:     vtysh_pager_name = strdup ("more");
  242: }
  243: 
  244: /* Command execution over the vty interface. */
  245: static int
  246: vtysh_execute_func (const char *line, int pager)
  247: {
  248:   int ret, cmd_stat;
  249:   u_int i;
  250:   vector vline;
  251:   struct cmd_element *cmd;
  252:   FILE *fp = NULL;
  253:   int closepager = 0;
  254:   int tried = 0;
  255:   int saved_ret, saved_node;
  256: 
  257:   /* Split readline string up into the vector. */
  258:   vline = cmd_make_strvec (line);
  259: 
  260:   if (vline == NULL)
  261:     return CMD_SUCCESS;
  262: 
  263:   saved_ret = ret = cmd_execute_command (vline, vty, &cmd, 1);
  264:   saved_node = vty->node;
  265: 
  266:   /* If command doesn't succeeded in current node, try to walk up in node tree.
  267:    * Changing vty->node is enough to try it just out without actual walkup in
  268:    * the vtysh. */
  269:   while (ret != CMD_SUCCESS && ret != CMD_SUCCESS_DAEMON && ret != CMD_WARNING
  270: 	 && vty->node > CONFIG_NODE)
  271:     {
  272:       vty->node = node_parent(vty->node);
  273:       ret = cmd_execute_command (vline, vty, &cmd, 1);
  274:       tried++;
  275:     }
  276: 
  277:   vty->node = saved_node;
  278: 
  279:   /* If command succeeded in any other node than current (tried > 0) we have
  280:    * to move into node in the vtysh where it succeeded. */
  281:   if (ret == CMD_SUCCESS || ret == CMD_SUCCESS_DAEMON || ret == CMD_WARNING)
  282:     {
  283:       if ((saved_node == BGP_VPNV4_NODE || saved_node == BGP_VPNV6_NODE
  284: 	   || saved_node == BGP_ENCAP_NODE || saved_node == BGP_ENCAPV6_NODE
  285:            || saved_node == BGP_IPV4_NODE
  286: 	   || saved_node == BGP_IPV6_NODE || saved_node == BGP_IPV4M_NODE
  287: 	   || saved_node == BGP_IPV6M_NODE)
  288: 	  && (tried == 1))
  289: 	{
  290: 	  vtysh_execute("exit-address-family");
  291: 	}
  292:       else if ((saved_node == KEYCHAIN_KEY_NODE) && (tried == 1))
  293: 	{
  294: 	  vtysh_execute("exit");
  295: 	}
  296:       else if (tried)
  297: 	{
  298: 	  vtysh_execute ("end");
  299: 	  vtysh_execute ("configure terminal");
  300: 	}
  301:     }
  302:   /* If command didn't succeed in any node, continue with return value from
  303:    * first try. */
  304:   else if (tried)
  305:     {
  306:       ret = saved_ret;
  307:     }
  308: 
  309:   cmd_free_strvec (vline);
  310: 
  311:   cmd_stat = ret;
  312:   switch (ret)
  313:     {
  314:     case CMD_WARNING:
  315:       if (vty->type == VTY_FILE)
  316: 	fprintf (stdout,"Warning...\n");
  317:       break;
  318:     case CMD_ERR_AMBIGUOUS:
  319:       fprintf (stdout,"%% Ambiguous command.\n");
  320:       break;
  321:     case CMD_ERR_NO_MATCH:
  322:       fprintf (stdout,"%% Unknown command.\n");
  323:       break;
  324:     case CMD_ERR_INCOMPLETE:
  325:       fprintf (stdout,"%% Command incomplete.\n");
  326:       break;
  327:     case CMD_SUCCESS_DAEMON:
  328:       {
  329: 	/* FIXME: Don't open pager for exit commands. popen() causes problems
  330: 	 * if exited from vtysh at all. This hack shouldn't cause any problem
  331: 	 * but is really ugly. */
  332: 	if (pager && vtysh_pager_name && (strncmp(line, "exit", 4) != 0))
  333: 	  {
  334: 	    fp = popen (vtysh_pager_name, "w");
  335: 	    if (fp == NULL)
  336: 	      {
  337: 		perror ("popen failed for pager");
  338: 		fp = stdout;
  339: 	      }
  340: 	    else
  341: 	      closepager=1;
  342: 	  }
  343: 	else
  344: 	  fp = stdout;
  345: 
  346: 	if (! strcmp(cmd->string,"configure terminal"))
  347: 	  {
  348: 	    for (i = 0; i < array_size(vtysh_client); i++)
  349: 	      {
  350: 	        cmd_stat = vtysh_client_execute(&vtysh_client[i], line, fp);
  351: 		if (cmd_stat == CMD_WARNING)
  352: 		  break;
  353: 	      }
  354: 
  355: 	    if (cmd_stat)
  356: 	      {
  357: 		line = "end";
  358: 		vline = cmd_make_strvec (line);
  359: 
  360: 		if (vline == NULL)
  361: 		  {
  362: 		    if (pager && vtysh_pager_name && fp && closepager)
  363: 		      {
  364: 			if (pclose (fp) == -1)
  365: 			  {
  366: 			    perror ("pclose failed for pager");
  367: 			  }
  368: 			fp = NULL;
  369: 		      }
  370: 		    return CMD_SUCCESS;
  371: 		  }
  372: 
  373: 		ret = cmd_execute_command (vline, vty, &cmd, 1);
  374: 		cmd_free_strvec (vline);
  375: 		if (ret != CMD_SUCCESS_DAEMON)
  376: 		  break;
  377: 	      }
  378: 	    else
  379: 	      if (cmd->func)
  380: 		{
  381: 		  (*cmd->func) (cmd, vty, 0, NULL);
  382: 		  break;
  383: 		}
  384: 	  }
  385: 
  386: 	cmd_stat = CMD_SUCCESS;
  387: 	for (i = 0; i < array_size(vtysh_client); i++)
  388: 	  {
  389: 	    if (cmd->daemon & vtysh_client[i].flag)
  390: 	      {
  391: 	        cmd_stat = vtysh_client_execute(&vtysh_client[i], line, fp);
  392: 		if (cmd_stat != CMD_SUCCESS)
  393: 		  break;
  394: 	      }
  395: 	  }
  396: 	if (cmd_stat != CMD_SUCCESS)
  397: 	  break;
  398: 
  399: 	if (cmd->func)
  400: 	  (*cmd->func) (cmd, vty, 0, NULL);
  401:       }
  402:     }
  403:   if (pager && vtysh_pager_name && fp && closepager)
  404:     {
  405:       if (pclose (fp) == -1)
  406: 	{
  407: 	  perror ("pclose failed for pager");
  408: 	}
  409:       fp = NULL;
  410:     }
  411:   return cmd_stat;
  412: }
  413: 
  414: int
  415: vtysh_execute_no_pager (const char *line)
  416: {
  417:   return vtysh_execute_func (line, 0);
  418: }
  419: 
  420: int
  421: vtysh_execute (const char *line)
  422: {
  423:   return vtysh_execute_func (line, 1);
  424: }
  425: 
  426: /* Configration make from file. */
  427: int
  428: vtysh_config_from_file (struct vty *vty, FILE *fp)
  429: {
  430:   int ret;
  431:   struct cmd_element *cmd;
  432: 
  433:   while (fgets (vty->buf, VTY_BUFSIZ, fp))
  434:     {
  435:       ret = command_config_read_one_line (vty, &cmd, 1);
  436: 
  437:       switch (ret)
  438: 	{
  439: 	case CMD_WARNING:
  440: 	  if (vty->type == VTY_FILE)
  441: 	    fprintf (stdout,"Warning...\n");
  442: 	  break;
  443: 	case CMD_ERR_AMBIGUOUS:
  444: 	  fprintf (stdout,"%% Ambiguous command.\n");
  445: 	  break;
  446: 	case CMD_ERR_NO_MATCH:
  447: 	  fprintf (stdout,"%% Unknown command: %s", vty->buf);
  448: 	  break;
  449: 	case CMD_ERR_INCOMPLETE:
  450: 	  fprintf (stdout,"%% Command incomplete.\n");
  451: 	  break;
  452: 	case CMD_SUCCESS_DAEMON:
  453: 	  {
  454: 	    u_int i;
  455: 	    int cmd_stat = CMD_SUCCESS;
  456: 
  457: 	    for (i = 0; i < array_size(vtysh_client); i++)
  458: 	      {
  459: 	        if (cmd->daemon & vtysh_client[i].flag)
  460: 		  {
  461: 		    cmd_stat = vtysh_client_execute (&vtysh_client[i],
  462: 						     vty->buf, stdout);
  463: 		    if (cmd_stat != CMD_SUCCESS)
  464: 		      break;
  465: 		  }
  466: 	      }
  467: 	    if (cmd_stat != CMD_SUCCESS)
  468: 	      break;
  469: 
  470: 	    if (cmd->func)
  471: 	      (*cmd->func) (cmd, vty, 0, NULL);
  472: 	  }
  473: 	}
  474:     }
  475:   return CMD_SUCCESS;
  476: }
  477: 
  478: /* We don't care about the point of the cursor when '?' is typed. */
  479: static int
  480: vtysh_rl_describe (void)
  481: {
  482:   int ret;
  483:   unsigned int i;
  484:   vector vline;
  485:   vector describe;
  486:   int width;
  487:   struct cmd_token *token;
  488: 
  489:   vline = cmd_make_strvec (rl_line_buffer);
  490: 
  491:   /* In case of '> ?'. */
  492:   if (vline == NULL)
  493:     {
  494:       vline = vector_init (1);
  495:       vector_set (vline, NULL);
  496:     }
  497:   else 
  498:     if (rl_end && isspace ((int) rl_line_buffer[rl_end - 1]))
  499:       vector_set (vline, NULL);
  500: 
  501:   describe = cmd_describe_command (vline, vty, &ret);
  502: 
  503:   fprintf (stdout,"\n");
  504: 
  505:   /* Ambiguous and no match error. */
  506:   switch (ret)
  507:     {
  508:     case CMD_ERR_AMBIGUOUS:
  509:       cmd_free_strvec (vline);
  510:       fprintf (stdout,"%% Ambiguous command.\n");
  511:       rl_on_new_line ();
  512:       return 0;
  513:       break;
  514:     case CMD_ERR_NO_MATCH:
  515:       cmd_free_strvec (vline);
  516:       fprintf (stdout,"%% There is no matched command.\n");
  517:       rl_on_new_line ();
  518:       return 0;
  519:       break;
  520:     }  
  521: 
  522:   /* Get width of command string. */
  523:   width = 0;
  524:   for (i = 0; i < vector_active (describe); i++)
  525:     if ((token = vector_slot (describe, i)) != NULL)
  526:       {
  527: 	int len;
  528: 
  529: 	if (token->cmd[0] == '\0')
  530: 	  continue;
  531: 
  532: 	len = strlen (token->cmd);
  533: 	if (token->cmd[0] == '.')
  534: 	  len--;
  535: 
  536: 	if (width < len)
  537: 	  width = len;
  538:       }
  539: 
  540:   for (i = 0; i < vector_active (describe); i++)
  541:     if ((token = vector_slot (describe, i)) != NULL)
  542:       {
  543: 	if (token->cmd[0] == '\0')
  544: 	  continue;
  545: 
  546: 	if (! token->desc)
  547: 	  fprintf (stdout,"  %-s\n",
  548: 		   token->cmd[0] == '.' ? token->cmd + 1 : token->cmd);
  549: 	else
  550: 	  fprintf (stdout,"  %-*s  %s\n",
  551: 		   width,
  552: 		   token->cmd[0] == '.' ? token->cmd + 1 : token->cmd,
  553: 		   token->desc);
  554:       }
  555: 
  556:   cmd_free_strvec (vline);
  557:   vector_free (describe);
  558: 
  559:   rl_on_new_line();
  560: 
  561:   return 0;
  562: }
  563: 
  564: /* Result of cmd_complete_command() call will be stored here
  565:  * and used in new_completion() in order to put the space in
  566:  * correct places only. */
  567: int complete_status;
  568: 
  569: static char *
  570: command_generator (const char *text, int state)
  571: {
  572:   vector vline;
  573:   static char **matched = NULL;
  574:   static int index = 0;
  575: 
  576:   /* First call. */
  577:   if (! state)
  578:     {
  579:       index = 0;
  580: 
  581:       if (vty->node == AUTH_NODE || vty->node == AUTH_ENABLE_NODE)
  582: 	return NULL;
  583: 
  584:       vline = cmd_make_strvec (rl_line_buffer);
  585:       if (vline == NULL)
  586: 	return NULL;
  587: 
  588:       if (rl_end && isspace ((int) rl_line_buffer[rl_end - 1]))
  589:         vector_set (vline, NULL);
  590: 
  591:       matched = cmd_complete_command (vline, vty, &complete_status);
  592:     }
  593: 
  594:   if (matched && matched[index])
  595:     return matched[index++];
  596: 
  597:   return NULL;
  598: }
  599: 
  600: static char **
  601: new_completion (char *text, int start, int end)
  602: {
  603:   char **matches;
  604: 
  605:   matches = rl_completion_matches (text, command_generator);
  606: 
  607:   if (matches)
  608:     {
  609:       rl_point = rl_end;
  610:       if (complete_status != CMD_COMPLETE_FULL_MATCH)
  611:         /* only append a space on full match */
  612:         rl_completion_append_character = '\0';
  613:     }
  614: 
  615:   return matches;
  616: }
  617: 
  618: #if 0
  619: /* This function is not actually being used. */
  620: static char **
  621: vtysh_completion (char *text, int start, int end)
  622: {
  623:   int ret;
  624:   vector vline;
  625:   char **matched = NULL;
  626: 
  627:   if (vty->node == AUTH_NODE || vty->node == AUTH_ENABLE_NODE)
  628:     return NULL;
  629: 
  630:   vline = cmd_make_strvec (rl_line_buffer);
  631:   if (vline == NULL)
  632:     return NULL;
  633: 
  634:   /* In case of 'help \t'. */
  635:   if (rl_end && isspace ((int) rl_line_buffer[rl_end - 1]))
  636:     vector_set (vline, '\0');
  637: 
  638:   matched = cmd_complete_command (vline, vty, &ret);
  639: 
  640:   cmd_free_strvec (vline);
  641: 
  642:   return (char **) matched;
  643: }
  644: #endif
  645: 
  646: /* Vty node structures. */
  647: static struct cmd_node bgp_node =
  648: {
  649:   BGP_NODE,
  650:   "%s(config-router)# ",
  651: };
  652: 
  653: static struct cmd_node rip_node =
  654: {
  655:   RIP_NODE,
  656:   "%s(config-router)# ",
  657: };
  658: 
  659: static struct cmd_node isis_node =
  660: {
  661:   ISIS_NODE,
  662:   "%s(config-router)# ",
  663: };
  664: 
  665: static struct cmd_node interface_node =
  666: {
  667:   INTERFACE_NODE,
  668:   "%s(config-if)# ",
  669: };
  670: 
  671: static struct cmd_node rmap_node =
  672: {
  673:   RMAP_NODE,
  674:   "%s(config-route-map)# "
  675: };
  676: 
  677: static struct cmd_node zebra_node =
  678: {
  679:   ZEBRA_NODE,
  680:   "%s(config-router)# "
  681: };
  682: 
  683: static struct cmd_node bgp_vpnv4_node =
  684: {
  685:   BGP_VPNV4_NODE,
  686:   "%s(config-router-af)# "
  687: };
  688: 
  689: static struct cmd_node bgp_vpnv6_node =
  690: {
  691:   BGP_VPNV6_NODE,
  692:   "%s(config-router-af)# "
  693: };
  694: 
  695: static struct cmd_node bgp_encap_node =
  696: {
  697:   BGP_ENCAP_NODE,
  698:   "%s(config-router-af)# "
  699: };
  700: 
  701: static struct cmd_node bgp_encapv6_node =
  702: {
  703:   BGP_ENCAPV6_NODE,
  704:   "%s(config-router-af)# "
  705: };
  706: 
  707: static struct cmd_node bgp_ipv4_node =
  708: {
  709:   BGP_IPV4_NODE,
  710:   "%s(config-router-af)# "
  711: };
  712: 
  713: static struct cmd_node bgp_ipv4m_node =
  714: {
  715:   BGP_IPV4M_NODE,
  716:   "%s(config-router-af)# "
  717: };
  718: 
  719: static struct cmd_node bgp_ipv6_node =
  720: {
  721:   BGP_IPV6_NODE,
  722:   "%s(config-router-af)# "
  723: };
  724: 
  725: static struct cmd_node bgp_ipv6m_node =
  726: {
  727:   BGP_IPV6M_NODE,
  728:   "%s(config-router-af)# "
  729: };
  730: 
  731: static struct cmd_node ospf_node =
  732: {
  733:   OSPF_NODE,
  734:   "%s(config-router)# "
  735: };
  736: 
  737: static struct cmd_node ripng_node =
  738: {
  739:   RIPNG_NODE,
  740:   "%s(config-router)# "
  741: };
  742: 
  743: static struct cmd_node ospf6_node =
  744: {
  745:   OSPF6_NODE,
  746:   "%s(config-ospf6)# "
  747: };
  748: 
  749: static struct cmd_node babel_node =
  750: {
  751:   BABEL_NODE,
  752:   "%s(config-babel)# "
  753: };
  754: 
  755: static struct cmd_node keychain_node =
  756: {
  757:   KEYCHAIN_NODE,
  758:   "%s(config-keychain)# "
  759: };
  760: 
  761: static struct cmd_node keychain_key_node =
  762: {
  763:   KEYCHAIN_KEY_NODE,
  764:   "%s(config-keychain-key)# "
  765: };
  766: 
  767: /* Defined in lib/vty.c */
  768: extern struct cmd_node vty_node;
  769: 
  770: /* When '^Z' is received from vty, move down to the enable mode. */
  771: static int
  772: vtysh_end (void)
  773: {
  774:   switch (vty->node)
  775:     {
  776:     case VIEW_NODE:
  777:     case ENABLE_NODE:
  778:       /* Nothing to do. */
  779:       break;
  780:     default:
  781:       vty->node = ENABLE_NODE;
  782:       break;
  783:     }
  784:   return CMD_SUCCESS;
  785: }
  786: 
  787: DEFUNSH (VTYSH_ALL,
  788: 	 vtysh_end_all,
  789: 	 vtysh_end_all_cmd,
  790: 	 "end",
  791: 	 "End current mode and change to enable mode\n")
  792: {
  793:   return vtysh_end ();
  794: }
  795: 
  796: DEFUNSH (VTYSH_BGPD,
  797: 	 router_bgp,
  798: 	 router_bgp_cmd,
  799: 	 "router bgp " CMD_AS_RANGE,
  800: 	 ROUTER_STR
  801: 	 BGP_STR
  802: 	 AS_STR)
  803: {
  804:   vty->node = BGP_NODE;
  805:   return CMD_SUCCESS;
  806: }
  807: 
  808: ALIAS_SH (VTYSH_BGPD,
  809: 	  router_bgp,
  810: 	  router_bgp_view_cmd,
  811: 	  "router bgp " CMD_AS_RANGE " view WORD",
  812: 	  ROUTER_STR
  813: 	  BGP_STR
  814: 	  AS_STR
  815: 	  "BGP view\n"
  816: 	  "view name\n")
  817: 
  818: DEFUNSH (VTYSH_BGPD,
  819: 	 address_family_vpnv4,
  820: 	 address_family_vpnv4_cmd,
  821: 	 "address-family vpnv4",
  822: 	 "Enter Address Family command mode\n"
  823: 	 "Address family\n")
  824: {
  825:   vty->node = BGP_VPNV4_NODE;
  826:   return CMD_SUCCESS;
  827: }
  828: 
  829: DEFUNSH (VTYSH_BGPD,
  830: 	 address_family_vpnv4_unicast,
  831: 	 address_family_vpnv4_unicast_cmd,
  832: 	 "address-family vpnv4 unicast",
  833: 	 "Enter Address Family command mode\n"
  834: 	 "Address family\n"
  835: 	 "Address Family Modifier\n")
  836: {
  837:   vty->node = BGP_VPNV4_NODE;
  838:   return CMD_SUCCESS;
  839: }
  840: 
  841: DEFUNSH (VTYSH_BGPD,
  842: 	 address_family_vpnv6,
  843: 	 address_family_vpnv6_cmd,
  844: 	 "address-family vpnv6",
  845: 	 "Enter Address Family command mode\n"
  846: 	 "Address family\n")
  847: {
  848:   vty->node = BGP_VPNV6_NODE;
  849:   return CMD_SUCCESS;
  850: }
  851: 
  852: DEFUNSH (VTYSH_BGPD,
  853: 	 address_family_vpnv6_unicast,
  854: 	 address_family_vpnv6_unicast_cmd,
  855: 	 "address-family vpnv6 unicast",
  856: 	 "Enter Address Family command mode\n"
  857: 	 "Address family\n"
  858: 	 "Address Family Modifier\n")
  859: {
  860:   vty->node = BGP_VPNV6_NODE;
  861:   return CMD_SUCCESS;
  862: }
  863: 
  864: DEFUNSH (VTYSH_BGPD,
  865: 	 address_family_encap,
  866: 	 address_family_encap_cmd,
  867: 	 "address-family encap",
  868: 	 "Enter Address Family command mode\n"
  869: 	 "Address family\n")
  870: {
  871:   vty->node = BGP_ENCAP_NODE;
  872:   return CMD_SUCCESS;
  873: }
  874: 
  875: DEFUNSH (VTYSH_BGPD,
  876: 	 address_family_encapv4,
  877: 	 address_family_encapv4_cmd,
  878: 	 "address-family encapv4",
  879: 	 "Enter Address Family command mode\n"
  880: 	 "Address family\n")
  881: {
  882:   vty->node = BGP_ENCAP_NODE;
  883:   return CMD_SUCCESS;
  884: }
  885: 
  886: DEFUNSH (VTYSH_BGPD,
  887: 	 address_family_encapv6,
  888: 	 address_family_encapv6_cmd,
  889: 	 "address-family encapv6",
  890: 	 "Enter Address Family command mode\n"
  891: 	 "Address family\n")
  892: {
  893:   vty->node = BGP_ENCAPV6_NODE;
  894:   return CMD_SUCCESS;
  895: }
  896: 
  897: DEFUNSH (VTYSH_BGPD,
  898: 	 address_family_ipv4_unicast,
  899: 	 address_family_ipv4_unicast_cmd,
  900: 	 "address-family ipv4 unicast",
  901: 	 "Enter Address Family command mode\n"
  902: 	 "Address family\n"
  903: 	 "Address Family Modifier\n")
  904: {
  905:   vty->node = BGP_IPV4_NODE;
  906:   return CMD_SUCCESS;
  907: }
  908: 
  909: DEFUNSH (VTYSH_BGPD,
  910: 	 address_family_ipv4_multicast,
  911: 	 address_family_ipv4_multicast_cmd,
  912: 	 "address-family ipv4 multicast",
  913: 	 "Enter Address Family command mode\n"
  914: 	 "Address family\n"
  915: 	 "Address Family Modifier\n")
  916: {
  917:   vty->node = BGP_IPV4M_NODE;
  918:   return CMD_SUCCESS;
  919: }
  920: 
  921: DEFUNSH (VTYSH_BGPD,
  922: 	 address_family_ipv6,
  923: 	 address_family_ipv6_cmd,
  924: 	 "address-family ipv6",
  925: 	 "Enter Address Family command mode\n"
  926: 	 "Address family\n")
  927: {
  928:   vty->node = BGP_IPV6_NODE;
  929:   return CMD_SUCCESS;
  930: }
  931: 
  932: DEFUNSH (VTYSH_BGPD,
  933: 	 address_family_ipv6_unicast,
  934: 	 address_family_ipv6_unicast_cmd,
  935: 	 "address-family ipv6 unicast",
  936: 	 "Enter Address Family command mode\n"
  937: 	 "Address family\n"
  938: 	 "Address Family Modifier\n")
  939: {
  940:   vty->node = BGP_IPV6_NODE;
  941:   return CMD_SUCCESS;
  942: }
  943: 
  944: DEFUNSH (VTYSH_BGPD,
  945: 	 address_family_ipv6_multicast,
  946: 	 address_family_ipv6_multicast_cmd,
  947: 	 "address-family ipv6 multicast",
  948: 	 "Enter Address Family command mode\n"
  949: 	 "Address family\n"
  950: 	 "Address Family Modifier\n")
  951: {
  952:   vty->node = BGP_IPV6M_NODE;
  953:   return CMD_SUCCESS;
  954: }
  955: 
  956: DEFUNSH (VTYSH_RIPD,
  957: 	 key_chain,
  958: 	 key_chain_cmd,
  959: 	 "key chain WORD",
  960: 	 "Authentication key management\n"
  961: 	 "Key-chain management\n"
  962: 	 "Key-chain name\n")
  963: {
  964:   vty->node = KEYCHAIN_NODE;
  965:   return CMD_SUCCESS;
  966: }	 
  967: 
  968: DEFUNSH (VTYSH_RIPD,
  969: 	 key,
  970: 	 key_cmd,
  971: 	 "key <0-2147483647>",
  972: 	 "Configure a key\n"
  973: 	 "Key identifier number\n")
  974: {
  975:   vty->node = KEYCHAIN_KEY_NODE;
  976:   return CMD_SUCCESS;
  977: }
  978: 
  979: DEFUNSH (VTYSH_RIPD,
  980: 	 router_rip,
  981: 	 router_rip_cmd,
  982: 	 "router rip",
  983: 	 ROUTER_STR
  984: 	 "RIP")
  985: {
  986:   vty->node = RIP_NODE;
  987:   return CMD_SUCCESS;
  988: }
  989: 
  990: DEFUNSH (VTYSH_RIPNGD,
  991: 	 router_ripng,
  992: 	 router_ripng_cmd,
  993: 	 "router ripng",
  994: 	 ROUTER_STR
  995: 	 "RIPng")
  996: {
  997:   vty->node = RIPNG_NODE;
  998:   return CMD_SUCCESS;
  999: }
 1000: 
 1001: DEFUNSH (VTYSH_OSPFD,
 1002: 	 router_ospf,
 1003: 	 router_ospf_cmd,
 1004: 	 "router ospf",
 1005: 	 "Enable a routing process\n"
 1006: 	 "Start OSPF configuration\n")
 1007: {
 1008:   vty->node = OSPF_NODE;
 1009:   return CMD_SUCCESS;
 1010: }
 1011: 
 1012: DEFUNSH (VTYSH_OSPF6D,
 1013: 	 router_ospf6,
 1014: 	 router_ospf6_cmd,
 1015: 	 "router ospf6",
 1016: 	 OSPF6_ROUTER_STR
 1017: 	 OSPF6_STR)
 1018: {
 1019:   vty->node = OSPF6_NODE;
 1020:   return CMD_SUCCESS;
 1021: }
 1022: 
 1023: DEFUNSH (VTYSH_ISISD,
 1024: 	 router_isis,
 1025: 	 router_isis_cmd,
 1026: 	 "router isis WORD",
 1027: 	 ROUTER_STR
 1028: 	 "ISO IS-IS\n"
 1029: 	 "ISO Routing area tag")
 1030: {
 1031:   vty->node = ISIS_NODE;
 1032:   return CMD_SUCCESS;
 1033: }
 1034: 
 1035: DEFUNSH (VTYSH_RMAP,
 1036: 	 route_map,
 1037: 	 route_map_cmd,
 1038: 	 "route-map WORD (deny|permit) <1-65535>",
 1039: 	 "Create route-map or enter route-map command mode\n"
 1040: 	 "Route map tag\n"
 1041: 	 "Route map denies set operations\n"
 1042: 	 "Route map permits set operations\n"
 1043: 	 "Sequence to insert to/delete from existing route-map entry\n")
 1044: {
 1045:   vty->node = RMAP_NODE;
 1046:   return CMD_SUCCESS;
 1047: }
 1048: 
 1049: DEFUNSH (VTYSH_ALL,
 1050: 	 vtysh_line_vty,
 1051: 	 vtysh_line_vty_cmd,
 1052: 	 "line vty",
 1053: 	 "Configure a terminal line\n"
 1054: 	 "Virtual terminal\n")
 1055: {
 1056:   vty->node = VTY_NODE;
 1057:   return CMD_SUCCESS;
 1058: }
 1059: 
 1060: DEFUNSH (VTYSH_ALL,
 1061: 	 vtysh_enable, 
 1062: 	 vtysh_enable_cmd,
 1063: 	 "enable",
 1064: 	 "Turn on privileged mode command\n")
 1065: {
 1066:   vty->node = ENABLE_NODE;
 1067:   return CMD_SUCCESS;
 1068: }
 1069: 
 1070: DEFUNSH (VTYSH_ALL,
 1071: 	 vtysh_disable, 
 1072: 	 vtysh_disable_cmd,
 1073: 	 "disable",
 1074: 	 "Turn off privileged mode command\n")
 1075: {
 1076:   if (vty->node == ENABLE_NODE)
 1077:     vty->node = VIEW_NODE;
 1078:   return CMD_SUCCESS;
 1079: }
 1080: 
 1081: DEFUNSH (VTYSH_ALL,
 1082: 	 vtysh_config_terminal,
 1083: 	 vtysh_config_terminal_cmd,
 1084: 	 "configure terminal",
 1085: 	 "Configuration from vty interface\n"
 1086: 	 "Configuration terminal\n")
 1087: {
 1088:   vty->node = CONFIG_NODE;
 1089:   return CMD_SUCCESS;
 1090: }
 1091: 
 1092: static int
 1093: vtysh_exit (struct vty *vty)
 1094: {
 1095:   switch (vty->node)
 1096:     {
 1097:     case VIEW_NODE:
 1098:     case ENABLE_NODE:
 1099:       exit (0);
 1100:       break;
 1101:     case CONFIG_NODE:
 1102:       vty->node = ENABLE_NODE;
 1103:       break;
 1104:     case INTERFACE_NODE:
 1105:     case ZEBRA_NODE:
 1106:     case BGP_NODE:
 1107:     case RIP_NODE:
 1108:     case RIPNG_NODE:
 1109:     case OSPF_NODE:
 1110:     case OSPF6_NODE:
 1111:     case BABEL_NODE:
 1112:     case ISIS_NODE:
 1113:     case MASC_NODE:
 1114:     case RMAP_NODE:
 1115:     case VTY_NODE:
 1116:     case KEYCHAIN_NODE:
 1117:       vtysh_execute("end");
 1118:       vtysh_execute("configure terminal");
 1119:       vty->node = CONFIG_NODE;
 1120:       break;
 1121:     case BGP_VPNV4_NODE:
 1122:     case BGP_VPNV6_NODE:
 1123:     case BGP_ENCAP_NODE:
 1124:     case BGP_ENCAPV6_NODE:
 1125:     case BGP_IPV4_NODE:
 1126:     case BGP_IPV4M_NODE:
 1127:     case BGP_IPV6_NODE:
 1128:     case BGP_IPV6M_NODE:
 1129:       vty->node = BGP_NODE;
 1130:       break;
 1131:     case KEYCHAIN_KEY_NODE:
 1132:       vty->node = KEYCHAIN_NODE;
 1133:       break;
 1134:     default:
 1135:       break;
 1136:     }
 1137:   return CMD_SUCCESS;
 1138: }
 1139: 
 1140: DEFUNSH (VTYSH_ALL,
 1141: 	 vtysh_exit_all,
 1142: 	 vtysh_exit_all_cmd,
 1143: 	 "exit",
 1144: 	 "Exit current mode and down to previous mode\n")
 1145: {
 1146:   return vtysh_exit (vty);
 1147: }
 1148: 
 1149: ALIAS (vtysh_exit_all,
 1150:        vtysh_quit_all_cmd,
 1151:        "quit",
 1152:        "Exit current mode and down to previous mode\n")
 1153: 
 1154: DEFUNSH (VTYSH_BGPD,
 1155: 	 exit_address_family,
 1156: 	 exit_address_family_cmd,
 1157: 	 "exit-address-family",
 1158: 	 "Exit from Address Family configuration mode\n")
 1159: {
 1160:   if (vty->node == BGP_IPV4_NODE
 1161:       || vty->node == BGP_IPV4M_NODE
 1162:       || vty->node == BGP_VPNV4_NODE
 1163:       || vty->node == BGP_VPNV6_NODE
 1164:       || vty->node == BGP_ENCAP_NODE
 1165:       || vty->node == BGP_ENCAPV6_NODE
 1166:       || vty->node == BGP_IPV6_NODE
 1167:       || vty->node == BGP_IPV6M_NODE)
 1168:     vty->node = BGP_NODE;
 1169:   return CMD_SUCCESS;
 1170: }
 1171: 
 1172: DEFUNSH (VTYSH_ZEBRA,
 1173: 	 vtysh_exit_zebra,
 1174: 	 vtysh_exit_zebra_cmd,
 1175: 	 "exit",
 1176: 	 "Exit current mode and down to previous mode\n")
 1177: {
 1178:   return vtysh_exit (vty);
 1179: }
 1180: 
 1181: ALIAS (vtysh_exit_zebra,
 1182:        vtysh_quit_zebra_cmd,
 1183:        "quit",
 1184:        "Exit current mode and down to previous mode\n")
 1185: 
 1186: DEFUNSH (VTYSH_RIPD,
 1187: 	 vtysh_exit_ripd,
 1188: 	 vtysh_exit_ripd_cmd,
 1189: 	 "exit",
 1190: 	 "Exit current mode and down to previous mode\n")
 1191: {
 1192:   return vtysh_exit (vty);
 1193: }
 1194: 
 1195: ALIAS (vtysh_exit_ripd,
 1196:        vtysh_quit_ripd_cmd,
 1197:        "quit",
 1198:        "Exit current mode and down to previous mode\n")
 1199: 
 1200: DEFUNSH (VTYSH_RIPNGD,
 1201: 	 vtysh_exit_ripngd,
 1202: 	 vtysh_exit_ripngd_cmd,
 1203: 	 "exit",
 1204: 	 "Exit current mode and down to previous mode\n")
 1205: {
 1206:   return vtysh_exit (vty);
 1207: }
 1208: 
 1209: ALIAS (vtysh_exit_ripngd,
 1210:        vtysh_quit_ripngd_cmd,
 1211:        "quit",
 1212:        "Exit current mode and down to previous mode\n")
 1213: 
 1214: DEFUNSH (VTYSH_RMAP,
 1215: 	 vtysh_exit_rmap,
 1216: 	 vtysh_exit_rmap_cmd,
 1217: 	 "exit",
 1218: 	 "Exit current mode and down to previous mode\n")
 1219: {
 1220:   return vtysh_exit (vty);
 1221: }
 1222: 
 1223: ALIAS (vtysh_exit_rmap,
 1224:        vtysh_quit_rmap_cmd,
 1225:        "quit",
 1226:        "Exit current mode and down to previous mode\n")
 1227: 
 1228: DEFUNSH (VTYSH_BGPD,
 1229: 	 vtysh_exit_bgpd,
 1230: 	 vtysh_exit_bgpd_cmd,
 1231: 	 "exit",
 1232: 	 "Exit current mode and down to previous mode\n")
 1233: {
 1234:   return vtysh_exit (vty);
 1235: }
 1236: 
 1237: ALIAS (vtysh_exit_bgpd,
 1238:        vtysh_quit_bgpd_cmd,
 1239:        "quit",
 1240:        "Exit current mode and down to previous mode\n")
 1241: 
 1242: DEFUNSH (VTYSH_OSPFD,
 1243: 	 vtysh_exit_ospfd,
 1244: 	 vtysh_exit_ospfd_cmd,
 1245: 	 "exit",
 1246: 	 "Exit current mode and down to previous mode\n")
 1247: {
 1248:   return vtysh_exit (vty);
 1249: }
 1250: 
 1251: ALIAS (vtysh_exit_ospfd,
 1252:        vtysh_quit_ospfd_cmd,
 1253:        "quit",
 1254:        "Exit current mode and down to previous mode\n")
 1255: 
 1256: DEFUNSH (VTYSH_OSPF6D,
 1257: 	 vtysh_exit_ospf6d,
 1258: 	 vtysh_exit_ospf6d_cmd,
 1259: 	 "exit",
 1260: 	 "Exit current mode and down to previous mode\n")
 1261: {
 1262:   return vtysh_exit (vty);
 1263: }
 1264: 
 1265: ALIAS (vtysh_exit_ospf6d,
 1266:        vtysh_quit_ospf6d_cmd,
 1267:        "quit",
 1268:        "Exit current mode and down to previous mode\n")
 1269: 
 1270: DEFUNSH (VTYSH_ISISD,
 1271: 	 vtysh_exit_isisd,
 1272: 	 vtysh_exit_isisd_cmd,
 1273: 	 "exit",
 1274: 	 "Exit current mode and down to previous mode\n")
 1275: {
 1276:   return vtysh_exit (vty);
 1277: }
 1278: 
 1279: ALIAS (vtysh_exit_isisd,
 1280:        vtysh_quit_isisd_cmd,
 1281:        "quit",
 1282:        "Exit current mode and down to previous mode\n")
 1283: 
 1284: DEFUNSH (VTYSH_ALL,
 1285:          vtysh_exit_line_vty,
 1286:          vtysh_exit_line_vty_cmd,
 1287:          "exit",
 1288:          "Exit current mode and down to previous mode\n")
 1289: {
 1290:   return vtysh_exit (vty);
 1291: }
 1292: 
 1293: ALIAS (vtysh_exit_line_vty,
 1294:        vtysh_quit_line_vty_cmd,
 1295:        "quit",
 1296:        "Exit current mode and down to previous mode\n")
 1297: 
 1298: DEFUNSH (VTYSH_INTERFACE,
 1299: 	 vtysh_interface,
 1300: 	 vtysh_interface_cmd,
 1301: 	 "interface IFNAME",
 1302: 	 "Select an interface to configure\n"
 1303: 	 "Interface's name\n")
 1304: {
 1305:   vty->node = INTERFACE_NODE;
 1306:   return CMD_SUCCESS;
 1307: }
 1308: 
 1309: ALIAS_SH (VTYSH_ZEBRA,
 1310: 	 vtysh_interface,
 1311: 	 vtysh_interface_vrf_cmd,
 1312: 	 "interface IFNAME " VRF_CMD_STR,
 1313: 	 "Select an interface to configure\n"
 1314: 	 "Interface's name\n"
 1315: 	 VRF_CMD_HELP_STR)
 1316: 
 1317: /* TODO Implement "no interface command in isisd. */
 1318: DEFSH (VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D,
 1319:        vtysh_no_interface_cmd,
 1320:        "no interface IFNAME",
 1321:        NO_STR
 1322:        "Delete a pseudo interface's configuration\n"
 1323:        "Interface's name\n")
 1324: 
 1325: DEFSH (VTYSH_ZEBRA,
 1326:        vtysh_no_interface_vrf_cmd,
 1327:        "no interface IFNAME " VRF_CMD_STR,
 1328:        NO_STR
 1329:        "Delete a pseudo interface's configuration\n"
 1330:        "Interface's name\n"
 1331:        VRF_CMD_HELP_STR)
 1332: 
 1333: /* TODO Implement interface description commands in ripngd, ospf6d
 1334:  * and isisd. */
 1335: DEFSH (VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_OSPFD,
 1336:        interface_desc_cmd,
 1337:        "description .LINE",
 1338:        "Interface specific description\n"
 1339:        "Characters describing this interface\n")
 1340:        
 1341: DEFSH (VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_OSPFD,
 1342:        no_interface_desc_cmd,
 1343:        "no description",
 1344:        NO_STR
 1345:        "Interface specific description\n")
 1346: 
 1347: DEFUNSH (VTYSH_INTERFACE,
 1348: 	 vtysh_exit_interface,
 1349: 	 vtysh_exit_interface_cmd,
 1350: 	 "exit",
 1351: 	 "Exit current mode and down to previous mode\n")
 1352: {
 1353:   return vtysh_exit (vty);
 1354: }
 1355: 
 1356: ALIAS (vtysh_exit_interface,
 1357:        vtysh_quit_interface_cmd,
 1358:        "quit",
 1359:        "Exit current mode and down to previous mode\n")
 1360: 
 1361: DEFUN (vtysh_show_thread,
 1362:        vtysh_show_thread_cmd,
 1363:        "show thread cpu [FILTER]",
 1364:       SHOW_STR
 1365:       "Thread information\n"
 1366:       "Thread CPU usage\n"
 1367:       "Display filter (rwtexb)\n")
 1368: {
 1369:   unsigned int i;
 1370:   int ret = CMD_SUCCESS;
 1371:   char line[100];
 1372: 
 1373:   sprintf(line, "show thread cpu %s\n", (argc == 1) ? argv[0] : "");
 1374:   for (i = 0; i < array_size(vtysh_client); i++)
 1375:     if ( vtysh_client[i].fd >= 0 )
 1376:       {
 1377:         fprintf (stdout, "Thread statistics for %s:\n",
 1378:                  vtysh_client[i].name);
 1379:         ret = vtysh_client_execute (&vtysh_client[i], line, stdout);
 1380:         fprintf (stdout,"\n");
 1381:       }
 1382:   return ret;
 1383: }
 1384: 
 1385: DEFUN (vtysh_show_work_queues,
 1386:        vtysh_show_work_queues_cmd,
 1387:        "show work-queues",
 1388:        SHOW_STR
 1389:        "Work Queue information\n")
 1390: {
 1391:   unsigned int i;
 1392:   int ret = CMD_SUCCESS;
 1393:   char line[] = "show work-queues\n";
 1394: 
 1395:   for (i = 0; i < array_size(vtysh_client); i++)
 1396:     if ( vtysh_client[i].fd >= 0 )
 1397:       {
 1398:         fprintf (stdout, "Work queue statistics for %s:\n",
 1399:                  vtysh_client[i].name);
 1400:         ret = vtysh_client_execute (&vtysh_client[i], line, stdout);
 1401:         fprintf (stdout,"\n");
 1402:       }
 1403: 
 1404:   return ret;
 1405: }
 1406: 
 1407: /* Memory */
 1408: DEFUN (vtysh_show_memory,
 1409:        vtysh_show_memory_cmd,
 1410:        "show memory",
 1411:        SHOW_STR
 1412:        "Memory statistics\n")
 1413: {
 1414:   unsigned int i;
 1415:   int ret = CMD_SUCCESS;
 1416:   char line[] = "show memory\n";
 1417:   
 1418:   for (i = 0; i < array_size(vtysh_client); i++)
 1419:     if ( vtysh_client[i].fd >= 0 )
 1420:       {
 1421:         fprintf (stdout, "Memory statistics for %s:\n", 
 1422:                  vtysh_client[i].name);
 1423:         ret = vtysh_client_execute (&vtysh_client[i], line, stdout);
 1424:         fprintf (stdout,"\n");
 1425:       }
 1426:   
 1427:   return ret;
 1428: }
 1429: 
 1430: /* Logging commands. */
 1431: DEFUN (vtysh_show_logging,
 1432:        vtysh_show_logging_cmd,
 1433:        "show logging",
 1434:        SHOW_STR
 1435:        "Show current logging configuration\n")
 1436: {
 1437:   unsigned int i;
 1438:   int ret = CMD_SUCCESS;
 1439:   char line[] = "show logging\n";
 1440:   
 1441:   for (i = 0; i < array_size(vtysh_client); i++)
 1442:     if ( vtysh_client[i].fd >= 0 )
 1443:       {
 1444:         fprintf (stdout,"Logging configuration for %s:\n", 
 1445:                  vtysh_client[i].name);
 1446:         ret = vtysh_client_execute (&vtysh_client[i], line, stdout);
 1447:         fprintf (stdout,"\n");
 1448:       }
 1449:   
 1450:   return ret;
 1451: }
 1452: 
 1453: DEFUNSH (VTYSH_ALL,
 1454: 	 vtysh_log_stdout,
 1455: 	 vtysh_log_stdout_cmd,
 1456: 	 "log stdout",
 1457: 	 "Logging control\n"
 1458: 	 "Set stdout logging level\n")
 1459: {
 1460:   return CMD_SUCCESS;
 1461: }
 1462: 
 1463: DEFUNSH (VTYSH_ALL,
 1464: 	 vtysh_log_stdout_level,
 1465: 	 vtysh_log_stdout_level_cmd,
 1466: 	 "log stdout "LOG_LEVELS,
 1467: 	 "Logging control\n"
 1468: 	 "Set stdout logging level\n"
 1469: 	 LOG_LEVEL_DESC)
 1470: {
 1471:   return CMD_SUCCESS;
 1472: }
 1473: 
 1474: DEFUNSH (VTYSH_ALL,
 1475: 	 no_vtysh_log_stdout,
 1476: 	 no_vtysh_log_stdout_cmd,
 1477: 	 "no log stdout [LEVEL]",
 1478: 	 NO_STR
 1479: 	 "Logging control\n"
 1480: 	 "Cancel logging to stdout\n"
 1481: 	 "Logging level\n")
 1482: {
 1483:   return CMD_SUCCESS;
 1484: }
 1485: 
 1486: DEFUNSH (VTYSH_ALL,
 1487: 	 vtysh_log_file,
 1488: 	 vtysh_log_file_cmd,
 1489: 	 "log file FILENAME",
 1490: 	 "Logging control\n"
 1491: 	 "Logging to file\n"
 1492: 	 "Logging filename\n")
 1493: {
 1494:   return CMD_SUCCESS;
 1495: }
 1496: 
 1497: DEFUNSH (VTYSH_ALL,
 1498: 	 vtysh_log_file_level,
 1499: 	 vtysh_log_file_level_cmd,
 1500: 	 "log file FILENAME "LOG_LEVELS,
 1501: 	 "Logging control\n"
 1502: 	 "Logging to file\n"
 1503: 	 "Logging filename\n"
 1504: 	 LOG_LEVEL_DESC)
 1505: {
 1506:   return CMD_SUCCESS;
 1507: }
 1508: 
 1509: DEFUNSH (VTYSH_ALL,
 1510: 	 no_vtysh_log_file,
 1511: 	 no_vtysh_log_file_cmd,
 1512: 	 "no log file [FILENAME]",
 1513: 	 NO_STR
 1514: 	 "Logging control\n"
 1515: 	 "Cancel logging to file\n"
 1516: 	 "Logging file name\n")
 1517: {
 1518:   return CMD_SUCCESS;
 1519: }
 1520: 
 1521: ALIAS_SH (VTYSH_ALL,
 1522: 	  no_vtysh_log_file,
 1523: 	  no_vtysh_log_file_level_cmd,
 1524: 	  "no log file FILENAME LEVEL",
 1525: 	  NO_STR
 1526: 	  "Logging control\n"
 1527: 	  "Cancel logging to file\n"
 1528: 	  "Logging file name\n"
 1529: 	  "Logging level\n")
 1530: 
 1531: DEFUNSH (VTYSH_ALL,
 1532: 	 vtysh_log_monitor,
 1533: 	 vtysh_log_monitor_cmd,
 1534: 	 "log monitor",
 1535: 	 "Logging control\n"
 1536: 	 "Set terminal line (monitor) logging level\n")
 1537: {
 1538:   return CMD_SUCCESS;
 1539: }
 1540: 
 1541: DEFUNSH (VTYSH_ALL,
 1542: 	 vtysh_log_monitor_level,
 1543: 	 vtysh_log_monitor_level_cmd,
 1544: 	 "log monitor "LOG_LEVELS,
 1545: 	 "Logging control\n"
 1546: 	 "Set terminal line (monitor) logging level\n"
 1547: 	 LOG_LEVEL_DESC)
 1548: {
 1549:   return CMD_SUCCESS;
 1550: }
 1551: 
 1552: DEFUNSH (VTYSH_ALL,
 1553: 	 no_vtysh_log_monitor,
 1554: 	 no_vtysh_log_monitor_cmd,
 1555: 	 "no log monitor [LEVEL]",
 1556: 	 NO_STR
 1557: 	 "Logging control\n"
 1558: 	 "Disable terminal line (monitor) logging\n"
 1559: 	 "Logging level\n")
 1560: {
 1561:   return CMD_SUCCESS;
 1562: }
 1563: 
 1564: DEFUNSH (VTYSH_ALL,
 1565: 	 vtysh_log_syslog,
 1566: 	 vtysh_log_syslog_cmd,
 1567: 	 "log syslog",
 1568: 	 "Logging control\n"
 1569: 	 "Set syslog logging level\n")
 1570: {
 1571:   return CMD_SUCCESS;
 1572: }
 1573: 
 1574: DEFUNSH (VTYSH_ALL,
 1575: 	 vtysh_log_syslog_level,
 1576: 	 vtysh_log_syslog_level_cmd,
 1577: 	 "log syslog "LOG_LEVELS,
 1578: 	 "Logging control\n"
 1579: 	 "Set syslog logging level\n"
 1580: 	 LOG_LEVEL_DESC)
 1581: {
 1582:   return CMD_SUCCESS;
 1583: }
 1584: 
 1585: DEFUNSH (VTYSH_ALL,
 1586: 	 no_vtysh_log_syslog,
 1587: 	 no_vtysh_log_syslog_cmd,
 1588: 	 "no log syslog [LEVEL]",
 1589: 	 NO_STR
 1590: 	 "Logging control\n"
 1591: 	 "Cancel logging to syslog\n"
 1592: 	 "Logging level\n")
 1593: {
 1594:   return CMD_SUCCESS;
 1595: }
 1596: 
 1597: DEFUNSH (VTYSH_ALL,
 1598: 	 vtysh_log_facility,
 1599: 	 vtysh_log_facility_cmd,
 1600: 	 "log facility "LOG_FACILITIES,
 1601: 	 "Logging control\n"
 1602: 	 "Facility parameter for syslog messages\n"
 1603: 	 LOG_FACILITY_DESC)
 1604: 
 1605: {
 1606:   return CMD_SUCCESS;
 1607: }
 1608: 
 1609: DEFUNSH (VTYSH_ALL,
 1610: 	 no_vtysh_log_facility,
 1611: 	 no_vtysh_log_facility_cmd,
 1612: 	 "no log facility [FACILITY]",
 1613: 	 NO_STR
 1614: 	 "Logging control\n"
 1615: 	 "Reset syslog facility to default (daemon)\n"
 1616: 	 "Syslog facility\n")
 1617: 
 1618: {
 1619:   return CMD_SUCCESS;
 1620: }
 1621: 
 1622: DEFUNSH_DEPRECATED (VTYSH_ALL,
 1623: 		    vtysh_log_trap,
 1624: 		    vtysh_log_trap_cmd,
 1625: 		    "log trap "LOG_LEVELS,
 1626: 		    "Logging control\n"
 1627: 		    "(Deprecated) Set logging level and default for all destinations\n"
 1628: 		    LOG_LEVEL_DESC)
 1629: 
 1630: {
 1631:   return CMD_SUCCESS;
 1632: }
 1633: 
 1634: DEFUNSH_DEPRECATED (VTYSH_ALL,
 1635: 		    no_vtysh_log_trap,
 1636: 		    no_vtysh_log_trap_cmd,
 1637: 		    "no log trap [LEVEL]",
 1638: 		    NO_STR
 1639: 		    "Logging control\n"
 1640: 		    "Permit all logging information\n"
 1641: 		    "Logging level\n")
 1642: {
 1643:   return CMD_SUCCESS;
 1644: }
 1645: 
 1646: DEFUNSH (VTYSH_ALL,
 1647: 	 vtysh_log_record_priority,
 1648: 	 vtysh_log_record_priority_cmd,
 1649: 	 "log record-priority",
 1650: 	 "Logging control\n"
 1651: 	 "Log the priority of the message within the message\n")
 1652: {
 1653:   return CMD_SUCCESS;
 1654: }
 1655: 
 1656: DEFUNSH (VTYSH_ALL,
 1657: 	 no_vtysh_log_record_priority,
 1658: 	 no_vtysh_log_record_priority_cmd,
 1659: 	 "no log record-priority",
 1660: 	 NO_STR
 1661: 	 "Logging control\n"
 1662: 	 "Do not log the priority of the message within the message\n")
 1663: {
 1664:   return CMD_SUCCESS;
 1665: }
 1666: 
 1667: DEFUNSH (VTYSH_ALL,
 1668: 	 vtysh_log_timestamp_precision,
 1669: 	 vtysh_log_timestamp_precision_cmd,
 1670: 	 "log timestamp precision <0-6>",
 1671: 	 "Logging control\n"
 1672: 	 "Timestamp configuration\n"
 1673: 	 "Set the timestamp precision\n"
 1674: 	 "Number of subsecond digits\n")
 1675: {
 1676:   return CMD_SUCCESS;
 1677: }
 1678: 
 1679: DEFUNSH (VTYSH_ALL,
 1680: 	 no_vtysh_log_timestamp_precision,
 1681: 	 no_vtysh_log_timestamp_precision_cmd,
 1682: 	 "no log timestamp precision",
 1683: 	 NO_STR
 1684: 	 "Logging control\n"
 1685: 	 "Timestamp configuration\n"
 1686: 	 "Reset the timestamp precision to the default value of 0\n")
 1687: {
 1688:   return CMD_SUCCESS;
 1689: }
 1690: 
 1691: DEFUNSH (VTYSH_ALL,
 1692: 	 vtysh_service_password_encrypt,
 1693: 	 vtysh_service_password_encrypt_cmd,
 1694: 	 "service password-encryption",
 1695: 	 "Set up miscellaneous service\n"
 1696: 	 "Enable encrypted passwords\n")
 1697: {
 1698:   return CMD_SUCCESS;
 1699: }
 1700: 
 1701: DEFUNSH (VTYSH_ALL,
 1702: 	 no_vtysh_service_password_encrypt,
 1703: 	 no_vtysh_service_password_encrypt_cmd,
 1704: 	 "no service password-encryption",
 1705: 	 NO_STR
 1706: 	 "Set up miscellaneous service\n"
 1707: 	 "Enable encrypted passwords\n")
 1708: {
 1709:   return CMD_SUCCESS;
 1710: }
 1711: 
 1712: DEFUNSH (VTYSH_ALL,
 1713: 	 vtysh_config_password,
 1714: 	 vtysh_password_cmd,
 1715: 	 "password (8|) WORD",
 1716: 	 "Assign the terminal connection password\n"
 1717: 	 "Specifies a HIDDEN password will follow\n"
 1718: 	 "dummy string \n"
 1719: 	 "The HIDDEN line password string\n")
 1720: {
 1721:   return CMD_SUCCESS;
 1722: }
 1723: 
 1724: DEFUNSH (VTYSH_ALL,
 1725: 	 vtysh_password_text,
 1726: 	 vtysh_password_text_cmd,
 1727: 	 "password LINE",
 1728: 	 "Assign the terminal connection password\n"
 1729: 	 "The UNENCRYPTED (cleartext) line password\n")
 1730: {
 1731:   return CMD_SUCCESS;
 1732: }
 1733: 
 1734: DEFUNSH (VTYSH_ALL,
 1735: 	 vtysh_config_enable_password,
 1736: 	 vtysh_enable_password_cmd,
 1737: 	 "enable password (8|) WORD",
 1738: 	 "Modify enable password parameters\n"
 1739: 	 "Assign the privileged level password\n"
 1740: 	 "Specifies a HIDDEN password will follow\n"
 1741: 	 "dummy string \n"
 1742: 	 "The HIDDEN 'enable' password string\n")
 1743: {
 1744:   return CMD_SUCCESS;
 1745: }
 1746: 
 1747: DEFUNSH (VTYSH_ALL,
 1748: 	 vtysh_enable_password_text,
 1749: 	 vtysh_enable_password_text_cmd,
 1750: 	 "enable password LINE",
 1751: 	 "Modify enable password parameters\n"
 1752: 	 "Assign the privileged level password\n"
 1753: 	 "The UNENCRYPTED (cleartext) 'enable' password\n")
 1754: {
 1755:   return CMD_SUCCESS;
 1756: }
 1757: 
 1758: DEFUNSH (VTYSH_ALL,
 1759: 	 no_vtysh_config_enable_password,
 1760: 	 no_vtysh_enable_password_cmd,
 1761: 	 "no enable password",
 1762: 	 NO_STR
 1763: 	 "Modify enable password parameters\n"
 1764: 	 "Assign the privileged level password\n")
 1765: {
 1766:   return CMD_SUCCESS;
 1767: }
 1768: 
 1769: DEFUN (vtysh_write_terminal,
 1770:        vtysh_write_terminal_cmd,
 1771:        "write terminal",
 1772:        "Write running configuration to memory, network, or terminal\n"
 1773:        "Write to terminal\n")
 1774: {
 1775:   u_int i;
 1776:   char line[] = "write terminal\n";
 1777:   FILE *fp = NULL;
 1778: 
 1779:   if (vtysh_pager_name)
 1780:     {
 1781:       fp = popen (vtysh_pager_name, "w");
 1782:       if (fp == NULL)
 1783: 	{
 1784: 	  perror ("popen");
 1785: 	  exit (1);
 1786: 	}
 1787:     }
 1788:   else
 1789:     fp = stdout;
 1790: 
 1791:   vty_out (vty, "Building configuration...%s", VTY_NEWLINE);
 1792:   vty_out (vty, "%sCurrent configuration:%s", VTY_NEWLINE,
 1793: 	   VTY_NEWLINE);
 1794:   vty_out (vty, "!%s", VTY_NEWLINE);
 1795: 
 1796:   for (i = 0; i < array_size(vtysh_client); i++)
 1797:     vtysh_client_execute (&vtysh_client[i], line, NULL);
 1798: 
 1799:   /* Integrate vtysh specific configuration. */
 1800:   vtysh_config_write ();
 1801: 
 1802:   vtysh_config_dump (fp);
 1803: 
 1804:   if (vtysh_pager_name && fp)
 1805:     {
 1806:       fflush (fp);
 1807:       if (pclose (fp) == -1)
 1808: 	{
 1809: 	  perror ("pclose");
 1810: 	  exit (1);
 1811: 	}
 1812:       fp = NULL;
 1813:     }
 1814: 
 1815:   vty_out (vty, "end%s", VTY_NEWLINE);
 1816:   
 1817:   return CMD_SUCCESS;
 1818: }
 1819: 
 1820: DEFUN (vtysh_write_terminal_daemon,
 1821:        vtysh_write_terminal_daemon_cmd,
 1822:        "write terminal (zebra|ripd|ripngd|ospfd|ospf6d|bgpd|isisd|babeld)",
 1823:        "Write running configuration to memory, network, or terminal\n"
 1824:        "Write to terminal\n"
 1825:        "For the zebra daemon\n"
 1826:        "For the rip daemon\n"
 1827:        "For the ripng daemon\n"
 1828:        "For the ospf daemon\n"
 1829:        "For the ospfv6 daemon\n"
 1830:        "For the bgp daemon\n"
 1831:        "For the isis daemon\n"
 1832:        "For the babel daemon\n")
 1833: {
 1834:   unsigned int i;
 1835:   int ret = CMD_SUCCESS;
 1836: 
 1837:   for (i = 0; i < array_size(vtysh_client); i++)
 1838:     {
 1839:       if (strcmp(vtysh_client[i].name, argv[0]) == 0)
 1840: 	break;
 1841:     }
 1842: 
 1843:   ret = vtysh_client_execute(&vtysh_client[i], "show running-config\n", stdout);
 1844: 
 1845:   return ret;
 1846: }
 1847: 
 1848: DEFUN (vtysh_integrated_config,
 1849:        vtysh_integrated_config_cmd,
 1850:        "service integrated-vtysh-config",
 1851:        "Set up miscellaneous service\n"
 1852:        "Write configuration into integrated file\n")
 1853: {
 1854:   vtysh_writeconfig_integrated = 1;
 1855:   return CMD_SUCCESS;
 1856: }
 1857: 
 1858: DEFUN (no_vtysh_integrated_config,
 1859:        no_vtysh_integrated_config_cmd,
 1860:        "no service integrated-vtysh-config",
 1861:        NO_STR
 1862:        "Set up miscellaneous service\n"
 1863:        "Write configuration into integrated file\n")
 1864: {
 1865:   vtysh_writeconfig_integrated = 0;
 1866:   return CMD_SUCCESS;
 1867: }
 1868: 
 1869: static int
 1870: write_config_integrated(void)
 1871: {
 1872:   u_int i;
 1873:   char line[] = "write terminal\n";
 1874:   FILE *fp;
 1875:   char *integrate_sav = NULL;
 1876: 
 1877:   integrate_sav = malloc (strlen (integrate_default) +
 1878: 			  strlen (CONF_BACKUP_EXT) + 1);
 1879:   strcpy (integrate_sav, integrate_default);
 1880:   strcat (integrate_sav, CONF_BACKUP_EXT);
 1881: 
 1882:   fprintf (stdout,"Building Configuration...\n");
 1883: 
 1884:   /* Move current configuration file to backup config file. */
 1885:   unlink (integrate_sav);
 1886:   rename (integrate_default, integrate_sav);
 1887:   free (integrate_sav);
 1888:  
 1889:   fp = fopen (integrate_default, "w");
 1890:   if (fp == NULL)
 1891:     {
 1892:       fprintf (stdout,"%% Can't open configuration file %s.\n",
 1893: 	       integrate_default);
 1894:       return CMD_SUCCESS;
 1895:     }
 1896: 
 1897:   for (i = 0; i < array_size(vtysh_client); i++)
 1898:     vtysh_client_execute (&vtysh_client[i], line, NULL);
 1899: 
 1900:   vtysh_config_dump (fp);
 1901: 
 1902:   fclose (fp);
 1903: 
 1904:   if (chmod (integrate_default, CONFIGFILE_MASK) != 0)
 1905:     {
 1906:       fprintf (stdout,"%% Can't chmod configuration file %s: %s (%d)\n", 
 1907: 	integrate_default, safe_strerror(errno), errno);
 1908:       return CMD_WARNING;
 1909:     }
 1910: 
 1911:   fprintf(stdout,"Integrated configuration saved to %s\n",integrate_default);
 1912: 
 1913:   fprintf (stdout,"[OK]\n");
 1914: 
 1915:   return CMD_SUCCESS;
 1916: }
 1917: 
 1918: DEFUN (vtysh_write_memory,
 1919:        vtysh_write_memory_cmd,
 1920:        "write memory",
 1921:        "Write running configuration to memory, network, or terminal\n"
 1922:        "Write configuration to the file (same as write file)\n")
 1923: {
 1924:   int ret = CMD_SUCCESS;
 1925:   char line[] = "write memory\n";
 1926:   u_int i;
 1927:   
 1928:   /* If integrated Quagga.conf explicitely set. */
 1929:   if (vtysh_writeconfig_integrated)
 1930:     return write_config_integrated();
 1931: 
 1932:   fprintf (stdout,"Building Configuration...\n");
 1933: 	  
 1934:   for (i = 0; i < array_size(vtysh_client); i++)
 1935:     ret = vtysh_client_execute (&vtysh_client[i], line, stdout);
 1936:   
 1937:   fprintf (stdout,"[OK]\n");
 1938: 
 1939:   return ret;
 1940: }
 1941: 
 1942: ALIAS (vtysh_write_memory,
 1943:        vtysh_copy_runningconfig_startupconfig_cmd,
 1944:        "copy running-config startup-config",  
 1945:        "Copy from one file to another\n"
 1946:        "Copy from current system configuration\n"
 1947:        "Copy to startup configuration\n")
 1948: 
 1949: ALIAS (vtysh_write_memory,
 1950:        vtysh_write_file_cmd,
 1951:        "write file",
 1952:        "Write running configuration to memory, network, or terminal\n"
 1953:        "Write configuration to the file (same as write memory)\n")
 1954: 
 1955: ALIAS (vtysh_write_memory,
 1956:        vtysh_write_cmd,
 1957:        "write",
 1958:        "Write running configuration to memory, network, or terminal\n")
 1959: 
 1960: ALIAS (vtysh_write_terminal,
 1961:        vtysh_show_running_config_cmd,
 1962:        "show running-config",
 1963:        SHOW_STR
 1964:        "Current operating configuration\n")
 1965: 
 1966: ALIAS (vtysh_write_terminal_daemon,
 1967:        vtysh_show_running_config_daemon_cmd,
 1968:        "show running-config (zebra|ripd|ripngd|ospfd|ospf6d|bgpd|isisd|babeld)",
 1969:        SHOW_STR
 1970:        "Current operating configuration\n"
 1971:        "For the zebra daemon\n"
 1972:        "For the rip daemon\n"
 1973:        "For the ripng daemon\n"
 1974:        "For the ospf daemon\n"
 1975:        "For the ospfv6 daemon\n"
 1976:        "For the bgp daemon\n"
 1977:        "For the isis daemon\n"
 1978:        "For the babel daemon\n")
 1979: 
 1980: DEFUN (vtysh_terminal_length,
 1981:        vtysh_terminal_length_cmd,
 1982:        "terminal length <0-512>",
 1983:        "Set terminal line parameters\n"
 1984:        "Set number of lines on a screen\n"
 1985:        "Number of lines on screen (0 for no pausing)\n")
 1986: {
 1987:   int lines;
 1988:   char *endptr = NULL;
 1989:   char default_pager[10];
 1990: 
 1991:   lines = strtol (argv[0], &endptr, 10);
 1992:   if (lines < 0 || lines > 512 || *endptr != '\0')
 1993:     {
 1994:       vty_out (vty, "length is malformed%s", VTY_NEWLINE);
 1995:       return CMD_WARNING;
 1996:     }
 1997: 
 1998:   if (vtysh_pager_name)
 1999:     {
 2000:       free (vtysh_pager_name);
 2001:       vtysh_pager_name = NULL;
 2002:     }
 2003: 
 2004:   if (lines != 0)
 2005:     {
 2006:       snprintf(default_pager, 10, "more -%i", lines);
 2007:       vtysh_pager_name = strdup (default_pager);
 2008:     }
 2009: 
 2010:   return CMD_SUCCESS;
 2011: }
 2012: 
 2013: DEFUN (vtysh_terminal_no_length,
 2014:        vtysh_terminal_no_length_cmd,
 2015:        "terminal no length",
 2016:        "Set terminal line parameters\n"
 2017:        NO_STR
 2018:        "Set number of lines on a screen\n")
 2019: {
 2020:   if (vtysh_pager_name)
 2021:     {
 2022:       free (vtysh_pager_name);
 2023:       vtysh_pager_name = NULL;
 2024:     }
 2025: 
 2026:   vtysh_pager_init();
 2027:   return CMD_SUCCESS;
 2028: }
 2029: 
 2030: DEFUN (vtysh_show_daemons,
 2031:        vtysh_show_daemons_cmd,
 2032:        "show daemons",
 2033:        SHOW_STR
 2034:        "Show list of running daemons\n")
 2035: {
 2036:   u_int i;
 2037: 
 2038:   for (i = 0; i < array_size(vtysh_client); i++)
 2039:     if ( vtysh_client[i].fd >= 0 )
 2040:       vty_out(vty, " %s", vtysh_client[i].name);
 2041:   vty_out(vty, "%s", VTY_NEWLINE);
 2042: 
 2043:   return CMD_SUCCESS;
 2044: }
 2045: 
 2046: /* Execute command in child process. */
 2047: static int
 2048: execute_command (const char *command, int argc, const char *arg1,
 2049: 		 const char *arg2)
 2050: {
 2051:   pid_t pid;
 2052:   int status;
 2053: 
 2054:   /* Call fork(). */
 2055:   pid = fork ();
 2056: 
 2057:   if (pid < 0)
 2058:     {
 2059:       /* Failure of fork(). */
 2060:       fprintf (stderr, "Can't fork: %s\n", safe_strerror (errno));
 2061:       exit (1);
 2062:     }
 2063:   else if (pid == 0)
 2064:     {
 2065:       /* This is child process. */
 2066:       switch (argc)
 2067: 	{
 2068: 	case 0:
 2069: 	  execlp (command, command, (const char *)NULL);
 2070: 	  break;
 2071: 	case 1:
 2072: 	  execlp (command, command, arg1, (const char *)NULL);
 2073: 	  break;
 2074: 	case 2:
 2075: 	  execlp (command, command, arg1, arg2, (const char *)NULL);
 2076: 	  break;
 2077: 	}
 2078: 
 2079:       /* When execlp suceed, this part is not executed. */
 2080:       fprintf (stderr, "Can't execute %s: %s\n", command, safe_strerror (errno));
 2081:       exit (1);
 2082:     }
 2083:   else
 2084:     {
 2085:       /* This is parent. */
 2086:       execute_flag = 1;
 2087:       wait4 (pid, &status, 0, NULL);
 2088:       execute_flag = 0;
 2089:     }
 2090:   return 0;
 2091: }
 2092: 
 2093: DEFUN (vtysh_ping,
 2094:        vtysh_ping_cmd,
 2095:        "ping WORD",
 2096:        "Send echo messages\n"
 2097:        "Ping destination address or hostname\n")
 2098: {
 2099:   execute_command ("ping", 1, argv[0], NULL);
 2100:   return CMD_SUCCESS;
 2101: }
 2102: 
 2103: ALIAS (vtysh_ping,
 2104:        vtysh_ping_ip_cmd,
 2105:        "ping ip WORD",
 2106:        "Send echo messages\n"
 2107:        "IP echo\n"
 2108:        "Ping destination address or hostname\n")
 2109: 
 2110: DEFUN (vtysh_traceroute,
 2111:        vtysh_traceroute_cmd,
 2112:        "traceroute WORD",
 2113:        "Trace route to destination\n"
 2114:        "Trace route to destination address or hostname\n")
 2115: {
 2116:   execute_command ("traceroute", 1, argv[0], NULL);
 2117:   return CMD_SUCCESS;
 2118: }
 2119: 
 2120: ALIAS (vtysh_traceroute,
 2121:        vtysh_traceroute_ip_cmd,
 2122:        "traceroute ip WORD",
 2123:        "Trace route to destination\n"
 2124:        "IP trace\n"
 2125:        "Trace route to destination address or hostname\n")
 2126: 
 2127: #ifdef HAVE_IPV6
 2128: DEFUN (vtysh_ping6,
 2129:        vtysh_ping6_cmd,
 2130:        "ping ipv6 WORD",
 2131:        "Send echo messages\n"
 2132:        "IPv6 echo\n"
 2133:        "Ping destination address or hostname\n")
 2134: {
 2135:   execute_command ("ping6", 1, argv[0], NULL);
 2136:   return CMD_SUCCESS;
 2137: }
 2138: 
 2139: DEFUN (vtysh_traceroute6,
 2140:        vtysh_traceroute6_cmd,
 2141:        "traceroute ipv6 WORD",
 2142:        "Trace route to destination\n"
 2143:        "IPv6 trace\n"
 2144:        "Trace route to destination address or hostname\n")
 2145: {
 2146:   execute_command ("traceroute6", 1, argv[0], NULL);
 2147:   return CMD_SUCCESS;
 2148: }
 2149: #endif
 2150: 
 2151: DEFUN (vtysh_telnet,
 2152:        vtysh_telnet_cmd,
 2153:        "telnet WORD",
 2154:        "Open a telnet connection\n"
 2155:        "IP address or hostname of a remote system\n")
 2156: {
 2157:   execute_command ("telnet", 1, argv[0], NULL);
 2158:   return CMD_SUCCESS;
 2159: }
 2160: 
 2161: DEFUN (vtysh_telnet_port,
 2162:        vtysh_telnet_port_cmd,
 2163:        "telnet WORD PORT",
 2164:        "Open a telnet connection\n"
 2165:        "IP address or hostname of a remote system\n"
 2166:        "TCP Port number\n")
 2167: {
 2168:   execute_command ("telnet", 2, argv[0], argv[1]);
 2169:   return CMD_SUCCESS;
 2170: }
 2171: 
 2172: DEFUN (vtysh_ssh,
 2173:        vtysh_ssh_cmd,
 2174:        "ssh WORD",
 2175:        "Open an ssh connection\n"
 2176:        "[user@]host\n")
 2177: {
 2178:   execute_command ("ssh", 1, argv[0], NULL);
 2179:   return CMD_SUCCESS;
 2180: }
 2181: 
 2182: DEFUN (vtysh_start_shell,
 2183:        vtysh_start_shell_cmd,
 2184:        "start-shell",
 2185:        "Start UNIX shell\n")
 2186: {
 2187:   execute_command ("sh", 0, NULL, NULL);
 2188:   return CMD_SUCCESS;
 2189: }
 2190: 
 2191: DEFUN (vtysh_start_bash,
 2192:        vtysh_start_bash_cmd,
 2193:        "start-shell bash",
 2194:        "Start UNIX shell\n"
 2195:        "Start bash\n")
 2196: {
 2197:   execute_command ("bash", 0, NULL, NULL);
 2198:   return CMD_SUCCESS;
 2199: }
 2200: 
 2201: DEFUN (vtysh_start_zsh,
 2202:        vtysh_start_zsh_cmd,
 2203:        "start-shell zsh",
 2204:        "Start UNIX shell\n"
 2205:        "Start Z shell\n")
 2206: {
 2207:   execute_command ("zsh", 0, NULL, NULL);
 2208:   return CMD_SUCCESS;
 2209: }
 2210: 
 2211: static void
 2212: vtysh_install_default (enum node_type node)
 2213: {
 2214:   install_element (node, &config_list_cmd);
 2215: }
 2216: 
 2217: /* Making connection to protocol daemon. */
 2218: static int
 2219: vtysh_connect (struct vtysh_client *vclient)
 2220: {
 2221:   int ret;
 2222:   int sock, len;
 2223:   struct sockaddr_un addr;
 2224:   struct stat s_stat;
 2225: 
 2226:   /* Stat socket to see if we have permission to access it. */
 2227:   ret = stat (vclient->path, &s_stat);
 2228:   if (ret < 0 && errno != ENOENT)
 2229:     {
 2230:       fprintf  (stderr, "vtysh_connect(%s): stat = %s\n", 
 2231: 		vclient->path, safe_strerror(errno)); 
 2232:       exit(1);
 2233:     }
 2234:   
 2235:   if (ret >= 0)
 2236:     {
 2237:       if (! S_ISSOCK(s_stat.st_mode))
 2238: 	{
 2239: 	  fprintf (stderr, "vtysh_connect(%s): Not a socket\n",
 2240: 		   vclient->path);
 2241: 	  exit (1);
 2242: 	}
 2243:       
 2244:     }
 2245: 
 2246:   sock = socket (AF_UNIX, SOCK_STREAM, 0);
 2247:   if (sock < 0)
 2248:     {
 2249: #ifdef DEBUG
 2250:       fprintf(stderr, "vtysh_connect(%s): socket = %s\n", vclient->path,
 2251: 	      safe_strerror(errno));
 2252: #endif /* DEBUG */
 2253:       return -1;
 2254:     }
 2255: 
 2256:   memset (&addr, 0, sizeof (struct sockaddr_un));
 2257:   addr.sun_family = AF_UNIX;
 2258:   strncpy (addr.sun_path, vclient->path, strlen (vclient->path));
 2259: #ifdef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN
 2260:   len = addr.sun_len = SUN_LEN(&addr);
 2261: #else
 2262:   len = sizeof (addr.sun_family) + strlen (addr.sun_path);
 2263: #endif /* HAVE_STRUCT_SOCKADDR_UN_SUN_LEN */
 2264: 
 2265:   ret = connect (sock, (struct sockaddr *) &addr, len);
 2266:   if (ret < 0)
 2267:     {
 2268: #ifdef DEBUG
 2269:       fprintf(stderr, "vtysh_connect(%s): connect = %s\n", vclient->path,
 2270: 	      safe_strerror(errno));
 2271: #endif /* DEBUG */
 2272:       close (sock);
 2273:       return -1;
 2274:     }
 2275:   vclient->fd = sock;
 2276: 
 2277:   return 0;
 2278: }
 2279: 
 2280: int
 2281: vtysh_connect_all(const char *daemon_name)
 2282: {
 2283:   u_int i;
 2284:   int rc = 0;
 2285:   int matches = 0;
 2286: 
 2287:   for (i = 0; i < array_size(vtysh_client); i++)
 2288:     {
 2289:       if (!daemon_name || !strcmp(daemon_name, vtysh_client[i].name))
 2290: 	{
 2291: 	  matches++;
 2292: 	  if (vtysh_connect(&vtysh_client[i]) == 0)
 2293: 	    rc++;
 2294: 	  /* We need direct access to ripd in vtysh_exit_ripd_only. */
 2295: 	  if (vtysh_client[i].flag == VTYSH_RIPD)
 2296: 	    ripd_client = &vtysh_client[i];
 2297: 	}
 2298:     }
 2299:   if (!matches)
 2300:     fprintf(stderr, "Error: no daemons match name %s!\n", daemon_name);
 2301:   return rc;
 2302: }
 2303: 
 2304: /* To disable readline's filename completion. */
 2305: static char *
 2306: vtysh_completion_entry_function (const char *ignore, int invoking_key)
 2307: {
 2308:   return NULL;
 2309: }
 2310: 
 2311: void
 2312: vtysh_readline_init (void)
 2313: {
 2314:   /* readline related settings. */
 2315:   rl_bind_key ('?', (rl_command_func_t *) vtysh_rl_describe);
 2316:   rl_completion_entry_function = vtysh_completion_entry_function;
 2317:   rl_attempted_completion_function = (rl_completion_func_t *)new_completion;
 2318: }
 2319: 
 2320: char *
 2321: vtysh_prompt (void)
 2322: {
 2323:   static struct utsname names;
 2324:   static char buf[100];
 2325:   const char*hostname;
 2326:   extern struct host host;
 2327: 
 2328:   hostname = host.name;
 2329: 
 2330:   if (!hostname)
 2331:     {
 2332:       if (!names.nodename[0])
 2333: 	uname (&names);
 2334:       hostname = names.nodename;
 2335:     }
 2336: 
 2337:   snprintf (buf, sizeof buf, cmd_prompt (vty->node), hostname);
 2338: 
 2339:   return buf;
 2340: }
 2341: 
 2342: void
 2343: vtysh_init_vty (void)
 2344: {
 2345:   /* Make vty structure. */
 2346:   vty = vty_new ();
 2347:   vty->type = VTY_SHELL;
 2348:   vty->node = VIEW_NODE;
 2349: 
 2350:   /* Initialize commands. */
 2351:   cmd_init (0);
 2352: 
 2353:   /* Install nodes. */
 2354:   install_node (&bgp_node, NULL);
 2355:   install_node (&rip_node, NULL);
 2356:   install_node (&interface_node, NULL);
 2357:   install_node (&rmap_node, NULL);
 2358:   install_node (&zebra_node, NULL);
 2359:   install_node (&bgp_vpnv4_node, NULL);
 2360:   install_node (&bgp_vpnv6_node, NULL);
 2361:   install_node (&bgp_encap_node, NULL);
 2362:   install_node (&bgp_encapv6_node, NULL);
 2363:   install_node (&bgp_ipv4_node, NULL);
 2364:   install_node (&bgp_ipv4m_node, NULL);
 2365: /* #ifdef HAVE_IPV6 */
 2366:   install_node (&bgp_ipv6_node, NULL);
 2367:   install_node (&bgp_ipv6m_node, NULL);
 2368: /* #endif */
 2369:   install_node (&ospf_node, NULL);
 2370: /* #ifdef HAVE_IPV6 */
 2371:   install_node (&ripng_node, NULL);
 2372:   install_node (&ospf6_node, NULL);
 2373: /* #endif */
 2374:   install_node (&babel_node, NULL);
 2375:   install_node (&keychain_node, NULL);
 2376:   install_node (&keychain_key_node, NULL);
 2377:   install_node (&isis_node, NULL);
 2378:   install_node (&vty_node, NULL);
 2379: 
 2380:   vtysh_install_default (VIEW_NODE);
 2381:   vtysh_install_default (ENABLE_NODE);
 2382:   vtysh_install_default (CONFIG_NODE);
 2383:   vtysh_install_default (BGP_NODE);
 2384:   vtysh_install_default (RIP_NODE);
 2385:   vtysh_install_default (INTERFACE_NODE);
 2386:   vtysh_install_default (RMAP_NODE);
 2387:   vtysh_install_default (ZEBRA_NODE);
 2388:   vtysh_install_default (BGP_VPNV4_NODE);
 2389:   vtysh_install_default (BGP_VPNV6_NODE);
 2390:   vtysh_install_default (BGP_ENCAP_NODE);
 2391:   vtysh_install_default (BGP_ENCAPV6_NODE);
 2392:   vtysh_install_default (BGP_IPV4_NODE);
 2393:   vtysh_install_default (BGP_IPV4M_NODE);
 2394:   vtysh_install_default (BGP_IPV6_NODE);
 2395:   vtysh_install_default (BGP_IPV6M_NODE);
 2396:   vtysh_install_default (OSPF_NODE);
 2397:   vtysh_install_default (RIPNG_NODE);
 2398:   vtysh_install_default (OSPF6_NODE);
 2399:   vtysh_install_default (BABEL_NODE);
 2400:   vtysh_install_default (ISIS_NODE);
 2401:   vtysh_install_default (KEYCHAIN_NODE);
 2402:   vtysh_install_default (KEYCHAIN_KEY_NODE);
 2403:   vtysh_install_default (VTY_NODE);
 2404: 
 2405:   install_element (VIEW_NODE, &vtysh_enable_cmd);
 2406:   install_element (ENABLE_NODE, &vtysh_config_terminal_cmd);
 2407:   install_element (ENABLE_NODE, &vtysh_disable_cmd);
 2408: 
 2409:   /* "exit" command. */
 2410:   install_element (VIEW_NODE, &vtysh_exit_all_cmd);
 2411:   install_element (VIEW_NODE, &vtysh_quit_all_cmd);
 2412:   install_element (CONFIG_NODE, &vtysh_exit_all_cmd);
 2413:   /* install_element (CONFIG_NODE, &vtysh_quit_all_cmd); */
 2414:   install_element (ENABLE_NODE, &vtysh_exit_all_cmd);
 2415:   install_element (ENABLE_NODE, &vtysh_quit_all_cmd);
 2416:   install_element (RIP_NODE, &vtysh_exit_ripd_cmd);
 2417:   install_element (RIP_NODE, &vtysh_quit_ripd_cmd);
 2418:   install_element (RIPNG_NODE, &vtysh_exit_ripngd_cmd);
 2419:   install_element (RIPNG_NODE, &vtysh_quit_ripngd_cmd);
 2420:   install_element (OSPF_NODE, &vtysh_exit_ospfd_cmd);
 2421:   install_element (OSPF_NODE, &vtysh_quit_ospfd_cmd);
 2422:   install_element (OSPF6_NODE, &vtysh_exit_ospf6d_cmd);
 2423:   install_element (OSPF6_NODE, &vtysh_quit_ospf6d_cmd);
 2424:   install_element (BGP_NODE, &vtysh_exit_bgpd_cmd);
 2425:   install_element (BGP_NODE, &vtysh_quit_bgpd_cmd);
 2426:   install_element (BGP_VPNV4_NODE, &vtysh_exit_bgpd_cmd);
 2427:   install_element (BGP_VPNV4_NODE, &vtysh_quit_bgpd_cmd);
 2428:   install_element (BGP_VPNV6_NODE, &vtysh_exit_bgpd_cmd);
 2429:   install_element (BGP_VPNV6_NODE, &vtysh_quit_bgpd_cmd);
 2430:   install_element (BGP_ENCAP_NODE, &vtysh_exit_bgpd_cmd);
 2431:   install_element (BGP_ENCAP_NODE, &vtysh_quit_bgpd_cmd);
 2432:   install_element (BGP_ENCAPV6_NODE, &vtysh_exit_bgpd_cmd);
 2433:   install_element (BGP_ENCAPV6_NODE, &vtysh_quit_bgpd_cmd);
 2434:   install_element (BGP_IPV4_NODE, &vtysh_exit_bgpd_cmd);
 2435:   install_element (BGP_IPV4_NODE, &vtysh_quit_bgpd_cmd);
 2436:   install_element (BGP_IPV4M_NODE, &vtysh_exit_bgpd_cmd);
 2437:   install_element (BGP_IPV4M_NODE, &vtysh_quit_bgpd_cmd);
 2438:   install_element (BGP_IPV6_NODE, &vtysh_exit_bgpd_cmd);
 2439:   install_element (BGP_IPV6_NODE, &vtysh_quit_bgpd_cmd);
 2440:   install_element (BGP_IPV6M_NODE, &vtysh_exit_bgpd_cmd);
 2441:   install_element (BGP_IPV6M_NODE, &vtysh_quit_bgpd_cmd);
 2442:   install_element (ISIS_NODE, &vtysh_exit_isisd_cmd);
 2443:   install_element (ISIS_NODE, &vtysh_quit_isisd_cmd);
 2444:   install_element (KEYCHAIN_NODE, &vtysh_exit_ripd_cmd);
 2445:   install_element (KEYCHAIN_NODE, &vtysh_quit_ripd_cmd);
 2446:   install_element (KEYCHAIN_KEY_NODE, &vtysh_exit_ripd_cmd);
 2447:   install_element (KEYCHAIN_KEY_NODE, &vtysh_quit_ripd_cmd);
 2448:   install_element (RMAP_NODE, &vtysh_exit_rmap_cmd);
 2449:   install_element (RMAP_NODE, &vtysh_quit_rmap_cmd);
 2450:   install_element (VTY_NODE, &vtysh_exit_line_vty_cmd);
 2451:   install_element (VTY_NODE, &vtysh_quit_line_vty_cmd);
 2452: 
 2453:   /* "end" command. */
 2454:   install_element (CONFIG_NODE, &vtysh_end_all_cmd);
 2455:   install_element (ENABLE_NODE, &vtysh_end_all_cmd);
 2456:   install_element (RIP_NODE, &vtysh_end_all_cmd);
 2457:   install_element (RIPNG_NODE, &vtysh_end_all_cmd);
 2458:   install_element (OSPF_NODE, &vtysh_end_all_cmd);
 2459:   install_element (OSPF6_NODE, &vtysh_end_all_cmd);
 2460:   install_element (BABEL_NODE, &vtysh_end_all_cmd);
 2461:   install_element (BGP_NODE, &vtysh_end_all_cmd);
 2462:   install_element (BGP_IPV4_NODE, &vtysh_end_all_cmd);
 2463:   install_element (BGP_IPV4M_NODE, &vtysh_end_all_cmd);
 2464:   install_element (BGP_VPNV4_NODE, &vtysh_end_all_cmd);
 2465:   install_element (BGP_VPNV6_NODE, &vtysh_end_all_cmd);
 2466:   install_element (BGP_ENCAP_NODE, &vtysh_end_all_cmd);
 2467:   install_element (BGP_ENCAPV6_NODE, &vtysh_end_all_cmd);
 2468:   install_element (BGP_IPV6_NODE, &vtysh_end_all_cmd);
 2469:   install_element (BGP_IPV6M_NODE, &vtysh_end_all_cmd);
 2470:   install_element (ISIS_NODE, &vtysh_end_all_cmd);
 2471:   install_element (KEYCHAIN_NODE, &vtysh_end_all_cmd);
 2472:   install_element (KEYCHAIN_KEY_NODE, &vtysh_end_all_cmd);
 2473:   install_element (RMAP_NODE, &vtysh_end_all_cmd);
 2474:   install_element (VTY_NODE, &vtysh_end_all_cmd);
 2475: 
 2476:   install_element (INTERFACE_NODE, &interface_desc_cmd);
 2477:   install_element (INTERFACE_NODE, &no_interface_desc_cmd);
 2478:   install_element (INTERFACE_NODE, &vtysh_end_all_cmd);
 2479:   install_element (INTERFACE_NODE, &vtysh_exit_interface_cmd);
 2480:   install_element (INTERFACE_NODE, &vtysh_quit_interface_cmd);
 2481:   install_element (CONFIG_NODE, &router_rip_cmd);
 2482: #ifdef HAVE_IPV6
 2483:   install_element (CONFIG_NODE, &router_ripng_cmd);
 2484: #endif
 2485:   install_element (CONFIG_NODE, &router_ospf_cmd);
 2486: #ifdef HAVE_IPV6
 2487:   install_element (CONFIG_NODE, &router_ospf6_cmd);
 2488: #endif
 2489:   install_element (CONFIG_NODE, &router_isis_cmd);
 2490:   install_element (CONFIG_NODE, &router_bgp_cmd);
 2491:   install_element (CONFIG_NODE, &router_bgp_view_cmd);
 2492:   install_element (BGP_NODE, &address_family_vpnv4_cmd);
 2493:   install_element (BGP_NODE, &address_family_vpnv4_unicast_cmd);
 2494:   install_element (BGP_NODE, &address_family_vpnv6_cmd);
 2495:   install_element (BGP_NODE, &address_family_vpnv6_unicast_cmd);
 2496:   install_element (BGP_NODE, &address_family_encap_cmd);
 2497:   install_element (BGP_NODE, &address_family_encapv6_cmd);
 2498:   install_element (BGP_NODE, &address_family_ipv4_unicast_cmd);
 2499:   install_element (BGP_NODE, &address_family_ipv4_multicast_cmd);
 2500: #ifdef HAVE_IPV6
 2501:   install_element (BGP_NODE, &address_family_ipv6_cmd);
 2502:   install_element (BGP_NODE, &address_family_ipv6_unicast_cmd);
 2503: #endif
 2504:   install_element (BGP_VPNV4_NODE, &exit_address_family_cmd);
 2505:   install_element (BGP_VPNV6_NODE, &exit_address_family_cmd);
 2506:   install_element (BGP_ENCAP_NODE, &exit_address_family_cmd);
 2507:   install_element (BGP_ENCAPV6_NODE, &exit_address_family_cmd);
 2508:   install_element (BGP_IPV4_NODE, &exit_address_family_cmd);
 2509:   install_element (BGP_IPV4M_NODE, &exit_address_family_cmd);
 2510:   install_element (BGP_IPV6_NODE, &exit_address_family_cmd);
 2511:   install_element (BGP_IPV6M_NODE, &exit_address_family_cmd);
 2512:   install_element (CONFIG_NODE, &key_chain_cmd);
 2513:   install_element (CONFIG_NODE, &route_map_cmd);
 2514:   install_element (CONFIG_NODE, &vtysh_line_vty_cmd);
 2515:   install_element (KEYCHAIN_NODE, &key_cmd);
 2516:   install_element (KEYCHAIN_NODE, &key_chain_cmd);
 2517:   install_element (KEYCHAIN_KEY_NODE, &key_chain_cmd);
 2518:   install_element (CONFIG_NODE, &vtysh_interface_cmd);
 2519:   install_element (CONFIG_NODE, &vtysh_no_interface_cmd);
 2520:   install_element (CONFIG_NODE, &vtysh_interface_vrf_cmd);
 2521:   install_element (CONFIG_NODE, &vtysh_no_interface_vrf_cmd);
 2522:   install_element (ENABLE_NODE, &vtysh_show_running_config_cmd);
 2523:   install_element (ENABLE_NODE, &vtysh_show_running_config_daemon_cmd);
 2524:   install_element (ENABLE_NODE, &vtysh_copy_runningconfig_startupconfig_cmd);
 2525:   install_element (ENABLE_NODE, &vtysh_write_file_cmd);
 2526:   install_element (ENABLE_NODE, &vtysh_write_cmd);
 2527: 
 2528:   /* "write terminal" command. */
 2529:   install_element (ENABLE_NODE, &vtysh_write_terminal_cmd);
 2530:   install_element (ENABLE_NODE, &vtysh_write_terminal_daemon_cmd);
 2531:  
 2532:   install_element (CONFIG_NODE, &vtysh_integrated_config_cmd);
 2533:   install_element (CONFIG_NODE, &no_vtysh_integrated_config_cmd);
 2534: 
 2535:   /* "write memory" command. */
 2536:   install_element (ENABLE_NODE, &vtysh_write_memory_cmd);
 2537: 
 2538:   install_element (VIEW_NODE, &vtysh_terminal_length_cmd);
 2539:   install_element (ENABLE_NODE, &vtysh_terminal_length_cmd);
 2540:   install_element (VIEW_NODE, &vtysh_terminal_no_length_cmd);
 2541:   install_element (ENABLE_NODE, &vtysh_terminal_no_length_cmd);
 2542:   install_element (VIEW_NODE, &vtysh_show_daemons_cmd);
 2543:   install_element (ENABLE_NODE, &vtysh_show_daemons_cmd);
 2544: 
 2545:   install_element (VIEW_NODE, &vtysh_ping_cmd);
 2546:   install_element (VIEW_NODE, &vtysh_ping_ip_cmd);
 2547:   install_element (VIEW_NODE, &vtysh_traceroute_cmd);
 2548:   install_element (VIEW_NODE, &vtysh_traceroute_ip_cmd);
 2549: #ifdef HAVE_IPV6
 2550:   install_element (VIEW_NODE, &vtysh_ping6_cmd);
 2551:   install_element (VIEW_NODE, &vtysh_traceroute6_cmd);
 2552: #endif
 2553:   install_element (VIEW_NODE, &vtysh_telnet_cmd);
 2554:   install_element (VIEW_NODE, &vtysh_telnet_port_cmd);
 2555:   install_element (VIEW_NODE, &vtysh_ssh_cmd);
 2556:   install_element (ENABLE_NODE, &vtysh_ping_cmd);
 2557:   install_element (ENABLE_NODE, &vtysh_ping_ip_cmd);
 2558:   install_element (ENABLE_NODE, &vtysh_traceroute_cmd);
 2559:   install_element (ENABLE_NODE, &vtysh_traceroute_ip_cmd);
 2560: #ifdef HAVE_IPV6
 2561:   install_element (ENABLE_NODE, &vtysh_ping6_cmd);
 2562:   install_element (ENABLE_NODE, &vtysh_traceroute6_cmd);
 2563: #endif
 2564:   install_element (ENABLE_NODE, &vtysh_telnet_cmd);
 2565:   install_element (ENABLE_NODE, &vtysh_telnet_port_cmd);
 2566:   install_element (ENABLE_NODE, &vtysh_ssh_cmd);
 2567:   install_element (ENABLE_NODE, &vtysh_start_shell_cmd);
 2568:   install_element (ENABLE_NODE, &vtysh_start_bash_cmd);
 2569:   install_element (ENABLE_NODE, &vtysh_start_zsh_cmd);
 2570:   
 2571:   install_element (VIEW_NODE, &vtysh_show_memory_cmd);
 2572:   install_element (ENABLE_NODE, &vtysh_show_memory_cmd);
 2573: 
 2574:   install_element (VIEW_NODE, &vtysh_show_work_queues_cmd);
 2575:   install_element (ENABLE_NODE, &vtysh_show_work_queues_cmd);
 2576: 
 2577:   install_element (VIEW_NODE, &vtysh_show_thread_cmd);
 2578:   install_element (ENABLE_NODE, &vtysh_show_thread_cmd);
 2579: 
 2580:   /* Logging */
 2581:   install_element (ENABLE_NODE, &vtysh_show_logging_cmd);
 2582:   install_element (VIEW_NODE, &vtysh_show_logging_cmd);
 2583:   install_element (CONFIG_NODE, &vtysh_log_stdout_cmd);
 2584:   install_element (CONFIG_NODE, &vtysh_log_stdout_level_cmd);
 2585:   install_element (CONFIG_NODE, &no_vtysh_log_stdout_cmd);
 2586:   install_element (CONFIG_NODE, &vtysh_log_file_cmd);
 2587:   install_element (CONFIG_NODE, &vtysh_log_file_level_cmd);
 2588:   install_element (CONFIG_NODE, &no_vtysh_log_file_cmd);
 2589:   install_element (CONFIG_NODE, &no_vtysh_log_file_level_cmd);
 2590:   install_element (CONFIG_NODE, &vtysh_log_monitor_cmd);
 2591:   install_element (CONFIG_NODE, &vtysh_log_monitor_level_cmd);
 2592:   install_element (CONFIG_NODE, &no_vtysh_log_monitor_cmd);
 2593:   install_element (CONFIG_NODE, &vtysh_log_syslog_cmd);
 2594:   install_element (CONFIG_NODE, &vtysh_log_syslog_level_cmd);
 2595:   install_element (CONFIG_NODE, &no_vtysh_log_syslog_cmd);
 2596:   install_element (CONFIG_NODE, &vtysh_log_trap_cmd);
 2597:   install_element (CONFIG_NODE, &no_vtysh_log_trap_cmd);
 2598:   install_element (CONFIG_NODE, &vtysh_log_facility_cmd);
 2599:   install_element (CONFIG_NODE, &no_vtysh_log_facility_cmd);
 2600:   install_element (CONFIG_NODE, &vtysh_log_record_priority_cmd);
 2601:   install_element (CONFIG_NODE, &no_vtysh_log_record_priority_cmd);
 2602:   install_element (CONFIG_NODE, &vtysh_log_timestamp_precision_cmd);
 2603:   install_element (CONFIG_NODE, &no_vtysh_log_timestamp_precision_cmd);
 2604: 
 2605:   install_element (CONFIG_NODE, &vtysh_service_password_encrypt_cmd);
 2606:   install_element (CONFIG_NODE, &no_vtysh_service_password_encrypt_cmd);
 2607: 
 2608:   install_element (CONFIG_NODE, &vtysh_password_cmd);
 2609:   install_element (CONFIG_NODE, &vtysh_password_text_cmd);
 2610:   install_element (CONFIG_NODE, &vtysh_enable_password_cmd);
 2611:   install_element (CONFIG_NODE, &vtysh_enable_password_text_cmd);
 2612:   install_element (CONFIG_NODE, &no_vtysh_enable_password_cmd);
 2613: 
 2614: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>