]> git.proxmox.com Git - mirror_frr.git/blobdiff - vtysh/vtysh_main.c
bgpd/zebra/lib: EVPN support for asymmetric VxLan routing
[mirror_frr.git] / vtysh / vtysh_main.c
index 3dffa05ace0169a5bc357af2a56e7598eb830e31..8145bf364115bd9abfc3897f4b42acccdb852f7d 100644 (file)
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License
- * along with GNU Zebra; see the file COPYING.  If not, write to the Free
- * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.  
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <zebra.h>
@@ -37,6 +36,7 @@
 #include "memory.h"
 #include "linklist.h"
 #include "memory_vty.h"
+#include "libfrr.h"
 
 #include "vtysh/vtysh.h"
 #include "vtysh/vtysh_user.h"
@@ -54,7 +54,7 @@ char history_file[MAXPATHLEN];
 int execute_flag = 0;
 
 /* VTY Socket prefix */
-char * vty_sock_path = NULL;
+const char *vty_sock_path = NULL;
 
 /* For sigsetjmp() & siglongjmp(). */
 static sigjmp_buf jmpbuf;
@@ -72,582 +72,561 @@ struct thread_master *master;
 FILE *logfile;
 
 /* SIGTSTP handler.  This function care user's ^Z input. */
-static void
-sigtstp (int sig)
+static void sigtstp(int sig)
 {
-  /* Execute "end" command. */
-  vtysh_execute ("end");
-  
-  /* Initialize readline. */
-  rl_initialize ();
-  printf ("\n");
+       /* Execute "end" command. */
+       vtysh_execute("end");
 
-  /* Check jmpflag for duplicate siglongjmp(). */
-  if (! jmpflag)
-    return;
+       /* Initialize readline. */
+       rl_initialize();
+       printf("\n");
 
-  jmpflag = 0;
+       /* Check jmpflag for duplicate siglongjmp(). */
+       if (!jmpflag)
+               return;
 
-  /* Back to main command loop. */
-  siglongjmp (jmpbuf, 1);
+       jmpflag = 0;
+
+       /* Back to main command loop. */
+       siglongjmp(jmpbuf, 1);
 }
 
 /* SIGINT handler.  This function care user's ^Z input.  */
-static void
-sigint (int sig)
+static void sigint(int sig)
 {
-  /* Check this process is not child process. */
-  if (! execute_flag)
-    {
-      rl_initialize ();
-      printf ("\n");
-      rl_forced_update_display ();
-    }
+       /* Check this process is not child process. */
+       if (!execute_flag) {
+               rl_initialize();
+               printf("\n");
+               rl_forced_update_display();
+       }
 }
 
 /* Signale wrapper for vtysh. We don't use sigevent because
  * vtysh doesn't use threads. TODO */
-static void
-vtysh_signal_set (int signo, void (*func)(int))
+static void vtysh_signal_set(int signo, void (*func)(int))
 {
-  struct sigaction sig;
-  struct sigaction osig;
+       struct sigaction sig;
+       struct sigaction osig;
 
-  sig.sa_handler = func;
-  sigemptyset (&sig.sa_mask);
-  sig.sa_flags = 0;
+       sig.sa_handler = func;
+       sigemptyset(&sig.sa_mask);
+       sig.sa_flags = 0;
 #ifdef SA_RESTART
-  sig.sa_flags |= SA_RESTART;
+       sig.sa_flags |= SA_RESTART;
 #endif /* SA_RESTART */
 
-  sigaction (signo, &sig, &osig);
+       sigaction(signo, &sig, &osig);
 }
 
 /* Initialization of signal handles. */
-static void
-vtysh_signal_init (void)
+static void vtysh_signal_init(void)
 {
-  vtysh_signal_set (SIGINT, sigint);
-  vtysh_signal_set (SIGTSTP, sigtstp);
-  vtysh_signal_set (SIGPIPE, SIG_IGN);
+       vtysh_signal_set(SIGINT, sigint);
+       vtysh_signal_set(SIGTSTP, sigtstp);
+       vtysh_signal_set(SIGPIPE, SIG_IGN);
 }
 
 /* Help information display. */
-static void
-usage (int status)
+static void usage(int status)
 {
-  if (status != 0)
-    fprintf (stderr, "Try `%s --help' for more information.\n", progname);
-  else
-    printf ("Usage : %s [OPTION...]\n\n" \
-           "Integrated shell for FRR. \n\n" \
-           "-b, --boot               Execute boot startup configuration\n" \
-           "-c, --command            Execute argument as command\n" \
-           "-d, --daemon             Connect only to the specified daemon\n" \
-           "-f, --inputfile          Execute commands from specific file and exit\n" \
-           "-E, --echo               Echo prompt and command in -c mode\n" \
-           "-C, --dryrun             Check configuration for validity and exit\n" \
-           "-m, --markfile           Mark input file with context end\n" \
-           "    --vty_socket         Override vty socket path\n" \
-           "    --config_dir         Override config directory path\n" \
-           "-w, --writeconfig        Write integrated config (frr.conf) and exit\n" \
-           "-h, --help               Display this help and exit\n\n" \
-           "Note that multiple commands may be executed from the command\n" \
-           "line by passing multiple -c args, or by embedding linefeed\n" \
-           "characters in one or more of the commands.\n\n" \
-           "Report bugs to %s\n", progname, FRR_BUG_ADDRESS);
-
-  exit (status);
+       if (status != 0)
+               fprintf(stderr, "Try `%s --help' for more information.\n",
+                       progname);
+       else
+               printf("Usage : %s [OPTION...]\n\n"
+                      "Integrated shell for FRR. \n\n"
+                      "-b, --boot               Execute boot startup configuration\n"
+                      "-c, --command            Execute argument as command\n"
+                      "-d, --daemon             Connect only to the specified daemon\n"
+                      "-f, --inputfile          Execute commands from specific file and exit\n"
+                      "-E, --echo               Echo prompt and command in -c mode\n"
+                      "-C, --dryrun             Check configuration for validity and exit\n"
+                      "-m, --markfile           Mark input file with context end\n"
+                      "    --vty_socket         Override vty socket path\n"
+                      "    --config_dir         Override config directory path\n"
+                      "-w, --writeconfig        Write integrated config (frr.conf) and exit\n"
+                      "-h, --help               Display this help and exit\n\n"
+                      "Note that multiple commands may be executed from the command\n"
+                      "line by passing multiple -c args, or by embedding linefeed\n"
+                      "characters in one or more of the commands.\n\n"
+                      "Report bugs to %s\n",
+                      progname, FRR_BUG_ADDRESS);
+
+       exit(status);
 }
 
 /* VTY shell options, we use GNU getopt library. */
 #define OPTION_VTYSOCK 1000
 #define OPTION_CONFDIR 1001
-struct option longopts[] = 
-{
-  { "boot",                 no_argument,             NULL, 'b'},
-  /* For compatibility with older zebra/quagga versions */
-  { "eval",                 required_argument,       NULL, 'e'},
-  { "command",              required_argument,       NULL, 'c'},
-  { "daemon",               required_argument,       NULL, 'd'},
-  { "vty_socket",           required_argument,       NULL, OPTION_VTYSOCK},
-  { "config_dir",           required_argument,       NULL, OPTION_CONFDIR},
-  { "inputfile",            required_argument,       NULL, 'f'},
-  { "echo",                 no_argument,             NULL, 'E'},
-  { "dryrun",              no_argument,             NULL, 'C'},
-  { "help",                 no_argument,             NULL, 'h'},
-  { "noerror",             no_argument,             NULL, 'n'},
-  { "mark",                 no_argument,             NULL, 'm'},
-  { "writeconfig",         no_argument,             NULL, 'w'},
-  { 0 }
-};
+struct option longopts[] = {
+       {"boot", no_argument, NULL, 'b'},
+       /* For compatibility with older zebra/quagga versions */
+       {"eval", required_argument, NULL, 'e'},
+       {"command", required_argument, NULL, 'c'},
+       {"daemon", required_argument, NULL, 'd'},
+       {"vty_socket", required_argument, NULL, OPTION_VTYSOCK},
+       {"config_dir", required_argument, NULL, OPTION_CONFDIR},
+       {"inputfile", required_argument, NULL, 'f'},
+       {"echo", no_argument, NULL, 'E'},
+       {"dryrun", no_argument, NULL, 'C'},
+       {"help", no_argument, NULL, 'h'},
+       {"noerror", no_argument, NULL, 'n'},
+       {"mark", no_argument, NULL, 'm'},
+       {"writeconfig", no_argument, NULL, 'w'},
+       {0}};
 
 /* Read a string, and return a pointer to it.  Returns NULL on EOF. */
-static char *
-vtysh_rl_gets (void)
+static char *vtysh_rl_gets(void)
 {
-  HIST_ENTRY *last;
-  /* If the buffer has already been allocated, return the memory
-   * to the free pool. */
-  if (line_read)
-    {
-      free (line_read);
-      line_read = NULL;
-    }
-     
-  /* Get a line from the user.  Change prompt according to node.  XXX. */
-  line_read = readline (vtysh_prompt ());
-     
-  /* If the line has any text in it, save it on the history. But only if
-   * last command in history isn't the same one. */
-  if (line_read && *line_read)
-    {
-      using_history();
-      last = previous_history();
-      if (!last || strcmp (last->line, line_read) != 0) {
-       add_history (line_read);
-       append_history(1,history_file);
-      }
-    }
-     
-  return (line_read);
+       HIST_ENTRY *last;
+       /* If the buffer has already been allocated, return the memory
+        * to the free pool. */
+       if (line_read) {
+               free(line_read);
+               line_read = NULL;
+       }
+
+       /* Get a line from the user.  Change prompt according to node.  XXX. */
+       line_read = readline(vtysh_prompt());
+
+       /* If the line has any text in it, save it on the history. But only if
+        * last command in history isn't the same one. */
+       if (line_read && *line_read) {
+               using_history();
+               last = previous_history();
+               if (!last || strcmp(last->line, line_read) != 0) {
+                       add_history(line_read);
+                       append_history(1, history_file);
+               }
+       }
+
+       return (line_read);
 }
 
 static void log_it(const char *line)
 {
-  time_t t = time(NULL);
-  struct tm *tmp = localtime(&t);
-  const char *user = getenv("USER");
-  char tod[64];
+       time_t t = time(NULL);
+       struct tm *tmp = localtime(&t);
+       const char *user = getenv("USER");
+       char tod[64];
 
-  if (!user)
-    user = "boot";
+       if (!user)
+               user = "boot";
 
-  strftime(tod, sizeof tod, "%Y%m%d-%H:%M.%S", tmp);
-  
-  fprintf(logfile, "%s:%s %s\n", tod, user, line);
+       strftime(tod, sizeof tod, "%Y%m%d-%H:%M.%S", tmp);
+
+       fprintf(logfile, "%s:%s %s\n", tod, user, line);
 }
 
 static int flock_fd;
 
-static void
-vtysh_flock_config (const char *flock_file)
+static void vtysh_flock_config(const char *flock_file)
 {
-  int count = 0;
-
-  flock_fd = open (flock_file, O_RDONLY, 0644);
-  if (flock_fd < 0)
-    {
-      fprintf (stderr, "Unable to create lock file: %s, %s\n",
-              flock_file, safe_strerror (errno));
-      return;
-    }
-
-  while (count < 400 && (flock (flock_fd, LOCK_EX | LOCK_NB) < 0))
-    {
-      count++;
-      usleep (500000);
-    }
-
-  if (count >= 400)
-    fprintf(stderr, "Flock of %s failed, continuing this may cause issues\n",
-            flock_file);
+       int count = 0;
+
+       flock_fd = open(flock_file, O_RDONLY, 0644);
+       if (flock_fd < 0) {
+               fprintf(stderr, "Unable to create lock file: %s, %s\n",
+                       flock_file, safe_strerror(errno));
+               return;
+       }
+
+       while (count < 400 && (flock(flock_fd, LOCK_EX | LOCK_NB) < 0)) {
+               count++;
+               usleep(500000);
+       }
+
+       if (count >= 400)
+               fprintf(stderr,
+                       "Flock of %s failed, continuing this may cause issues\n",
+                       flock_file);
 }
 
-static void
-vtysh_unflock_config (void)
+static void vtysh_unflock_config(void)
 {
-  flock (flock_fd, LOCK_UN);
-  close (flock_fd);
+       flock(flock_fd, LOCK_UN);
+       close(flock_fd);
 }
 
 /* VTY shell main routine. */
-int
-main (int argc, char **argv, char **env)
+int main(int argc, char **argv, char **env)
 {
-  char *p;
-  int opt;
-  int dryrun = 0;
-  int boot_flag = 0;
-  const char *daemon_name = NULL;
-  const char *inputfile = NULL;
-  const char *vtysh_configfile_name;
-  struct cmd_rec {
-    char *line;
-    struct cmd_rec *next;
-  } *cmd = NULL;
-  struct cmd_rec *tail = NULL;
-  int echo_command = 0;
-  int no_error = 0;
-  int markfile = 0;
-  int writeconfig = 0;
-  int ret = 0;
-  char *homedir = NULL;
-
-  /* check for restricted functionality if vtysh is run setuid */
-  int restricted = (getuid() != geteuid()) || (getgid() != getegid());
-
-  /* Preserve name of myself. */
-  progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
-
-  /* if logging open now */
-  if ((p = getenv("VTYSH_LOG")) != NULL)
-      logfile = fopen(p, "a");
-
-  /* Option handling. */
-  while (1) 
-    {
-      opt = getopt_long (argc, argv, "be:c:d:nf:mEhCw", longopts, 0);
-    
-      if (opt == EOF)
-       break;
-
-      switch (opt) 
-       {
-       case 0:
-         break;
-       case 'b':
-         boot_flag = 1;
-         break;
-       case 'e':
-       case 'c':
-         {
-           struct cmd_rec *cr;
-           cr = XMALLOC(MTYPE_TMP, sizeof(*cr));
-           cr->line = optarg;
-           cr->next = NULL;
-           if (tail)
-             tail->next = cr;
-           else
-             cmd = cr;
-           tail = cr;
-         }
-         break;
-       case OPTION_VTYSOCK:
-         vty_sock_path = optarg;
-         break;
-       case OPTION_CONFDIR:
-      /* 
-       * Skip option for Config Directory if setuid
-       */
-      if (restricted) 
-        {
-          fprintf (stderr, "Overriding of Config Directory blocked for vtysh with setuid");
-          return 1;
-        }
-         /* 
-          * Overwrite location for vtysh.conf
-          */
-         vtysh_configfile_name = strrchr(VTYSH_DEFAULT_CONFIG, '/');
-         if (vtysh_configfile_name)
-           /* skip '/' */
-           vtysh_configfile_name++;
-         else
-           /*
-            * VTYSH_DEFAULT_CONFIG configured with relative path
-            * during config? Should really never happen for
-            * sensible config
-            */
-           vtysh_configfile_name = (char *) VTYSH_DEFAULT_CONFIG;
-         strlcpy(vtysh_config_always, optarg, sizeof(vtysh_config_always));
-         strlcat(vtysh_config_always, "/", sizeof(vtysh_config_always));
-         strlcat(vtysh_config_always, vtysh_configfile_name, 
-             sizeof(vtysh_config_always));
-         /* 
-          * Overwrite location for frr.conf
-          */
-         vtysh_configfile_name = strrchr(FRR_DEFAULT_CONFIG, '/');
-         if (vtysh_configfile_name)
-           /* skip '/' */
-           vtysh_configfile_name++;
-         else
-           /*
-            * FRR_DEFAULT_CONFIG configured with relative path
-            * during config? Should really never happen for
-            * sensible config
-            */
-           vtysh_configfile_name = (char *) FRR_DEFAULT_CONFIG;
-         strlcpy(quagga_config_default, optarg, sizeof(vtysh_config_always));
-         strlcat(quagga_config_default, "/", sizeof(vtysh_config_always));
-         strlcat(quagga_config_default, vtysh_configfile_name, 
-             sizeof(quagga_config_default));
-         break;
-       case 'd':
-         daemon_name = optarg;
-         break;
-       case 'f':
-         inputfile = optarg;
-         break;
-       case 'm':
-         markfile = 1;
-         break;
-       case 'n':
-         no_error = 1;
-         break;
-       case 'E':
-         echo_command = 1;
-         break;
-       case 'C':
-         dryrun = 1;
-         break;
-       case 'w':
-         writeconfig = 1;
-         break;
-       case 'h':
-         usage (0);
-         break;
-       default:
-         usage (1);
-         break;
+       char *p;
+       int opt;
+       int dryrun = 0;
+       int boot_flag = 0;
+       const char *daemon_name = NULL;
+       const char *inputfile = NULL;
+       const char *vtysh_configfile_name;
+       struct cmd_rec {
+               char *line;
+               struct cmd_rec *next;
+       } *cmd = NULL;
+       struct cmd_rec *tail = NULL;
+       int echo_command = 0;
+       int no_error = 0;
+       int markfile = 0;
+       int writeconfig = 0;
+       int ret = 0;
+       char *homedir = NULL;
+
+       /* check for restricted functionality if vtysh is run setuid */
+       int restricted = (getuid() != geteuid()) || (getgid() != getegid());
+
+       /* Preserve name of myself. */
+       progname = ((p = strrchr(argv[0], '/')) ? ++p : argv[0]);
+
+       /* if logging open now */
+       if ((p = getenv("VTYSH_LOG")) != NULL)
+               logfile = fopen(p, "a");
+
+       /* Option handling. */
+       while (1) {
+               opt = getopt_long(argc, argv, "be:c:d:nf:mEhCw", longopts, 0);
+
+               if (opt == EOF)
+                       break;
+
+               switch (opt) {
+               case 0:
+                       break;
+               case 'b':
+                       boot_flag = 1;
+                       break;
+               case 'e':
+               case 'c': {
+                       struct cmd_rec *cr;
+                       cr = XMALLOC(MTYPE_TMP, sizeof(*cr));
+                       cr->line = optarg;
+                       cr->next = NULL;
+                       if (tail)
+                               tail->next = cr;
+                       else
+                               cmd = cr;
+                       tail = cr;
+               } break;
+               case OPTION_VTYSOCK:
+                       vty_sock_path = optarg;
+                       break;
+               case OPTION_CONFDIR:
+                       /*
+                        * Skip option for Config Directory if setuid
+                        */
+                       if (restricted) {
+                               fprintf(stderr,
+                                       "Overriding of Config Directory blocked for vtysh with setuid");
+                               return 1;
+                       }
+                       /*
+                        * Overwrite location for vtysh.conf
+                        */
+                       vtysh_configfile_name =
+                               strrchr(VTYSH_DEFAULT_CONFIG, '/');
+                       if (vtysh_configfile_name)
+                               /* skip '/' */
+                               vtysh_configfile_name++;
+                       else
+                               /*
+                                * VTYSH_DEFAULT_CONFIG configured with relative
+                                * path
+                                * during config? Should really never happen for
+                                * sensible config
+                                */
+                               vtysh_configfile_name =
+                                       (char *)VTYSH_DEFAULT_CONFIG;
+                       strlcpy(vtysh_config_always, optarg,
+                               sizeof(vtysh_config_always));
+                       strlcat(vtysh_config_always, "/",
+                               sizeof(vtysh_config_always));
+                       strlcat(vtysh_config_always, vtysh_configfile_name,
+                               sizeof(vtysh_config_always));
+                       /*
+                        * Overwrite location for frr.conf
+                        */
+                       vtysh_configfile_name =
+                               strrchr(FRR_DEFAULT_CONFIG, '/');
+                       if (vtysh_configfile_name)
+                               /* skip '/' */
+                               vtysh_configfile_name++;
+                       else
+                               /*
+                                * FRR_DEFAULT_CONFIG configured with relative
+                                * path
+                                * during config? Should really never happen for
+                                * sensible config
+                                */
+                               vtysh_configfile_name =
+                                       (char *)FRR_DEFAULT_CONFIG;
+                       strlcpy(quagga_config_default, optarg,
+                               sizeof(vtysh_config_always));
+                       strlcat(quagga_config_default, "/",
+                               sizeof(vtysh_config_always));
+                       strlcat(quagga_config_default, vtysh_configfile_name,
+                               sizeof(quagga_config_default));
+                       break;
+               case 'd':
+                       daemon_name = optarg;
+                       break;
+               case 'f':
+                       inputfile = optarg;
+                       break;
+               case 'm':
+                       markfile = 1;
+                       break;
+               case 'n':
+                       no_error = 1;
+                       break;
+               case 'E':
+                       echo_command = 1;
+                       break;
+               case 'C':
+                       dryrun = 1;
+                       break;
+               case 'w':
+                       writeconfig = 1;
+                       break;
+               case 'h':
+                       usage(0);
+                       break;
+               default:
+                       usage(1);
+                       break;
+               }
+       }
+
+       if (!vty_sock_path)
+               vty_sock_path = frr_vtydir;
+
+       if (markfile + writeconfig + dryrun + boot_flag > 1) {
+               fprintf(stderr,
+                       "Invalid combination of arguments.  Please specify at "
+                       "most one of:\n\t-b, -C, -m, -w\n");
+               return 1;
+       }
+       if (inputfile && (writeconfig || boot_flag)) {
+               fprintf(stderr,
+                       "WARNING: Combinining the -f option with -b or -w is "
+                       "NOT SUPPORTED since its\nresults are inconsistent!\n");
+       }
+
+       /* Initialize user input buffer. */
+       line_read = NULL;
+       setlinebuf(stdout);
+
+       /* Signal and others. */
+       vtysh_signal_init();
+
+       /* Make vty structure and register commands. */
+       vtysh_init_vty();
+       vtysh_init_cmd();
+       vtysh_user_init();
+       vtysh_config_init();
+
+       vty_init_vtysh();
+
+       /* Read vtysh configuration file before connecting to daemons. */
+       vtysh_read_config(vtysh_config_always);
+
+       if (markfile) {
+               if (!inputfile) {
+                       fprintf(stderr,
+                               "-f option MUST be specified with -m option\n");
+                       return (1);
+               }
+               return (vtysh_mark_file(inputfile));
+       }
+
+       /* Start execution only if not in dry-run mode */
+       if (dryrun && !cmd) {
+               if (inputfile) {
+                       ret = vtysh_read_config(inputfile);
+               } else {
+                       ret = vtysh_read_config(quagga_config_default);
+               }
+
+               exit(ret);
        }
-    }
-
-  if (markfile + writeconfig + dryrun + boot_flag > 1)
-    {
-      fprintf (stderr, "Invalid combination of arguments.  Please specify at "
-                       "most one of:\n\t-b, -C, -m, -w\n");
-      return 1;
-    }
-  if (inputfile && (writeconfig || boot_flag))
-    {
-      fprintf (stderr, "WARNING: Combinining the -f option with -b or -w is "
-                       "NOT SUPPORTED since its\nresults are inconsistent!\n");
-    }
-
-  /* Initialize user input buffer. */
-  line_read = NULL;
-  setlinebuf(stdout);
-
-  /* Signal and others. */
-  vtysh_signal_init ();
-
-  /* Make vty structure and register commands. */
-  vtysh_init_vty ();
-  vtysh_init_cmd ();
-  vtysh_user_init ();
-  vtysh_config_init ();
-
-  vty_init_vtysh ();
-
-  /* Read vtysh configuration file before connecting to daemons. */
-  vtysh_read_config(vtysh_config_always);
-
-  if (markfile)
-    {
-      if (!inputfile)
-       {
-         fprintf(stderr, "-f option MUST be specified with -m option\n");
-         return(1);
+
+       if (dryrun && cmd) {
+               vtysh_execute("enable");
+               while (cmd) {
+                       struct cmd_rec *cr;
+                       char *cmdnow = cmd->line, *next;
+                       do {
+                               next = strchr(cmdnow, '\n');
+                               if (next)
+                                       *next++ = '\0';
+
+                               if (echo_command)
+                                       printf("%s%s\n", vtysh_prompt(),
+                                              cmdnow);
+
+                               ret = vtysh_execute_no_pager(cmdnow);
+                               if (!no_error
+                                   && !(ret == CMD_SUCCESS
+                                        || ret == CMD_SUCCESS_DAEMON
+                                        || ret == CMD_WARNING))
+                                       exit(1);
+                       } while ((cmdnow = next) != NULL);
+
+                       cr = cmd;
+                       cmd = cmd->next;
+                       XFREE(MTYPE_TMP, cr);
+               }
+               exit(ret);
        }
-      return(vtysh_mark_file(inputfile));
-    }
-
-  /* Start execution only if not in dry-run mode */
-  if (dryrun && !cmd)
-    {
-      if (inputfile)
-       {
-         ret = vtysh_read_config(inputfile);
+
+       /* Ignore error messages */
+       if (no_error) {
+               if (freopen("/dev/null", "w", stdout) == NULL) {
+                       fprintf(stderr,
+                               "Exiting: Failed to duplicate stdout with -n option");
+                       exit(1);
+               }
        }
-      else
-       {
-         ret = vtysh_read_config(quagga_config_default);
+
+       /* Make sure we pass authentication before proceeding. */
+       vtysh_auth();
+
+       /* Do not connect until we have passed authentication. */
+       if (vtysh_connect_all(daemon_name) <= 0) {
+               fprintf(stderr, "Exiting: failed to connect to any daemons.\n");
+               if (no_error)
+                       exit(0);
+               else
+                       exit(1);
        }
 
-      exit(ret);
-    }
-
-  if (dryrun && cmd)
-    {
-      vtysh_execute ("enable");
-      while (cmd)
-        {
-          struct cmd_rec *cr;
-          char *cmdnow = cmd->line, *next;
-          do
-            {
-              next = strchr(cmdnow, '\n');
-              if (next)
-                *next++ = '\0';
-
-              if (echo_command)
-                printf("%s%s\n", vtysh_prompt(), cmdnow);
-
-              ret = vtysh_execute_no_pager(cmdnow);
-              if (!no_error &&
-                  ! (ret == CMD_SUCCESS ||
-                     ret == CMD_SUCCESS_DAEMON ||
-                     ret == CMD_WARNING))
-                exit(1);
-            }
-          while ((cmdnow = next) != NULL);
-
-          cr = cmd;
-          cmd = cmd->next;
-          XFREE(MTYPE_TMP, cr);
-        }
-      exit(ret);
-    }
-
-  /* Ignore error messages */
-  if (no_error)
-    {
-      if (freopen("/dev/null", "w", stdout) == NULL)
-       {
-         fprintf(stderr, "Exiting: Failed to duplicate stdout with -n option");
-         exit(1);
+       if (writeconfig) {
+               vtysh_execute("enable");
+               return vtysh_write_config_integrated();
        }
-    }
-
-  /* Make sure we pass authentication before proceeding. */
-  vtysh_auth ();
-
-  /* Do not connect until we have passed authentication. */
-  if (vtysh_connect_all (daemon_name) <= 0)
-    {
-      fprintf(stderr, "Exiting: failed to connect to any daemons.\n");
-      if (no_error)
-        exit(0);
-      else
-        exit(1);
-    }
-
-  if (writeconfig)
-    {
-      vtysh_execute ("enable");
-      return vtysh_write_config_integrated ();
-    }
-
-  if (inputfile)
-    {
-      vtysh_flock_config (inputfile);
-      ret = vtysh_read_config(inputfile);
-      vtysh_unflock_config ();
-      exit(ret);
-    }
-
-  /*
-   * 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 (inputfile) {
+               vtysh_flock_config(inputfile);
+               ret = vtysh_read_config(inputfile);
+               vtysh_unflock_config();
+               exit(ret);
        }
-    }
-
-  /* If eval mode. */
-  if (cmd)
-    {
-      /* Enter into enable node. */
-      vtysh_execute ("enable");
-
-      while (cmd != NULL)
-        {
-         int ret;
-         char *eol;
-
-         while ((eol = strchr(cmd->line, '\n')) != NULL)
-           {
-             *eol = '\0';
-
-             add_history (cmd->line);
-             append_history (1, history_file);
-
-             if (echo_command)
-               printf("%s%s\n", vtysh_prompt(), cmd->line);
-             
-             if (logfile)
-               log_it(cmd->line);
-
-             ret = vtysh_execute_no_pager(cmd->line);
-             if (!no_error &&
-                 ! (ret == CMD_SUCCESS ||
-                    ret == CMD_SUCCESS_DAEMON ||
-                    ret == CMD_WARNING))
-               exit(1);
-
-             cmd->line = eol+1;
-           }
-
-         add_history (cmd->line);
-         append_history (1, history_file);
-
-         if (echo_command)
-           printf("%s%s\n", vtysh_prompt(), cmd->line);
-
-         if (logfile)
-           log_it(cmd->line);
-
-         ret = vtysh_execute_no_pager(cmd->line);
-         if (!no_error &&
-             ! (ret == CMD_SUCCESS ||
-                ret == CMD_SUCCESS_DAEMON ||
-                ret == CMD_WARNING))
-           exit(1);
-
-         {
-           struct cmd_rec *cr;
-           cr = cmd;
-           cmd = cmd->next;
-           XFREE(MTYPE_TMP, cr);
-         }
-        }
-
-      history_truncate_file(history_file,1000);
-      exit (0);
-    }
-
-  /* Boot startup configuration file. */
-  if (boot_flag)
-    {
-      vtysh_flock_config (quagga_config);
-      int ret = vtysh_read_config (quagga_config);
-      vtysh_unflock_config ();
-      if (ret)
-        {
-         fprintf (stderr, "Configuration file[%s] processing failure: %d\n",
-                  quagga_config, ret);
-         if (no_error)
-           exit (0);
-         else
-           exit (ret);
+
+       /*
+        * 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) {
+               /* Enter into enable node. */
+               vtysh_execute("enable");
+
+               while (cmd != NULL) {
+                       int ret;
+                       char *eol;
+
+                       while ((eol = strchr(cmd->line, '\n')) != NULL) {
+                               *eol = '\0';
+
+                               add_history(cmd->line);
+                               append_history(1, history_file);
+
+                               if (echo_command)
+                                       printf("%s%s\n", vtysh_prompt(),
+                                              cmd->line);
+
+                               if (logfile)
+                                       log_it(cmd->line);
+
+                               ret = vtysh_execute_no_pager(cmd->line);
+                               if (!no_error
+                                   && !(ret == CMD_SUCCESS
+                                        || ret == CMD_SUCCESS_DAEMON
+                                        || ret == CMD_WARNING))
+                                       exit(1);
+
+                               cmd->line = eol + 1;
+                       }
+
+                       add_history(cmd->line);
+                       append_history(1, history_file);
+
+                       if (echo_command)
+                               printf("%s%s\n", vtysh_prompt(), cmd->line);
+
+                       if (logfile)
+                               log_it(cmd->line);
+
+                       ret = vtysh_execute_no_pager(cmd->line);
+                       if (!no_error
+                           && !(ret == CMD_SUCCESS || ret == CMD_SUCCESS_DAEMON
+                                || ret == CMD_WARNING))
+                               exit(1);
+
+                       {
+                               struct cmd_rec *cr;
+                               cr = cmd;
+                               cmd = cmd->next;
+                               XFREE(MTYPE_TMP, cr);
+                       }
+               }
+
+               history_truncate_file(history_file, 1000);
+               exit(0);
+       }
+
+       /* Boot startup configuration file. */
+       if (boot_flag) {
+               vtysh_flock_config(quagga_config);
+               int ret = vtysh_read_config(quagga_config);
+               vtysh_unflock_config();
+               if (ret) {
+                       fprintf(stderr,
+                               "Configuration file[%s] processing failure: %d\n",
+                               quagga_config, ret);
+                       if (no_error)
+                               exit(0);
+                       else
+                               exit(ret);
+               } else
+                       exit(0);
        }
-      else
-       exit (0);
-    }
 
-  vtysh_pager_init ();
+       vtysh_pager_init();
 
-  vtysh_readline_init ();
+       vtysh_readline_init();
 
-  vty_hello (vty);
+       vty_hello(vty);
 
-  /* Enter into enable node. */
-  vtysh_execute ("enable");
+       /* Enter into enable node. */
+       vtysh_execute("enable");
 
-  /* Preparation for longjmp() in sigtstp(). */
-  sigsetjmp (jmpbuf, 1);
-  jmpflag = 1;
+       /* Preparation for longjmp() in sigtstp(). */
+       sigsetjmp(jmpbuf, 1);
+       jmpflag = 1;
 
-  /* Main command loop. */
-  while (vtysh_rl_gets ())
-    vtysh_execute (line_read);
+       /* Main command loop. */
+       while (vtysh_rl_gets())
+               vtysh_execute(line_read);
 
-  history_truncate_file(history_file,1000);
-  printf ("\n");
+       history_truncate_file(history_file, 1000);
+       printf("\n");
 
-  /* Rest in peace. */
-  exit (0);
+       /* Rest in peace. */
+       exit(0);
 }