Added vtysh patch to allow 'write file' command to write either
per-daemon and/or integrated config file
diff --git a/ChangeLog b/ChangeLog
index 7448bfe..bad4d0d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2002-12-13 Paul Jakma <paul@dishone.st>
+
+	* added support for vtysh 'write file' command to 
+	write either per-daamon and/or integrated file
+
 2002-07-07  Kunihiro Ishiguro  <kunihiro@ipinfusion.com>
 
 	* zebra-0.93 released.
diff --git a/vtysh/ChangeLog b/vtysh/ChangeLog
index 5818d5c..701101a 100644
--- a/vtysh/ChangeLog
+++ b/vtysh/ChangeLog
@@ -1,3 +1,10 @@
+2002-09-30 Paul Jakma <paulzebra@rs250.org>
+	
+	* vtysh.c: add 'write-config (integrated|daemon)' option
+	to specifiy whether write config commands should write
+	integrated Zebra.conf file and/or per daemon files.
+	Defaults to per daemon, unless this is turned off.
+
 2002-07-07  Kunihiro Ishiguro  <kunihiro@ipinfusion.com>
 
 	* zebra-0.93 released.
diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c
index 965eb39..6e12475 100644
--- a/vtysh/vtysh.c
+++ b/vtysh/vtysh.c
@@ -376,22 +376,22 @@
     {
     case CMD_WARNING:
       if (vty->type == VTY_FILE)
-	printf ("Warning...\n");
+	fprintf (stdout,"Warning...\n");
       break;
     case CMD_ERR_AMBIGUOUS:
-      printf ("%% Ambiguous command.\n");
+      fprintf (stdout,"%% Ambiguous command.\n");
       break;
     case CMD_ERR_NO_MATCH:
-      printf ("%% Unknown command.\n");
+      fprintf (stdout,"%% Unknown command.\n");
       break;
     case CMD_ERR_INCOMPLETE:
-      printf ("%% Command incomplete.\n");
+      fprintf (stdout,"%% Command incomplete.\n");
       break;
     case CMD_SUCCESS_DAEMON:
       {
 	if (pager && vtysh_pager_name)
 	  {
-	    fp = popen ("more", "w");
+	    fp = popen (vtysh_pager_name, "w");
 	    if (fp == NULL)
 	      {
 		perror ("popen");
@@ -558,16 +558,16 @@
 	{
 	case CMD_WARNING:
 	  if (vty->type == VTY_FILE)
-	    printf ("Warning...\n");
+	    fprintf (stdout,"Warning...\n");
 	  break;
 	case CMD_ERR_AMBIGUOUS:
-	  printf ("%% Ambiguous command.\n");
+	  fprintf (stdout,"%% Ambiguous command.\n");
 	  break;
 	case CMD_ERR_NO_MATCH:
-	  printf ("%% Unknown command: %s", vty->buf);
+	  fprintf (stdout,"%% Unknown command: %s", vty->buf);
 	  break;
 	case CMD_ERR_INCOMPLETE:
-	  printf ("%% Command incomplete.\n");
+	  fprintf (stdout,"%% Command incomplete.\n");
 	  break;
 	case CMD_SUCCESS_DAEMON:
 	  {
@@ -628,20 +628,20 @@
 
   describe = cmd_describe_command (vline, vty, &ret);
 
-  printf ("\n");
+  fprintf (stdout,"\n");
 
   /* Ambiguous and no match error. */
   switch (ret)
     {
     case CMD_ERR_AMBIGUOUS:
       cmd_free_strvec (vline);
-      printf ("%% Ambiguous command.\n");
+      fprintf (stdout,"%% Ambiguous command.\n");
       rl_on_new_line ();
       return 0;
       break;
     case CMD_ERR_NO_MATCH:
       cmd_free_strvec (vline);
-      printf ("%% There is no matched command.\n");
+      fprintf (stdout,"%% There is no matched command.\n");
       rl_on_new_line ();
       return 0;
       break;
@@ -672,10 +672,10 @@
 	  continue;
 
 	if (! desc->str)
-	  printf ("  %-s\n",
+	  fprintf (stdout,"  %-s\n",
 		  desc->cmd[0] == '.' ? desc->cmd + 1 : desc->cmd);
 	else
-	  printf ("  %-*s  %s\n",
+	  fprintf (stdout,"  %-*s  %s\n",
 		  width,
 		  desc->cmd[0] == '.' ? desc->cmd + 1 : desc->cmd,
 		  desc->str);
@@ -1175,7 +1175,7 @@
 
   if (vtysh_pager_name)
     {
-      fp = popen ("more", "w");
+      fp = popen (vtysh_pager_name, "w");
       if (fp == NULL)
 	{
 	  perror ("popen");
@@ -1214,11 +1214,42 @@
   return CMD_SUCCESS;
 }
 
-DEFUN (vtysh_write_memory,
-       vtysh_write_memory_cmd,
-       "write memory",
-       "Write running configuration to memory, network, or terminal\n"
-       "Write configuration to the file (same as write file)\n")
+struct vtysh_writeconfig_t {
+	int daemon;
+	int integrated;
+} vtysh_wc = {-1,0};
+
+DEFUN (vtysh_write_config,
+		vtysh_write_config_cmd,
+		"write-config (daemon|integrated)",
+		"Specify config files to write to\n"
+		"Write per daemon file\n"
+		"Write integrated file\n"
+)
+{
+	if (!strncmp(argv[0],"d",1)) {
+		vtysh_wc.daemon = 1;
+	} else if (!strncmp(argv[0],"i",1)) {
+		vtysh_wc.integrated = 1;
+	}
+	return CMD_SUCCESS;
+}
+
+DEFUN (no_vtysh_write_config,
+		no_vtysh_write_config_cmd,
+		"no write-config (daemon|integrated)",
+		"Negate per daemon and/or integrated config files\n"
+)
+{
+	if (!strncmp(argv[0],"d",1)) {
+		vtysh_wc.daemon = 0;
+	} else if (!strncmp(argv[0],"i",1)) {
+		vtysh_wc.integrated = 0;
+	}
+	return CMD_SUCCESS;
+}
+
+int write_config_integrated(void)
 {
   int ret;
   mode_t old_umask;
@@ -1235,22 +1266,19 @@
   strcat (integrate_sav, CONF_BACKUP_EXT);
 
 
-  printf ("Building Configuration...\n");
+  fprintf (stdout,"Building Configuration...\n");
 
   /* Move current configuration file to backup config file */
   unlink (integrate_sav);
   rename (integrate_default, integrate_sav);
-
+ 
   fp = fopen (integrate_default, "w");
   if (fp == NULL)
     {
-      printf ("%% Can't open configuration file %s.\n", integrate_default);
+      fprintf (stdout,"%% Can't open configuration file %s.\n", integrate_default);
       umask (old_umask);
       return CMD_SUCCESS;
     }
-  else
-    printf ("[OK]\n");
-	  
 
   vtysh_config_write (fp);
 
@@ -1265,10 +1293,46 @@
 
   fclose (fp);
 
+  fprintf(stdout,"Integrated configuration saved to %s\n",integrate_default);
+
+  fprintf (stdout,"[OK]\n");
+
   umask (old_umask);
   return CMD_SUCCESS;
 }
 
+DEFUN (vtysh_write_memory,
+       vtysh_write_memory_cmd,
+       "write memory",
+       "Write running configuration to memory, network, or terminal\n"
+       "Write configuration to the file (same as write file)\n")
+{
+  int ret;
+  char line[] = "write memory\n";
+  
+  /* if integrated Zebra.conf explicitely set */
+  if (vtysh_wc.integrated == 1) {
+  	ret = write_config_integrated();
+  }
+
+  if (!vtysh_wc.daemon) {
+  	return ret;
+  }
+
+  fprintf (stdout,"Building Configuration...\n");
+	  
+  ret = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_ZEBRA], line, stdout);
+  ret = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_RIP], line, stdout);
+  ret = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_RIPNG], line, stdout);
+  ret = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_OSPF], line, stdout);
+  ret = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_OSPF6], line, stdout);
+  ret = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_BGP], line, stdout);
+
+  fprintf (stdout,"[OK]\n");
+
+  return CMD_SUCCESS;  
+}
+
 ALIAS (vtysh_write_memory,
        vtysh_copy_runningconfig_startupconfig_cmd,
        "copy running-config startup-config",  
@@ -1800,4 +1864,6 @@
   install_element (CONFIG_NODE, &no_vtysh_log_trap_cmd);
   install_element (CONFIG_NODE, &vtysh_log_record_priority_cmd);
   install_element (CONFIG_NODE, &no_vtysh_log_record_priority_cmd);
+  install_element (CONFIG_NODE, &vtysh_write_config_cmd);
+  install_element (CONFIG_NODE, &no_vtysh_write_config_cmd);
 }