]> git.proxmox.com Git - mirror_frr.git/blobdiff - vtysh/vtysh_main.c
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / vtysh / vtysh_main.c
index 04eb47feeb8a5529ed658a3d65c8bb3080f4fd9c..25b667252e51218dbc2df44974c0f591df524bae 100644 (file)
@@ -1,21 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
 /* Virtual terminal interface shell.
  * Copyright (C) 2000 Kunihiro Ishiguro
- *
- * This file is part of GNU Zebra.
- *
- * GNU Zebra is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2, or (at your option) any
- * later version.
- *
- * GNU Zebra is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * 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 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>
@@ -78,36 +63,58 @@ int execute_flag = 0;
 /* Flag to indicate if in user/unprivileged mode. */
 int user_mode;
 
-/* For sigsetjmp() & siglongjmp(). */
-static sigjmp_buf jmpbuf;
-
-/* Flag for avoid recursive siglongjmp() call. */
-static int jmpflag = 0;
-
 /* Master of threads. */
 struct thread_master *master;
 
 /* Command logging */
 FILE *logfile;
 
+static void vtysh_rl_callback(char *line_read)
+{
+       HIST_ENTRY *last;
+
+       rl_callback_handler_remove();
+
+       if (!line_read) {
+               vtysh_loop_exited = true;
+               return;
+       }
+
+       /* 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) {
+               using_history();
+               last = previous_history();
+               if (!last || strcmp(last->line, line_read) != 0) {
+                       add_history(line_read);
+                       append_history(1, history_file);
+               }
+       }
+
+       vtysh_execute(line_read);
+
+       if (!vtysh_loop_exited)
+               rl_callback_handler_install(vtysh_prompt(), vtysh_rl_callback);
+
+       free(line_read);
+}
+
 /* SIGTSTP handler.  This function care user's ^Z input. */
 static void sigtstp(int sig)
 {
+       rl_callback_handler_remove();
+
        /* Execute "end" command. */
        vtysh_execute("end");
 
+       if (!vtysh_loop_exited)
+               rl_callback_handler_install(vtysh_prompt(), vtysh_rl_callback);
+
        /* Initialize readline. */
        rl_initialize();
        printf("\n");
-
-       /* Check jmpflag for duplicate siglongjmp(). */
-       if (!jmpflag)
-               return;
-
-       jmpflag = 0;
-
-       /* Back to main command loop. */
-       siglongjmp(jmpbuf, 1);
+       rl_forced_update_display();
 }
 
 /* SIGINT handler.  This function care user's ^Z input.  */
@@ -207,34 +214,6 @@ struct option longopts[] = {
 
 bool vtysh_loop_exited;
 
-static void vtysh_rl_callback(char *line_read)
-{
-       HIST_ENTRY *last;
-
-       rl_callback_handler_remove();
-
-       if (!line_read) {
-               vtysh_loop_exited = true;
-               return;
-       }
-
-       /* 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) {
-               using_history();
-               last = previous_history();
-               if (!last || strcmp(last->line, line_read) != 0) {
-                       add_history(line_read);
-                       append_history(1, history_file);
-               }
-       }
-
-       vtysh_execute(line_read);
-
-       if (!vtysh_loop_exited)
-               rl_callback_handler_install(vtysh_prompt(), vtysh_rl_callback);
-}
-
 static struct thread *vtysh_rl_read_thread;
 
 static void vtysh_rl_read(struct thread *thread)
@@ -360,6 +339,7 @@ int main(int argc, char **argv, char **env)
        const char *pathspace_arg = NULL;
        char pathspace[MAXPATHLEN] = "";
        const char *histfile = NULL;
+       const char *histfile_env = getenv("VTYSH_HISTFILE");
 
        /* SUID: drop down to calling user & go back up when needed */
        elevuid = geteuid();
@@ -617,10 +597,8 @@ int main(int argc, char **argv, char **env)
         * VTYSH_HISTFILE is preferred over command line
         * argument (-H/--histfile).
         */
-       if (getenv("VTYSH_HISTFILE")) {
-               const char *file = getenv("VTYSH_HISTFILE");
-
-               strlcpy(history_file, file, sizeof(history_file));
+       if (histfile_env) {
+               strlcpy(history_file, histfile_env, sizeof(history_file));
        } else if (histfile) {
                strlcpy(history_file, histfile, sizeof(history_file));
        } else {
@@ -752,10 +730,6 @@ int main(int argc, char **argv, char **env)
 
        vtysh_add_timestamp = ts_flag;
 
-       /* Preparation for longjmp() in sigtstp(). */
-       sigsetjmp(jmpbuf, 1);
-       jmpflag = 1;
-
        /* Main command loop. */
        vtysh_rl_run();