From d1e17d00bb81659bf9e45caa62482bf7029d98f7 Mon Sep 17 00:00:00 2001
From: Dave Barach <dave@barachs.net>
Date: Thu, 21 Mar 2019 18:01:48 -0400
Subject: Ignore SIGTERM during the vpp boot sequence

Call setjmp and mark the setjmp context valid just prior to entering the
vpp main loop.

Change-Id: I26d5cd6a624cb2a497d81eb85a62365621b3b469
Signed-off-by: Dave Barach <dave@barachs.net>
---
 src/vlib/main.c      | 22 +++++++++++-----------
 src/vlib/unix/main.c |  7 ++++++-
 2 files changed, 17 insertions(+), 12 deletions(-)

(limited to 'src')

diff --git a/src/vlib/main.c b/src/vlib/main.c
index c80aa5ab192..ecadc19b1d5 100644
--- a/src/vlib/main.c
+++ b/src/vlib/main.c
@@ -2083,6 +2083,17 @@ vlib_main (vlib_main_t * volatile vm, unformat_input_t * input)
   vec_validate (vm->processing_rpc_requests, 0);
   _vec_len (vm->processing_rpc_requests) = 0;
 
+  if ((error = vlib_call_all_config_functions (vm, input, 0 /* is_early */ )))
+    goto done;
+
+  /* Call all main loop enter functions. */
+  {
+    clib_error_t *sub_error;
+    sub_error = vlib_call_all_main_loop_enter_functions (vm);
+    if (sub_error)
+      clib_error_report (sub_error);
+  }
+
   switch (clib_setjmp (&vm->main_loop_exit, VLIB_MAIN_LOOP_EXIT_NONE))
     {
     case VLIB_MAIN_LOOP_EXIT_NONE:
@@ -2097,17 +2108,6 @@ vlib_main (vlib_main_t * volatile vm, unformat_input_t * input)
       goto done;
     }
 
-  if ((error = vlib_call_all_config_functions (vm, input, 0 /* is_early */ )))
-    goto done;
-
-  /* Call all main loop enter functions. */
-  {
-    clib_error_t *sub_error;
-    sub_error = vlib_call_all_main_loop_enter_functions (vm);
-    if (sub_error)
-      clib_error_report (sub_error);
-  }
-
   vlib_main_loop (vm);
 
 done:
diff --git a/src/vlib/unix/main.c b/src/vlib/unix/main.c
index bf66407f0be..fe1f94d52f3 100755
--- a/src/vlib/unix/main.c
+++ b/src/vlib/unix/main.c
@@ -110,11 +110,16 @@ unix_signal_handler (int signum, siginfo_t * si, ucontext_t * uc)
     {
       /* these (caught) signals cause the application to exit */
     case SIGTERM:
-      if (unix_main.vlib_main->main_loop_exit_set)
+      /*
+       * Ignore SIGTERM if it's sent before we're ready.
+       */
+      if (unix_main.vlib_main && unix_main.vlib_main->main_loop_exit_set)
 	{
 	  syslog (LOG_ERR | LOG_DAEMON, "received SIGTERM, exiting...");
 	  unix_main.vlib_main->main_loop_exit_now = 1;
 	}
+      else
+	syslog (LOG_ERR | LOG_DAEMON, "IGNORE early SIGTERM...");
       break;
       /* fall through */
     case SIGQUIT:
-- 
cgit