summaryrefslogtreecommitdiff
path: root/lib/vty.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vty.c')
-rw-r--r--lib/vty.c87
1 files changed, 40 insertions, 47 deletions
diff --git a/lib/vty.c b/lib/vty.c
index 2d97cca351..639307b507 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -42,10 +42,15 @@
#include "frrstr.h"
#include "lib_errors.h"
#include "northbound_cli.h"
+#include "printfrr.h"
#include <arpa/telnet.h>
#include <termios.h>
+#ifndef VTYSH_EXTRACT_PL
+#include "lib/vty_clippy.c"
+#endif
+
DEFINE_MTYPE_STATIC(LIB, VTY, "VTY")
DEFINE_MTYPE_STATIC(LIB, VTY_OUT_BUF, "VTY output buffer")
DEFINE_MTYPE_STATIC(LIB, VTY_HIST, "VTY history")
@@ -92,7 +97,8 @@ static int no_password_check = 0;
/* Integrated configuration file path */
static char integrate_default[] = SYSCONFDIR INTEGRATE_DEFAULT_CONFIG;
-static int do_log_commands = 0;
+static bool do_log_commands;
+static bool do_log_commands_perm;
void vty_frame(struct vty *vty, const char *format, ...)
{
@@ -143,10 +149,9 @@ bool vty_set_include(struct vty *vty, const char *regexp)
int vty_out(struct vty *vty, const char *format, ...)
{
va_list args;
- int len = 0;
- int size = 1024;
+ ssize_t len;
char buf[1024];
- char *p = NULL;
+ char *p = buf;
char *filtered;
if (vty->frame_pos) {
@@ -154,35 +159,11 @@ int vty_out(struct vty *vty, const char *format, ...)
vty_out(vty, "%s", vty->frame);
}
- /* Try to write to initial buffer. */
va_start(args, format);
- len = vsnprintf(buf, sizeof(buf), format, args);
+ p = vasnprintfrr(MTYPE_VTY_OUT_BUF, buf, sizeof(buf), format, args);
va_end(args);
- /* Initial buffer is not enough. */
- if (len < 0 || len >= size) {
- while (1) {
- if (len > -1)
- size = len + 1;
- else
- size = size * 2;
-
- p = XREALLOC(MTYPE_VTY_OUT_BUF, p, size);
- if (!p)
- return -1;
-
- va_start(args, format);
- len = vsnprintf(p, size, format, args);
- va_end(args);
-
- if (len > -1 && len < size)
- break;
- }
- }
-
- /* When initial buffer is enough to store all output. */
- if (!p)
- p = buf;
+ len = strlen(p);
/* filter buffer */
if (vty->filter) {
@@ -269,8 +250,8 @@ done:
}
static int vty_log_out(struct vty *vty, const char *level,
- const char *proto_str, const char *format,
- struct timestamp_control *ctl, va_list va)
+ const char *proto_str, const char *msg,
+ struct timestamp_control *ctl)
{
int ret;
int len;
@@ -295,7 +276,7 @@ static int vty_log_out(struct vty *vty, const char *level,
if ((ret < 0) || ((size_t)(len += ret) >= sizeof(buf)))
return -1;
- if (((ret = vsnprintf(buf + len, sizeof(buf) - len, format, va)) < 0)
+ if (((ret = snprintf(buf + len, sizeof(buf) - len, "%s", msg)) < 0)
|| ((size_t)((len += ret) + 2) > sizeof(buf)))
return -1;
@@ -2547,8 +2528,8 @@ tmp_free_and_out:
}
/* Small utility function which output log to the VTY. */
-void vty_log(const char *level, const char *proto_str, const char *format,
- struct timestamp_control *ctl, va_list va)
+void vty_log(const char *level, const char *proto_str, const char *msg,
+ struct timestamp_control *ctl)
{
unsigned int i;
struct vty *vty;
@@ -2558,13 +2539,8 @@ void vty_log(const char *level, const char *proto_str, const char *format,
for (i = 0; i < vector_active(vtyvec); i++)
if ((vty = vector_slot(vtyvec, i)) != NULL)
- if (vty->monitor) {
- va_list ac;
- va_copy(ac, va);
- vty_log_out(vty, level, proto_str, format, ctl,
- ac);
- va_end(ac);
- }
+ if (vty->monitor)
+ vty_log_out(vty, level, proto_str, msg, ctl);
}
/* Async-signal-safe version of vty_log for fixed strings. */
@@ -2975,13 +2951,24 @@ DEFUN_NOSH (show_history,
}
/* vty login. */
-DEFUN (log_commands,
+DEFPY (log_commands,
log_commands_cmd,
- "log commands",
+ "[no] log commands",
+ NO_STR
"Logging control\n"
- "Log all commands (can't be unset without restart)\n")
+ "Log all commands\n")
{
- do_log_commands = 1;
+ if (no) {
+ if (do_log_commands_perm) {
+ vty_out(vty,
+ "Daemon started with permanent logging turned on for commands, ignoring\n");
+ return CMD_WARNING;
+ }
+
+ do_log_commands = false;
+ } else
+ do_log_commands = true;
+
return CMD_SUCCESS;
}
@@ -3101,7 +3088,7 @@ void vty_init_vtysh(void)
}
/* Install vty's own commands like `who' command. */
-void vty_init(struct thread_master *master_thread)
+void vty_init(struct thread_master *master_thread, bool do_command_logging)
{
/* For further configuration read, preserve current directory. */
vty_save_cwd();
@@ -3125,6 +3112,12 @@ void vty_init(struct thread_master *master_thread)
install_element(CONFIG_NODE, &no_service_advanced_vty_cmd);
install_element(CONFIG_NODE, &show_history_cmd);
install_element(CONFIG_NODE, &log_commands_cmd);
+
+ if (do_command_logging) {
+ do_log_commands = true;
+ do_log_commands_perm = true;
+ }
+
install_element(ENABLE_NODE, &terminal_monitor_cmd);
install_element(ENABLE_NODE, &terminal_no_monitor_cmd);
install_element(ENABLE_NODE, &no_terminal_monitor_cmd);