From fba55c8ac3d0068c694c98c2b641c622b8a6f189 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Wed, 13 Jan 2016 10:49:50 -0800 Subject: [PATCH] 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 --- doc/vtysh.1 | 3 +++ vtysh/vtysh_main.c | 32 ++++++++++++++++++++++++++++++-- vtysh/vtysh_user.c | 12 +++++++++++- vtysh/vtysh_user.h | 2 ++ 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/doc/vtysh.1 b/doc/vtysh.1 index ff4c2b4f8..d144cb642 100644 --- a/doc/vtysh.1 +++ b/doc/vtysh.1 @@ -76,6 +76,9 @@ config file. .BI /etc/quagga/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 e160e3360..033b273e5 100644 --- a/vtysh/vtysh_main.c +++ b/vtysh/vtysh_main.c @@ -232,6 +232,7 @@ main (int argc, char **argv, char **env) int echo_command = 0; int no_error = 0; int markfile = 0; + char *homedir = NULL; /* Preserve name of myself. */ progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]); @@ -360,6 +361,27 @@ main (int argc, char **argv, char **env) exit(0); } + /* + * 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) { @@ -375,6 +397,9 @@ main (int argc, char **argv, char **env) { *eol = '\0'; + add_history (cmd->line); + append_history (1, history_file); + if (echo_command) printf("%s%s\n", vtysh_prompt(), cmd->line); @@ -391,6 +416,9 @@ main (int argc, char **argv, char **env) cmd->line = eol+1; } + add_history (cmd->line); + append_history (1, history_file); + if (echo_command) printf("%s%s\n", vtysh_prompt(), cmd->line); @@ -411,6 +439,8 @@ main (int argc, char **argv, char **env) XFREE(0, cr); } } + + history_truncate_file(history_file,1000); exit (0); } @@ -440,8 +470,6 @@ main (int argc, char **argv, char **env) 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 0e314bcbb..214279fac 100644 --- a/vtysh/vtysh_user.c +++ b/vtysh/vtysh_user.c @@ -207,8 +207,18 @@ vtysh_auth () return 0; } +char * +vtysh_get_home (void) +{ + struct passwd *passwd; + + passwd = getpwuid (getuid ()); + + return passwd ? passwd->pw_dir : NULL; +} + void -vtysh_user_init () +vtysh_user_init (void) { userlist = list_new (); install_element (CONFIG_NODE, &username_nopassword_cmd); diff --git a/vtysh/vtysh_user.h b/vtysh/vtysh_user.h index 43d125505..b0686a969 100644 --- a/vtysh/vtysh_user.h +++ b/vtysh/vtysh_user.h @@ -25,4 +25,6 @@ int vtysh_auth (); void user_config_write(void); +char *vtysh_get_home (void); + #endif /* _VTYSH_USER_H */ -- 2.39.5