Big vtysh cleanup. See changelogs for details.
diff --git a/doc/ChangeLog b/doc/ChangeLog
index bb2e477..625b2a7 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,8 @@
+2004-10-03 Hasso Tepper <hasso at quagga.net>
+
+	* vtysh.1: Update vtysh man page to reflect changes in shell. Remove
+	  info about -f command line switch.
+
 2004-09-11 Paul Jakma <paul@dishone.st>
 
 	* quagga.texi: Update copyright. Contents should be at beginning
diff --git a/doc/vtysh.1 b/doc/vtysh.1
index 90aaff1..e5fccb1 100644
--- a/doc/vtysh.1
+++ b/doc/vtysh.1
@@ -1,22 +1,14 @@
-.TH VTYSH 1 "27 August 2004" "Quagga VTY shell" "Version 0.96.5"
+.TH VTYSH 1 "3 October 2004" "Quagga VTY shell" "Version 0.96.5"
 .SH NAME
 vtysh \- a integrated shell for Quagga routing software
 .SH SYNOPSIS
 .B vtysh
 [
-.B \-f
-.I config-file
-]
-[
 .B \-b
 ]
 .br
 .B vtysh
 [
-.B \-f
-.I config-file
-]
-[
 .B \-c
 .I command
 ]
@@ -44,9 +36,6 @@
 .IP "\fB\-e, \-\-execute \fIcommand\fP"
 Alias for -c. It's here only for compatibility with Zebra routing software and
 older Quagga versions. This will be removed in future.
-.IP "\fB\-f, \-\-config-file \fIconfig-file\fP"
-Specifies the config file to use for startup. If not specified this option will
-likely default to \fB\fI/usr/local/etc/vtysh.conf\fR.
 .IP "\fB\-h, \-\-help\fP"
 Display a usage message on standard output and exit.
 .SH ENVIRONMENT VARIABLES
diff --git a/lib/ChangeLog b/lib/ChangeLog
index e92147f..3049b95 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,10 @@
+2004-10-03  Hasso Tepper  <hasso at quagga.net>
+
+	* command.h: Introduce SERVICE_NODE for "service <...>" commands.
+	* command.c: Don't initialize commands that don't make sense if vtysh
+	  is used.
+	* vty.c: Make VTY_NODE appear in vtysh.
+
 2004-10-03 James R. Leu <jleu at mindspring.com>
 
 	* zclient.c, zclient.h: zclient functions for router id handling.
diff --git a/lib/command.c b/lib/command.c
index 2ed6252..a4cf9eb 100644
--- a/lib/command.c
+++ b/lib/command.c
@@ -3300,23 +3300,22 @@
     }
   install_element (ENABLE_NODE, &show_startup_config_cmd);
   install_element (ENABLE_NODE, &show_version_cmd);
-  if (terminal)
-  {
-    install_element (ENABLE_NODE, &config_terminal_length_cmd);
-    install_element (ENABLE_NODE, &config_terminal_no_length_cmd);
-  }
 
   if (terminal)
-    install_default (CONFIG_NODE);
-  install_element (CONFIG_NODE, &hostname_cmd);
-  install_element (CONFIG_NODE, &no_hostname_cmd);
-  install_element (CONFIG_NODE, &password_cmd);
-  install_element (CONFIG_NODE, &password_text_cmd);
-  install_element (CONFIG_NODE, &enable_password_cmd);
-  install_element (CONFIG_NODE, &enable_password_text_cmd);
-  install_element (CONFIG_NODE, &no_enable_password_cmd);
-  if (terminal)
     {
+      install_element (ENABLE_NODE, &config_terminal_length_cmd);
+      install_element (ENABLE_NODE, &config_terminal_no_length_cmd);
+
+      install_default (CONFIG_NODE);
+
+      install_element (CONFIG_NODE, &hostname_cmd);
+      install_element (CONFIG_NODE, &no_hostname_cmd);
+      install_element (CONFIG_NODE, &password_cmd);
+      install_element (CONFIG_NODE, &password_text_cmd);
+      install_element (CONFIG_NODE, &enable_password_cmd);
+      install_element (CONFIG_NODE, &enable_password_text_cmd);
+      install_element (CONFIG_NODE, &no_enable_password_cmd);
+
       install_element (CONFIG_NODE, &config_log_stdout_cmd);
       install_element (CONFIG_NODE, &no_config_log_stdout_cmd);
       install_element (CONFIG_NODE, &config_log_file_cmd);
@@ -3335,10 +3334,7 @@
       install_element (CONFIG_NODE, &no_banner_motd_cmd);
       install_element (CONFIG_NODE, &service_terminal_length_cmd);
       install_element (CONFIG_NODE, &no_service_terminal_length_cmd);
-    }
 
-  if (terminal)
-    {
       install_element(VIEW_NODE, &show_thread_cpu_cmd);
       install_element(ENABLE_NODE, &show_thread_cpu_cmd);
     }
diff --git a/lib/command.h b/lib/command.h
index 32a347f..d1648d6 100644
--- a/lib/command.h
+++ b/lib/command.h
@@ -71,6 +71,7 @@
   AUTH_ENABLE_NODE,		/* Authentication mode for change enable. */
   ENABLE_NODE,			/* Enable node. */
   CONFIG_NODE,			/* Config node. Default mode of config file. */
+  SERVICE_NODE, 		/* Service node. */
   DEBUG_NODE,			/* Debug node. */
   AAA_NODE,			/* AAA node. */
   KEYCHAIN_NODE,		/* Key-chain node. */
diff --git a/lib/vty.c b/lib/vty.c
index fdd5bbd..3e799b8 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -2670,6 +2670,7 @@
 {
   VTY_NODE,
   "%s(config-line)# ",
+  1,
 };
 
 /* Reset all VTY status. */
diff --git a/vtysh/ChangeLog b/vtysh/ChangeLog
index bca51bb..5d8b7e4 100644
--- a/vtysh/ChangeLog
+++ b/vtysh/ChangeLog
@@ -1,3 +1,28 @@
+2004-10-03 Hasso Tepper <hasso at quagga.net>
+
+	* vtsyh_main.c: Enter into enable node by default. Disable node doesn't
+	  make sense if we don't have any authentication for enable.
+	* vtysh.c: Implement "show running-daemons" command.
+	* vtysh.c: Use either integrated conf or daemon conf not both. Move
+	  configuration command into "service" level.
+	* vtysh.c: Remove "write ..." commands from other nodes than enable.
+	  We have "do ..." extension for that.
+	* vtysh_config.c, vtysh.c: Integrate vtysh configuration into
+	  integrated one.
+	* vtysh_config.c: Use FORWARD_NODE and SERVICE_NODE vty nodes.
+	* vtysh_config.c: Make "service" lines unique in integrated config.
+	* vtysh.c: Make "service password-encryption" command work in vtysh.
+	* vtysh_config.c, vtysh.c, Makefile.am, extract.pl.in: Introduce line
+	  vty commands in vtysh. Parse lib/vty.c for commands, but ignore
+	  commands that don't make sense in vtysh. Closes Bugzilla #104.
+	* vtysh.c: Make "[enable] password" commands work in vtysh. Behavior
+	  is similar to "log" commands - vtysh just passes commands to all
+	  daemons.
+	* vtysh_main.c, vtysh_config.c, vtysh.h: Remove any code dealing with
+	  configuration files specified from command line. We read/write files
+	  from/to system location only (ie. remove -f again).
+	* Makefile.am: Parse zebra/router-id.c.
+
 2004-09-26 Hasso Tepper <hasso at quagga.net>
 
 	* vtysh.c: Fix compiler warning.
diff --git a/vtysh/Makefile.am b/vtysh/Makefile.am
index 1ac5ee4..830ed80 100644
--- a/vtysh/Makefile.am
+++ b/vtysh/Makefile.am
@@ -24,13 +24,13 @@
 vtysh_cmd.c: $(top_srcdir)/ripd/*.c $(top_srcdir)/ripngd/*.c $(top_srcdir)/ospfd/*.c $(top_srcdir)/ospf6d/*.c \
   $(top_srcdir)/isisd/*.c $(top_srcdir)/bgpd/*.c $(top_srcdir)/lib/keychain.c $(top_srcdir)/lib/routemap.c \
   $(top_srcdir)/lib/filter.c $(top_srcdir)/lib/plist.c $(top_srcdir)/lib/distribute.c $(top_srcdir)/lib/if_rmap.c \
-  $(top_srcdir)/zebra/debug.c $(top_srcdir)/zebra/interface.c \
+  $(top_srcdir)/lib/vty.c $(top_srcdir)/zebra/debug.c $(top_srcdir)/zebra/interface.c \
   $(top_srcdir)/zebra/irdp_interface.c $(top_srcdir)/zebra/rtadv.c $(top_srcdir)/zebra/zebra_vty.c \
-  $(top_srcdir)/zebra/zserv.c
+  $(top_srcdir)/zebra/zserv.c $(top_srcdir)/zebra/router-id.c
 	./extract.pl $(top_srcdir)/ripd/*.c $(top_srcdir)/ripngd/*.c $(top_srcdir)/ospfd/*.c $(top_srcdir)/ospf6d/*.c \
 	  $(top_srcdir)/isisd/*.c $(top_srcdir)/bgpd/*.c $(top_srcdir)/lib/keychain.c $(top_srcdir)/lib/routemap.c \
 	  $(top_srcdir)/lib/filter.c $(top_srcdir)/lib/plist.c $(top_srcdir)/lib/distribute.c $(top_srcdir)/lib/if_rmap.c \
-	  $(top_srcdir)/zebra/debug.c $(top_srcdir)/zebra/interface.c  \
+	  $(top_srcdir)/lib/vty.c $(top_srcdir)/zebra/debug.c $(top_srcdir)/zebra/interface.c  \
 	  $(top_srcdir)/zebra/irdp_interface.c $(top_srcdir)/zebra/rtadv.c $(top_srcdir)/zebra/zebra_vty.c \
-	  $(top_srcdir)/zebra/zserv.c > vtysh_cmd.c
+	  $(top_srcdir)/zebra/zserv.c $(top_srcdir)/zebra/router-id.c > vtysh_cmd.c
 
diff --git a/vtysh/extract.pl.in b/vtysh/extract.pl.in
index 053b17e..d2fc42b 100755
--- a/vtysh/extract.pl.in
+++ b/vtysh/extract.pl.in
@@ -52,6 +52,11 @@
 $ignore{'"key <0-2147483647>"'} = "ignore";
 $ignore{'"route-map WORD (deny|permit) <1-65535>"'} = "ignore";
 $ignore{'"show route-map"'} = "ignore";
+$ignore{'"line vty"'} = "ignore";
+$ignore{'"who"'} = "ignore";
+$ignore{'"terminal monitor"'} = "ignore";
+$ignore{'"terminal no monitor"'} = "ignore";
+$ignore{'"show history"'} = "ignore";
 
 foreach (@ARGV) {
     $file = $_;
@@ -118,6 +123,9 @@
                  $protocol = "VTYSH_RIPD";
               }
            }
+	   if ($file =~ /vty.c/) {
+	      $protocol = "VTYSH_ALL";
+	   }
         } else {
            ($protocol) = ($file =~ /^.*\/([a-z0-9]+)\/[a-zA-Z0-9_\-]+\.c$/);
            $protocol = "VTYSH_" . uc $protocol;
diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c
index ba49ede..79e0742 100644
--- a/vtysh/vtysh.c
+++ b/vtysh/vtysh.c
@@ -46,6 +46,11 @@
   int fd;
 } vtysh_client[VTYSH_INDEX_MAX];
 
+/* Using integrated config from Quagga.conf. Default is no. */
+int vtysh_writeconfig_integrated = 0;
+
+extern char config_default[];
+
 void
 vclient_close (struct vtysh_client *vclient)
 {
@@ -148,6 +153,7 @@
     }
 
   /* Parse anything left in the buffer. */
+
   vtysh_config_parse (buf);
 
   XFREE(MTYPE_TMP, buf);
@@ -756,6 +762,9 @@
   "%s(config-keychain-key)# "
 };
 
+/* Defined in lib/vty.c */
+extern struct cmd_node vty_node;
+
 /* When '^Z' is received from vty, move down to the enable mode. */
 int
 vtysh_end ()
@@ -777,7 +786,7 @@
 	 vtysh_end_all,
 	 vtysh_end_all_cmd,
 	 "end",
-	 "End current mode and down to previous mode\n")
+	 "End current mode and change to enable mode\n")
 {
   return vtysh_end ();
 }
@@ -958,6 +967,17 @@
 }
 
 DEFUNSH (VTYSH_ALL,
+	 vtysh_line_vty,
+	 vtysh_line_vty_cmd,
+	 "line vty",
+	 "Configure a terminal line\n"
+	 "Virtual terminal\n")
+{
+  vty->node = VTY_NODE;
+  return CMD_SUCCESS;
+}
+
+DEFUNSH (VTYSH_ALL,
 	 vtysh_enable, 
 	 vtysh_enable_cmd,
 	 "enable",
@@ -1172,6 +1192,20 @@
        "quit",
        "Exit current mode and down to previous mode\n")
 
+DEFUNSH (VTYSH_ALL,
+         vtysh_exit_line_vty,
+         vtysh_exit_line_vty_cmd,
+         "exit",
+         "Exit current mode and down to previous mode\n")
+{
+  return vtysh_exit (vty);
+}
+
+ALIAS (vtysh_exit_line_vty,
+       vtysh_quit_line_vty_cmd,
+       "quit",
+       "Exit current mode and down to previous mode\n")
+
 DEFUNSH (VTYSH_INTERFACE,
 	 vtysh_interface,
 	 vtysh_interface_cmd,
@@ -1328,6 +1362,84 @@
   return CMD_SUCCESS;
 }
 
+DEFUNSH (VTYSH_ALL,
+	 vtysh_service_password_encrypt,
+	 vtysh_service_password_encrypt_cmd,
+	 "service password-encryption",
+	 "Set up miscellaneous service\n"
+	 "Enable encrypted passwords\n")
+{
+  return CMD_SUCCESS;
+}
+
+DEFUNSH (VTYSH_ALL,
+	 no_vtysh_service_password_encrypt,
+	 no_vtysh_service_password_encrypt_cmd,
+	 "no service password-encryption",
+	 NO_STR
+	 "Set up miscellaneous service\n"
+	 "Enable encrypted passwords\n")
+{
+  return CMD_SUCCESS;
+}
+
+DEFUNSH (VTYSH_ALL,
+	 vtysh_config_password,
+	 vtysh_password_cmd,
+	 "password (8|) WORD",
+	 "Assign the terminal connection password\n"
+	 "Specifies a HIDDEN password will follow\n"
+	 "dummy string \n"
+	 "The HIDDEN line password string\n")
+{
+  return CMD_SUCCESS;
+}
+
+DEFUNSH (VTYSH_ALL,
+	 vtysh_password_text,
+	 vtysh_password_text_cmd,
+	 "password LINE",
+	 "Assign the terminal connection password\n"
+	 "The UNENCRYPTED (cleartext) line password\n")
+{
+  return CMD_SUCCESS;
+}
+
+DEFUNSH (VTYSH_ALL,
+	 vtysh_config_enable_password,
+	 vtysh_enable_password_cmd,
+	 "enable password (8|) WORD",
+	 "Modify enable password parameters\n"
+	 "Assign the privileged level password\n"
+	 "Specifies a HIDDEN password will follow\n"
+	 "dummy string \n"
+	 "The HIDDEN 'enable' password string\n")
+{
+  return CMD_SUCCESS;
+}
+
+DEFUNSH (VTYSH_ALL,
+	 vtysh_enable_password_text,
+	 vtysh_enable_password_text_cmd,
+	 "enable password LINE",
+	 "Modify enable password parameters\n"
+	 "Assign the privileged level password\n"
+	 "The UNENCRYPTED (cleartext) 'enable' password\n")
+{
+  return CMD_SUCCESS;
+}
+
+DEFUNSH (VTYSH_ALL,
+	 no_vtysh_config_enable_password,
+	 no_vtysh_enable_password_cmd,
+	 "no enable password",
+	 NO_STR
+	 "Modify enable password parameters\n"
+	 "Assign the privileged level password\n")
+{
+  return CMD_SUCCESS;
+}
+
 DEFUN (vtysh_write_terminal,
        vtysh_write_terminal_cmd,
        "write terminal",
@@ -1353,8 +1465,7 @@
   vty_out (vty, "Building configuration...%s", VTY_NEWLINE);
   vty_out (vty, "%sCurrent configuration:%s", VTY_NEWLINE,
 	   VTY_NEWLINE);
-
-  vtysh_config_write (fp);
+  vty_out (vty, "!%s", VTY_NEWLINE);
 
   ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_ZEBRA], line);
   ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_RIP], line);
@@ -1364,6 +1475,9 @@
   ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_BGP], line);
   ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_ISIS], line);
 
+  /* Integrate vtysh specific configuration. */
+  vtysh_config_write ();
+
   vtysh_config_dump (fp);
 
   if (vtysh_pager_name && fp)
@@ -1380,37 +1494,25 @@
   return CMD_SUCCESS;
 }
 
-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")
+DEFUN (vtysh_integrated_config,
+       vtysh_integrated_config_cmd,
+       "service integrated-vtysh-config",
+       "Set up miscellaneous service\n"
+       "Write configuration into 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;
+  vtysh_writeconfig_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")
+DEFUN (no_vtysh_integrated_config,
+       no_vtysh_integrated_config_cmd,
+       "no service integrated-vtysh-config",
+       NO_STR
+       "Set up miscellaneous service\n"
+       "Write configuration into integrated file\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;
+  vtysh_writeconfig_integrated = 0;
+  return CMD_SUCCESS;
 }
 
 int write_config_integrated(void)
@@ -1440,8 +1542,6 @@
       return CMD_SUCCESS;
     }
 
-  vtysh_config_write (fp);
-
   ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_ZEBRA], line);
   ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_RIP], line);
   ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_RIPNG], line);
@@ -1476,13 +1576,13 @@
 {
   int ret = CMD_SUCCESS;
   char line[] = "write memory\n";
+  char *vtysh_conf;
+  extern struct host host;
+  FILE *fp;
   
-  /* If integrated Zebra.conf explicitely set. */
-  if (vtysh_wc.integrated == 1)
-    ret = write_config_integrated();
-
-  if (!vtysh_wc.daemon)
-    return ret;
+  /* If integrated Quagga.conf explicitely set. */
+  if (vtysh_writeconfig_integrated)
+    return write_config_integrated();
 
   fprintf (stdout,"Building Configuration...\n");
 	  
@@ -1493,7 +1593,7 @@
   ret = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_OSPF6], line, stdout);
   ret = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_BGP], line, stdout);
   ret = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_ISIS], line, stdout);
-
+  
   fprintf (stdout,"[OK]\n");
 
   return ret;
@@ -1573,6 +1673,31 @@
   return CMD_SUCCESS;
 }
 
+DEFUN (vtysh_show_running_daemons,
+       vtysh_show_running_daemons_cmd,
+       "show running-daemons",
+       SHOW_STR
+       "Show list of running daemons\n")
+{
+  if ( vtysh_client[VTYSH_INDEX_ZEBRA].fd > 0 )
+    vty_out(vty, " zebra");
+  if ( vtysh_client[VTYSH_INDEX_RIP].fd > 0 )
+    vty_out(vty, " ripd");
+  if ( vtysh_client[VTYSH_INDEX_RIPNG].fd > 0 )
+    vty_out(vty, " ripngd");
+  if ( vtysh_client[VTYSH_INDEX_OSPF].fd > 0 )
+    vty_out(vty, " ospfd");
+  if ( vtysh_client[VTYSH_INDEX_OSPF6].fd > 0 )
+    vty_out(vty, " ospf6d");
+  if ( vtysh_client[VTYSH_INDEX_BGP].fd > 0 )
+    vty_out(vty, " bgpd");
+  if ( vtysh_client[VTYSH_INDEX_ISIS].fd > 0 )
+    vty_out(vty, " isisd");
+  vty_out(vty, "%s", VTY_NEWLINE);
+
+  return CMD_SUCCESS;
+}
+
 /* Execute command in child process. */
 int
 execute_command (char *command, int argc, char *arg1, char *arg2)
@@ -1898,6 +2023,7 @@
   install_node (&keychain_node, NULL);
   install_node (&keychain_key_node, NULL);
   install_node (&isis_node, NULL);
+  install_node (&vty_node, NULL);
 
   vtysh_install_default (VIEW_NODE);
   vtysh_install_default (ENABLE_NODE);
@@ -1917,6 +2043,7 @@
   vtysh_install_default (ISIS_NODE);
   vtysh_install_default (KEYCHAIN_NODE);
   vtysh_install_default (KEYCHAIN_KEY_NODE);
+  vtysh_install_default (VTY_NODE);
 
   install_element (VIEW_NODE, &vtysh_enable_cmd);
   install_element (ENABLE_NODE, &vtysh_config_terminal_cmd);
@@ -1955,6 +2082,8 @@
   install_element (KEYCHAIN_KEY_NODE, &vtysh_quit_ripd_cmd);
   install_element (RMAP_NODE, &vtysh_exit_rmap_cmd);
   install_element (RMAP_NODE, &vtysh_quit_rmap_cmd);
+  install_element (VTY_NODE, &vtysh_exit_line_vty_cmd);
+  install_element (VTY_NODE, &vtysh_quit_line_vty_cmd);
 
   /* "end" command. */
   install_element (CONFIG_NODE, &vtysh_end_all_cmd);
@@ -1972,6 +2101,7 @@
   install_element (KEYCHAIN_NODE, &vtysh_end_all_cmd);
   install_element (KEYCHAIN_KEY_NODE, &vtysh_end_all_cmd);
   install_element (RMAP_NODE, &vtysh_end_all_cmd);
+  install_element (VTY_NODE, &vtysh_end_all_cmd);
 
   install_element (INTERFACE_NODE, &interface_desc_cmd);
   install_element (INTERFACE_NODE, &no_interface_desc_cmd);
@@ -2002,6 +2132,7 @@
   install_element (BGP_IPV6_NODE, &exit_address_family_cmd);
   install_element (CONFIG_NODE, &key_chain_cmd);
   install_element (CONFIG_NODE, &route_map_cmd);
+  install_element (CONFIG_NODE, &vtysh_line_vty_cmd);
   install_element (KEYCHAIN_NODE, &key_cmd);
   install_element (KEYCHAIN_NODE, &key_chain_cmd);
   install_element (KEYCHAIN_KEY_NODE, &key_chain_cmd);
@@ -2014,44 +2145,19 @@
 
   /* "write terminal" command. */
   install_element (ENABLE_NODE, &vtysh_write_terminal_cmd);
-  install_element (CONFIG_NODE, &vtysh_write_terminal_cmd);
-  install_element (BGP_NODE, &vtysh_write_terminal_cmd);
-  install_element (BGP_VPNV4_NODE, &vtysh_write_terminal_cmd);
-  install_element (BGP_IPV4_NODE, &vtysh_write_terminal_cmd);
-  install_element (BGP_IPV4M_NODE, &vtysh_write_terminal_cmd);
-  install_element (BGP_IPV6_NODE, &vtysh_write_terminal_cmd);
-  install_element (RIP_NODE, &vtysh_write_terminal_cmd);
-  install_element (RIPNG_NODE, &vtysh_write_terminal_cmd);
-  install_element (OSPF_NODE, &vtysh_write_terminal_cmd);
-  install_element (OSPF6_NODE, &vtysh_write_terminal_cmd);
-  install_element (ISIS_NODE, &vtysh_write_terminal_cmd);
-  install_element (INTERFACE_NODE, &vtysh_write_terminal_cmd);
-  install_element (RMAP_NODE, &vtysh_write_terminal_cmd);
-  install_element (KEYCHAIN_NODE, &vtysh_write_terminal_cmd);
-  install_element (KEYCHAIN_KEY_NODE, &vtysh_write_terminal_cmd);
+ 
+  install_element (CONFIG_NODE, &vtysh_integrated_config_cmd);
+  install_element (CONFIG_NODE, &no_vtysh_integrated_config_cmd);
 
   /* "write memory" command. */
   install_element (ENABLE_NODE, &vtysh_write_memory_cmd);
-  install_element (CONFIG_NODE, &vtysh_write_memory_cmd);
-  install_element (BGP_NODE, &vtysh_write_memory_cmd);
-  install_element (BGP_VPNV4_NODE, &vtysh_write_memory_cmd);
-  install_element (BGP_IPV4_NODE, &vtysh_write_memory_cmd);
-  install_element (BGP_IPV4M_NODE, &vtysh_write_memory_cmd);
-  install_element (BGP_IPV6_NODE, &vtysh_write_memory_cmd);
-  install_element (RIP_NODE, &vtysh_write_memory_cmd);
-  install_element (RIPNG_NODE, &vtysh_write_memory_cmd);
-  install_element (OSPF_NODE, &vtysh_write_memory_cmd);
-  install_element (OSPF6_NODE, &vtysh_write_memory_cmd);
-  install_element (ISIS_NODE, &vtysh_write_memory_cmd);
-  install_element (INTERFACE_NODE, &vtysh_write_memory_cmd);
-  install_element (RMAP_NODE, &vtysh_write_memory_cmd);
-  install_element (KEYCHAIN_NODE, &vtysh_write_memory_cmd);
-  install_element (KEYCHAIN_KEY_NODE, &vtysh_write_memory_cmd);
 
   install_element (VIEW_NODE, &vtysh_terminal_length_cmd);
   install_element (ENABLE_NODE, &vtysh_terminal_length_cmd);
   install_element (VIEW_NODE, &vtysh_terminal_no_length_cmd);
   install_element (ENABLE_NODE, &vtysh_terminal_no_length_cmd);
+  install_element (VIEW_NODE, &vtysh_show_running_daemons_cmd);
+  install_element (ENABLE_NODE, &vtysh_show_running_daemons_cmd);
 
   install_element (VIEW_NODE, &vtysh_ping_cmd);
   install_element (VIEW_NODE, &vtysh_ping_ip_cmd);
@@ -2089,6 +2195,14 @@
   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);
+
+  install_element (CONFIG_NODE, &vtysh_service_password_encrypt_cmd);
+  install_element (CONFIG_NODE, &no_vtysh_service_password_encrypt_cmd);
+
+  install_element (CONFIG_NODE, &vtysh_password_cmd);
+  install_element (CONFIG_NODE, &vtysh_password_text_cmd);
+  install_element (CONFIG_NODE, &vtysh_enable_password_cmd);
+  install_element (CONFIG_NODE, &vtysh_enable_password_text_cmd);
+  install_element (CONFIG_NODE, &no_vtysh_enable_password_cmd);
+
 }
diff --git a/vtysh/vtysh.conf.sample b/vtysh/vtysh.conf.sample
index 29d6808..e2aa564 100644
--- a/vtysh/vtysh.conf.sample
+++ b/vtysh/vtysh.conf.sample
@@ -1,4 +1,7 @@
 !
-! vtysh sample configuratin file
+! Sample configuration file for vtysh.
 !
-!username kunihiro nopassword
+!service integrated-vtysh-conf
+!hostname quagga-router
+!username root nopassword
+!
diff --git a/vtysh/vtysh.h b/vtysh/vtysh.h
index 895c8c0..b632b6d 100644
--- a/vtysh/vtysh.h
+++ b/vtysh/vtysh.h
@@ -60,7 +60,7 @@
 
 int vtysh_config_from_file (struct vty *, FILE *);
 
-void vtysh_read_config (char *, char *);
+int vtysh_read_config (char *);
 
 void vtysh_config_parse (char *);
 
diff --git a/vtysh/vtysh_config.c b/vtysh/vtysh_config.c
index 86f5731..2687918 100644
--- a/vtysh/vtysh_config.c
+++ b/vtysh/vtysh_config.c
@@ -28,6 +28,8 @@
 
 vector configvec;
 
+extern int vtysh_writeconfig_integrated;
+
 struct config
 {
   /* Configuration node name. */
@@ -174,7 +176,8 @@
 		   strlen (" address-family ipv6")) == 0)
 	    config = config_get (BGP_IPV6_NODE, line);
 	  else if (config->index == RMAP_NODE ||
-	           config->index == INTERFACE_NODE )
+	           config->index == INTERFACE_NODE ||
+		   config->index == VTY_NODE)
 	    config_add_line_uniq (config->line, line);
 	  else
 	    config_add_line (config->line, line);
@@ -224,13 +227,24 @@
    	config = config_get (IP_NODE, line);
       else if (strncmp (line, "key", strlen ("key")) == 0)
 	config = config_get (KEYCHAIN_NODE, line);
+      else if (strncmp (line, "line", strlen ("line")) == 0)
+	config = config_get (VTY_NODE, line);
+      else if ( (strncmp (line, "ipv6 forwarding",
+		 strlen ("ipv6 forwarding")) == 0)
+	       || (strncmp (line, "ip forwarding",
+		   strlen ("ip forwarding")) == 0) )
+	config = config_get (FORWARDING_NODE, line);
+      else if (strncmp (line, "service", strlen ("service")) == 0)
+	config = config_get (SERVICE_NODE, line);
       else
 	{
 	  if (strncmp (line, "log", strlen ("log")) == 0
 	      || strncmp (line, "hostname", strlen ("hostname")) == 0
 	      || strncmp (line, "password", strlen ("password")) == 0
 	      || strncmp (line, "enable password",
-		          strlen ("enable password")) == 0)
+		          strlen ("enable password")) == 0
+	      || strncmp (line, "service", strlen ("service")) == 0
+	     )
 	    config_add_line_uniq (config_top, line);
 	  else
 	    config_add_line (config_top, line);
@@ -268,7 +282,8 @@
 #define NO_DELIMITER(I)  \
   ((I) == ACCESS_NODE || (I) == PREFIX_NODE || (I) == IP_NODE \
    || (I) == AS_LIST_NODE || (I) == COMMUNITY_LIST_NODE || \
-   (I) == ACCESS_IPV6_NODE || (I) == PREFIX_IPV6_NODE)
+   (I) == ACCESS_IPV6_NODE || (I) == PREFIX_IPV6_NODE \
+   || (I) == SERVICE_NODE)
 
 /* Display configuration to file pointer. */
 void
@@ -364,67 +379,40 @@
     }
 }
 
-/* Read up configuration file from file_name. */
-void
-vtysh_read_config (char *config_file,
-		   char *config_default_dir)
+/* Read up configuration file from config_default_dir. */
+int
+vtysh_read_config (char *config_default_dir)
 {
-  char *cwd;
   FILE *confp = NULL;
-  char *fullpath;
 
-  /* If -f flag specified. */
-  if (config_file != NULL)
-    {
-      if (! IS_DIRECTORY_SEP (config_file[0]))
-	{
-	  cwd = getcwd (NULL, MAXPATHLEN);
-	  fullpath = XMALLOC (MTYPE_TMP, 
-			      strlen (cwd) + strlen (config_file) + 2);
-	  sprintf (fullpath, "%s/%s", cwd, config_file);
-	}
-      else
-	fullpath = config_file;
-
-      confp = fopen (fullpath, "r");
-
-      if (confp == NULL)
-	{
-	  fprintf (stderr, "can't open configuration file [%s]\n", 
-		   config_file);
-	  exit(1);
-	}
-    }
-  else
-    {
-      /* No configuration specified from command line. Open system
-       * default file. */
-      confp = fopen (config_default_dir, "r");
-      if (confp == NULL)
-	{
-	  fprintf (stderr, "can't open configuration file [%s]\n",
-		   config_default_dir);
-	  exit (1);
-	}      
-      else
-	fullpath = config_default_dir;
-    }
+  confp = fopen (config_default_dir, "r");
+  if (confp == NULL)
+    return (1);
 
   vtysh_read_file (confp);
-
   fclose (confp);
+  host_config_set (config_default_dir);
 
-  host_config_set (fullpath);
+  return (0);
 }
 
+/* We don't write vtysh specific into file from vtysh. vtysh.conf should
+ * be edited by hand. So, we handle only "write terminal" case here and
+ * integrate vtysh specific conf with conf from daemons.
+ */
 void
-vtysh_config_write (FILE *fp)
+vtysh_config_write ()
 {
+  char *line;
   extern struct host host;
 
   if (host.name)
-    fprintf (fp, "hostname %s\n", host.name);
-  fprintf (fp, "!\n");
+    {
+      sprintf (line, "hostname %s", host.name);
+      vtysh_config_parse_line(line);
+    }
+  if (vtysh_writeconfig_integrated)
+    vtysh_config_parse_line ("service integrated-vtysh-config");
 }
 
 void
diff --git a/vtysh/vtysh_main.c b/vtysh/vtysh_main.c
index 223f0c6..5f7856c 100644
--- a/vtysh/vtysh_main.c
+++ b/vtysh/vtysh_main.c
@@ -40,16 +40,8 @@
 char *progname;
 
 /* Configuration file name and directory. */
-char *config_file = NULL;
 char config_default[] = SYSCONFDIR VTYSH_DEFAULT_CONFIG;
 
-/* Integrated configuration file. */
-char *integrate_file = NULL;
-char *integrate_current = NULL;
-#if 0
-char integrate_default[] = SYSCONFDIR INTEGRATE_DEFAULT_CONFIG;
-#endif
-
 /* Flag for indicate executing child command. */
 int execute_flag = 0;
 
@@ -143,7 +135,6 @@
 	    "Integrated shell for Quagga routing software suite. \n\n"\
 	    "-b, --boot               Execute boot startup configuration\n" \
 	    "-c, --command            Execute argument as command\n "\
-	    "-f, --config_file        Set configuration file name\n"\
 	    "-h, --help               Display this help and exit\n\n" \
 	    "Report bugs to %s\n", progname, ZEBRA_BUG_ADDRESS);
 
@@ -158,7 +149,6 @@
   { "eval",                 required_argument,       NULL, 'e'},
   { "command",              required_argument,       NULL, 'c'},
   { "help",                 no_argument,             NULL, 'h'},
-  { "config_file",          required_argument,       NULL, 'f'},
   { 0 }
 };
 
@@ -208,7 +198,7 @@
   /* Option handling. */
   while (1) 
     {
-      opt = getopt_long (argc, argv, "be:c:hf:", longopts, 0);
+      opt = getopt_long (argc, argv, "be:c:h", longopts, 0);
     
       if (opt == EOF)
 	break;
@@ -228,12 +218,6 @@
 	case 'h':
 	  usage (0);
 	  break;
-	/* XXX It isn't used in any way. */
-	case 'i':
-	  integrated_file = strdup (optarg);
-	case 'f':
-	  config_file = optarg;
-	  break;
 	default:
 	  usage (1);
 	  break;
@@ -259,7 +243,7 @@
   vtysh_connect_all ();
 
   /* Read vtysh configuration file. */
-  vtysh_read_config (config_file, config_default);
+  vtysh_read_config (config_default);
 
   /* If eval mode. */
   if (eval_flag)
@@ -271,8 +255,14 @@
   /* Boot startup configuration file. */
   if (boot_flag)
     {
-      vtysh_read_config (integrate_file, integrate_default);
-      exit (0);
+      if (vtysh_read_config (integrate_default))
+	{
+	  fprintf (stderr, "Can't open configuration file [%s]\n",
+		   integrate_default);
+	  exit (1);
+	}
+      else
+	exit (0);
     }
 
   vtysh_pager_init ();
@@ -283,6 +273,9 @@
 
   vtysh_auth ();
 
+  /* Enter into enable node. */
+  vtysh_execute ("enable");
+
   /* Preparation for longjmp() in sigtstp(). */
   sigsetjmp (jmpbuf, 1);
   jmpflag = 1;