Browse Source

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>
Donald Sharp 3 years ago
parent
commit
2e32042333
4 changed files with 45 additions and 2 deletions
  1. 3 0
      doc/vtysh.1
  2. 30 2
      vtysh/vtysh_main.c
  3. 10 0
      vtysh/vtysh_user.c
  4. 2 0
      vtysh/vtysh_user.h

+ 3 - 0
doc/vtysh.1

@@ -76,6 +76,9 @@ config file.
 .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.

+ 30 - 2
vtysh/vtysh_main.c

@@ -223,6 +223,7 @@ main (int argc, char **argv, char **env)
   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 @@ main (int argc, char **argv, char **env)
       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 @@ 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);
 	      
@@ -348,6 +373,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);
 
@@ -368,6 +396,8 @@ main (int argc, char **argv, char **env)
 	    XFREE(0, cr);
 	  }
         }
+
+      history_truncate_file(history_file,1000);
       exit (0);
     }
   
@@ -397,8 +427,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);

+ 10 - 0
vtysh/vtysh_user.c

@@ -191,6 +191,16 @@ vtysh_auth (void)
   return 0;
 }
 
+char *
+vtysh_get_home (void)
+{
+  struct passwd *passwd;
+
+  passwd = getpwuid (getuid ());
+
+  return passwd ? passwd->pw_dir : NULL;
+}
+
 void
 vtysh_user_init (void)
 {

+ 2 - 0
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 */