summaryrefslogtreecommitdiff
path: root/lib/vty.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vty.c')
-rw-r--r--lib/vty.c176
1 files changed, 78 insertions, 98 deletions
diff --git a/lib/vty.c b/lib/vty.c
index 145bcfe945..be2f2a6e55 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -92,23 +92,28 @@ char integrate_default[] = SYSCONFDIR INTEGRATE_DEFAULT_CONFIG;
static int do_log_commands = 0;
-static int
-vty_out_variadic (struct vty *vty, const char *format, va_list args)
+/* VTY standard output function. */
+int
+vty_out (struct vty *vty, const char *format, ...)
{
+ va_list args;
int len = 0;
int size = 1024;
char buf[1024];
char *p = NULL;
- va_list cp;
if (vty_shell (vty))
- vprintf (format, args);
+ {
+ va_start (args, format);
+ vprintf (format, args);
+ va_end (args);
+ }
else
{
/* Try to write to initial buffer. */
- va_copy (cp, args);
+ va_start (args, format);
len = vsnprintf (buf, sizeof(buf), format, args);
- va_end (cp);
+ va_end (args);
/* Initial buffer is not enough. */
if (len < 0 || len >= size)
@@ -124,7 +129,9 @@ vty_out_variadic (struct vty *vty, const char *format, va_list args)
if (! p)
return -1;
+ va_start (args, format);
len = vsnprintf (p, size, format, args);
+ va_end (args);
if (len > -1 && len < size)
break;
@@ -136,7 +143,10 @@ vty_out_variadic (struct vty *vty, const char *format, va_list args)
p = buf;
/* Pointer p must point out buffer. */
- buffer_put (vty->obuf, (u_char *) p, len);
+ if (vty->type != VTY_TERM)
+ buffer_put (vty->obuf, (u_char *) p, len);
+ else
+ buffer_put_crlf (vty->obuf, (u_char *) p, len);
/* If p is not different with buf, it is allocated buffer. */
if (p != buf)
@@ -145,32 +155,6 @@ vty_out_variadic (struct vty *vty, const char *format, va_list args)
return len;
}
-/* VTY standard output function. */
-int
-vty_out (struct vty *vty, const char *format, ...)
-{
- int len;
- va_list args;
-
- va_start (args, format);
- len = vty_out_variadic (vty, format, args);
- va_end (args);
-
- return len;
-}
-
-int
-vty_outln (struct vty *vty, const char *format, ...)
-{
- int len;
- va_list args;
-
- va_start (args, format);
- len = vty_out_variadic (vty, format, args);
- va_end (args);
-
- return len + vty_out (vty, "%s", VTYNL);
-}
static int
vty_log_out (struct vty *vty, const char *level, const char *proto_str,
@@ -263,12 +247,12 @@ vty_hello (struct vty *vty)
for (s = buf + strlen (buf); (s > buf) && isspace ((int)*(s - 1));
s--);
*s = '\0';
- vty_outln (vty, "%s", buf);
+ vty_out (vty, "%s\n", buf);
}
fclose (f);
}
else
- vty_outln (vty, "MOTD file not found");
+ vty_out (vty, "MOTD file not found\n");
}
else if (host.motd)
vty_out (vty, "%s", host.motd);
@@ -401,14 +385,14 @@ vty_auth (struct vty *vty, char *buf)
{
if (vty->node == AUTH_NODE)
{
- vty_outln (vty, "%% Bad passwords, too many failures!");
+ vty_out (vty, "%% Bad passwords, too many failures!\n");
vty->status = VTY_CLOSE;
}
else
{
/* AUTH_ENABLE_NODE */
vty->fail = 0;
- vty_outln (vty, "%% Bad enable passwords, too many failures!");
+ vty_out (vty, "%% Bad enable passwords, too many failures!\n");
vty->status = VTY_CLOSE;
}
}
@@ -493,16 +477,16 @@ vty_command (struct vty *vty, char *buf)
{
case CMD_WARNING:
if (vty->type == VTY_FILE)
- vty_outln (vty, "Warning...");
+ vty_out (vty, "Warning...\n");
break;
case CMD_ERR_AMBIGUOUS:
- vty_outln (vty, "%% Ambiguous command.");
+ vty_out (vty, "%% Ambiguous command.\n");
break;
case CMD_ERR_NO_MATCH:
- vty_outln (vty, "%% [%s] Unknown command: %s", protocolname, buf);
+ vty_out (vty, "%% [%s] Unknown command: %s\n", protocolname, buf);
break;
case CMD_ERR_INCOMPLETE:
- vty_outln (vty, "%% Command incomplete.");
+ vty_out (vty, "%% Command incomplete.\n");
break;
}
cmd_free_strvec (vline);
@@ -730,7 +714,7 @@ vty_backward_word (struct vty *vty)
static void
vty_down_level (struct vty *vty)
{
- vty_out (vty, VTYNL);
+ vty_out (vty, "\n");
cmd_exit (vty);
vty_prompt (vty);
vty->cp = 0;
@@ -740,7 +724,7 @@ vty_down_level (struct vty *vty)
static void
vty_end_config (struct vty *vty)
{
- vty_out (vty, VTYNL);
+ vty_out (vty, "\n");
switch (vty->node)
{
@@ -784,6 +768,7 @@ vty_end_config (struct vty *vty)
case MASC_NODE:
case PIM_NODE:
case VTY_NODE:
+ case BGP_EVPN_VNI_NODE:
vty_config_unlock (vty);
vty->node = ENABLE_NODE;
break;
@@ -945,16 +930,16 @@ vty_complete_command (struct vty *vty)
cmd_free_strvec (vline);
- vty_out (vty, VTYNL);
+ vty_out (vty, "\n");
switch (ret)
{
case CMD_ERR_AMBIGUOUS:
- vty_outln (vty, "%% Ambiguous command.");
+ vty_out (vty, "%% Ambiguous command.\n");
vty_prompt (vty);
vty_redraw_line (vty);
break;
case CMD_ERR_NO_MATCH:
- /* vty_out (vty, "%% There is no matched command.%s", VTYNL); */
+ /* vty_out (vty, "%% There is no matched command.\n"); */
vty_prompt (vty);
vty_redraw_line (vty);
break;
@@ -962,7 +947,7 @@ vty_complete_command (struct vty *vty)
if (!matched[0])
{
/* 2016-11-28 equinox -- need to debug, SEGV here */
- vty_outln (vty, "%% CLI BUG: FULL_MATCH with NULL str");
+ vty_out (vty, "%% CLI BUG: FULL_MATCH with NULL str\n");
vty_prompt (vty);
vty_redraw_line (vty);
break;
@@ -985,11 +970,11 @@ vty_complete_command (struct vty *vty)
for (i = 0; matched[i] != NULL; i++)
{
if (i != 0 && ((i % 6) == 0))
- vty_out (vty, VTYNL);
+ vty_out (vty, "\n");
vty_out (vty, "%-10s ", matched[i]);
XFREE (MTYPE_COMPLETION, matched[i]);
}
- vty_out (vty, VTYNL);
+ vty_out (vty, "\n");
vty_prompt (vty);
vty_redraw_line (vty);
@@ -1017,7 +1002,7 @@ vty_describe_fold (struct vty *vty, int cmd_width,
if (desc_width <= 0)
{
- vty_outln (vty, " %-*s %s", cmd_width, cmd, token->desc);
+ vty_out (vty, " %-*s %s\n", cmd_width, cmd, token->desc);
return;
}
@@ -1034,12 +1019,12 @@ vty_describe_fold (struct vty *vty, int cmd_width,
strncpy (buf, p, pos);
buf[pos] = '\0';
- vty_outln (vty, " %-*s %s", cmd_width, cmd, buf);
+ vty_out (vty, " %-*s %s\n", cmd_width, cmd, buf);
cmd = "";
}
- vty_outln (vty, " %-*s %s", cmd_width, cmd, p);
+ vty_out (vty, " %-*s %s\n", cmd_width, cmd, p);
XFREE (MTYPE_TMP, buf);
}
@@ -1068,17 +1053,17 @@ vty_describe_command (struct vty *vty)
describe = cmd_describe_command (vline, vty, &ret);
- vty_out (vty, VTYNL);
+ vty_out (vty, "\n");
/* Ambiguous error. */
switch (ret)
{
case CMD_ERR_AMBIGUOUS:
- vty_outln (vty, "%% Ambiguous command.");
+ vty_out (vty, "%% Ambiguous command.\n");
goto out;
break;
case CMD_ERR_NO_MATCH:
- vty_outln (vty, "%% There is no matched command.");
+ vty_out (vty, "%% There is no matched command.\n");
goto out;
break;
}
@@ -1116,10 +1101,10 @@ vty_describe_command (struct vty *vty)
}
if (!token->desc)
- vty_outln (vty, " %-s",
+ vty_out (vty, " %-s\n",
token->text);
else if (desc_width >= strlen (token->desc))
- vty_outln (vty, " %-*s %s", width,
+ vty_out (vty, " %-*s %s\n", width,
token->text,
token->desc);
else
@@ -1132,33 +1117,29 @@ vty_describe_command (struct vty *vty)
vector varcomps = vector_init (VECTOR_MIN_SIZE);
cmd_variable_complete (token, ref, varcomps);
- if (vector_active(varcomps) > 0)
+ if (vector_active (varcomps) > 0)
{
- vty_out(vty, " ");
- for (size_t j = 0; j < vector_active (varcomps); j++)
- {
- char *item = vector_slot (varcomps, j);
- vty_out(vty, " %s", item);
- XFREE(MTYPE_COMPLETION, item);
- }
- vty_out (vty, VTYNL);
+ char *ac = cmd_variable_comp2str(varcomps, vty->width);
+ vty_out(vty, "%s\n", ac);
+ XFREE(MTYPE_TMP, ac);
}
+
vector_free(varcomps);
}
#if 0
- vty_out (vty, " %-*s %s%s", width
+ vty_out (vty, " %-*s %s\n", width
desc->cmd[0] == '.' ? desc->cmd + 1 : desc->cmd,
- desc->str ? desc->str : "", VTYNL);
+ desc->str ? desc->str : "");
#endif /* 0 */
}
if ((token = token_cr))
{
if (!token->desc)
- vty_outln (vty, " %-s",
+ vty_out (vty, " %-s\n",
token->text);
else if (desc_width >= strlen (token->desc))
- vty_outln (vty, " %-*s %s", width,
+ vty_out (vty, " %-*s %s\n", width,
token->text,
token->desc);
else
@@ -1186,7 +1167,7 @@ vty_stop_input (struct vty *vty)
{
vty->cp = vty->length = 0;
vty_clear_buf (vty);
- vty_out (vty, VTYNL);
+ vty_out (vty, "\n");
switch (vty->node)
{
@@ -1297,20 +1278,20 @@ vty_telnet_option (struct vty *vty, unsigned char *buf, int nbytes)
vty_out (vty, "SE ");
break;
case TELOPT_ECHO:
- vty_outln (vty, "TELOPT_ECHO ");
+ vty_out (vty, "TELOPT_ECHO \n");
break;
case TELOPT_SGA:
- vty_outln (vty, "TELOPT_SGA ");
+ vty_out (vty, "TELOPT_SGA \n");
break;
case TELOPT_NAWS:
- vty_outln (vty, "TELOPT_NAWS ");
+ vty_out (vty, "TELOPT_NAWS \n");
break;
default:
vty_out (vty, "%x ", buf[i]);
break;
}
}
- vty_out (vty, VTYNL);
+ vty_out (vty, "\n");
#endif /* TELNET_OPTION_DEBUG */
@@ -1347,8 +1328,8 @@ vty_telnet_option (struct vty *vty, unsigned char *buf, int nbytes)
vty->width = ((vty->sb_buf[1] << 8)|vty->sb_buf[2]);
vty->height = ((vty->sb_buf[3] << 8)|vty->sb_buf[4]);
#ifdef TELNET_OPTION_DEBUG
- vty_outln (vty, "TELNET NAWS window size negotiation completed: "
- "width %d, height %d",
+ vty_out (vty, "TELNET NAWS window size negotiation completed: "
+ "width %d, height %d\n",
vty->width, vty->height);
#endif
}
@@ -1606,7 +1587,7 @@ vty_read (struct thread *thread)
break;
case '\n':
case '\r':
- vty_out (vty, VTYNL);
+ vty_out (vty, "\n");
vty_execute (vty);
break;
case '\t':
@@ -1765,7 +1746,7 @@ vty_create (int vty_sock, union sockunion *su)
/* Vty is not available if password isn't set. */
if (host.password == NULL && host.password_encrypt == NULL)
{
- vty_outln (vty, "Vty password is not set.");
+ vty_out (vty, "Vty password is not set.\n");
vty->status = VTY_CLOSE;
vty_close (vty);
return NULL;
@@ -1775,8 +1756,7 @@ vty_create (int vty_sock, union sockunion *su)
/* Say hello to the world. */
vty_hello (vty);
if (! no_password_check)
- vty_outln (vty, "%sUser Access Verification%s", VTYNL,
- VTYNL);
+ vty_out (vty, "\nUser Access Verification\n\n");
/* Setting up terminal. */
vty_will_echo (vty);
@@ -2193,7 +2173,7 @@ vtysh_read (struct thread *thread)
/* Clear command line buffer. */
vty->cp = vty->length = 0;
vty_clear_buf (vty);
- vty_outln (vty, "%% Command is too long.");
+ vty_out (vty, "%% Command is too long.\n");
}
else
{
@@ -2219,7 +2199,7 @@ vtysh_read (struct thread *thread)
if (ret == CMD_SUSPEND)
break;
- /* warning: watchquagga hardcodes this result write */
+ /* warning: watchfrr hardcodes this result write */
header[3] = ret;
buffer_put(vty->obuf, header, 4);
@@ -2336,7 +2316,7 @@ vty_timeout (struct thread *thread)
/* Clear buffer*/
buffer_reset (vty->obuf);
- vty_outln (vty, "%sVty connection is timed out.", VTYNL);
+ vty_out (vty, "\nVty connection is timed out.\n");
/* Close connection. */
vty->status = VTY_CLOSE;
@@ -2717,9 +2697,9 @@ DEFUN_NOSH (config_who,
for (i = 0; i < vector_active (vtyvec); i++)
if ((v = vector_slot (vtyvec, i)) != NULL)
- vty_out (vty, "%svty[%d] connected from %s.%s",
+ vty_out (vty, "%svty[%d] connected from %s.\n",
v->config ? "*" : " ",
- i, v->address, VTYNL);
+ i, v->address);
return CMD_SUCCESS;
}
@@ -2817,8 +2797,8 @@ DEFUN (no_vty_access_class,
const char *accesslist = (argc == 3) ? argv[idx_word]->arg : NULL;
if (! vty_accesslist_name || (argc == 3 && strcmp(vty_accesslist_name, accesslist)))
{
- vty_outln (vty,"Access-class is not currently applied to vty");
- return CMD_WARNING;
+ vty_out (vty,"Access-class is not currently applied to vty\n");
+ return CMD_WARNING_CONFIG_FAILED;
}
XFREE(MTYPE_VTY, vty_accesslist_name);
@@ -2860,8 +2840,8 @@ DEFUN (no_vty_ipv6_access_class,
if (! vty_ipv6_accesslist_name ||
(argc == 4 && strcmp(vty_ipv6_accesslist_name, accesslist)))
{
- vty_outln (vty,"IPv6 access-class is not currently applied to vty");
- return CMD_WARNING;
+ vty_out (vty,"IPv6 access-class is not currently applied to vty\n");
+ return CMD_WARNING_CONFIG_FAILED;
}
XFREE(MTYPE_VTY, vty_ipv6_accesslist_name);
@@ -2961,7 +2941,7 @@ DEFUN_NOSH (show_history,
}
if (vty->hist[index] != NULL)
- vty_out (vty, " %s%s", vty->hist[index], VTYNL);
+ vty_out (vty, " %s\n", vty->hist[index]);
index++;
}
@@ -2984,30 +2964,30 @@ DEFUN (log_commands,
static int
vty_config_write (struct vty *vty)
{
- vty_outln (vty, "line vty");
+ vty_out (vty, "line vty\n");
if (vty_accesslist_name)
- vty_outln (vty, " access-class %s",
+ vty_out (vty, " access-class %s\n",
vty_accesslist_name);
if (vty_ipv6_accesslist_name)
- vty_outln (vty, " ipv6 access-class %s",
+ vty_out (vty, " ipv6 access-class %s\n",
vty_ipv6_accesslist_name);
/* exec-timeout */
if (vty_timeout_val != VTY_TIMEOUT_DEFAULT)
- vty_outln (vty, " exec-timeout %ld %ld",
+ vty_out (vty, " exec-timeout %ld %ld\n",
vty_timeout_val / 60,
vty_timeout_val % 60);
/* login */
if (no_password_check)
- vty_outln (vty, " no login");
+ vty_out (vty, " no login\n");
if (do_log_commands)
- vty_outln (vty, "log commands");
+ vty_out (vty, "log commands\n");
- vty_outln (vty, "!");
+ vty_out (vty, "!\n");
return CMD_SUCCESS;
}