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 */