File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / vtysh / vtysh.c
Revision 1.1.1.3 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Sun Jul 21 23:54:41 2013 UTC (11 years ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_22p0, v0_99_22, HEAD
0.99.22

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

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