doc, vtysh: Fixup of history handling
This fix does two things:
1) If the ${HOME}/.history_quagga file does not exist, create it
for history storing.
2) Allow vtysh -c "..." commands to be stored in history file
as well
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
diff --git a/doc/vtysh.1 b/doc/vtysh.1
index de4913e..a2afa9f 100644
--- a/doc/vtysh.1
+++ b/doc/vtysh.1
@@ -76,6 +76,9 @@
.BI /usr/local/etc/Quagga.conf
The default location of the integrated Quagga routing engine config file
if integrated config file is in use (not default).
+.TP
+.BI ${HOME}/.history_quagga
+Location of history of commands entered via cli
.SH WARNING
This man page is intended to be a quick reference for command line
options. The definitive document is the Info file \fBQuagga\fR.
diff --git a/vtysh/vtysh_main.c b/vtysh/vtysh_main.c
index aa7d021..02a19b7 100644
--- a/vtysh/vtysh_main.c
+++ b/vtysh/vtysh_main.c
@@ -223,6 +223,7 @@
struct cmd_rec *tail = NULL;
int echo_command = 0;
int no_error = 0;
+ char *homedir = NULL;
/* Preserve name of myself. */
progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
@@ -317,6 +318,27 @@
exit(1);
}
+ /*
+ * Setup history file for use by both -c and regular input
+ * If we can't find the home directory, then don't store
+ * the history information
+ */
+ homedir = vtysh_get_home ();
+ if (homedir)
+ {
+ snprintf(history_file, sizeof(history_file), "%s/.history_quagga", homedir);
+ if (read_history (history_file) != 0)
+ {
+ int fp;
+
+ fp = open (history_file, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
+ if (fp)
+ close (fp);
+
+ read_history (history_file);
+ }
+ }
+
/* If eval mode. */
if (cmd)
{
@@ -332,6 +354,9 @@
{
*eol = '\0';
+ add_history (cmd->line);
+ append_history (1, history_file);
+
if (echo_command)
printf("%s%s\n", vtysh_prompt(), cmd->line);
@@ -348,6 +373,9 @@
cmd->line = eol+1;
}
+ add_history (cmd->line);
+ append_history (1, history_file);
+
if (echo_command)
printf("%s%s\n", vtysh_prompt(), cmd->line);
@@ -368,6 +396,8 @@
XFREE(0, cr);
}
}
+
+ history_truncate_file(history_file,1000);
exit (0);
}
@@ -397,8 +427,6 @@
sigsetjmp (jmpbuf, 1);
jmpflag = 1;
- snprintf(history_file, sizeof(history_file), "%s/.history_quagga", getenv("HOME"));
- read_history(history_file);
/* Main command loop. */
while (vtysh_rl_gets ())
vtysh_execute (line_read);
diff --git a/vtysh/vtysh_user.c b/vtysh/vtysh_user.c
index 7e10d68..239a633 100644
--- a/vtysh/vtysh_user.c
+++ b/vtysh/vtysh_user.c
@@ -191,6 +191,16 @@
return 0;
}
+char *
+vtysh_get_home (void)
+{
+ struct passwd *passwd;
+
+ passwd = getpwuid (getuid ());
+
+ return passwd ? passwd->pw_dir : NULL;
+}
+
void
vtysh_user_init (void)
{
diff --git a/vtysh/vtysh_user.h b/vtysh/vtysh_user.h
index c485c23..a6c8b99 100644
--- a/vtysh/vtysh_user.h
+++ b/vtysh/vtysh_user.h
@@ -25,4 +25,6 @@
int vtysh_auth (void);
void vtysh_user_init (void);
+char *vtysh_get_home (void);
+
#endif /* _VTYSH_USER_H */