diff options
Diffstat (limited to 'src/vlib/unix/main.c')
-rw-r--r-- | src/vlib/unix/main.c | 168 |
1 files changed, 48 insertions, 120 deletions
diff --git a/src/vlib/unix/main.c b/src/vlib/unix/main.c index 4ef96652470..ee28ca8f1aa 100644 --- a/src/vlib/unix/main.c +++ b/src/vlib/unix/main.c @@ -39,7 +39,9 @@ #include <vlib/vlib.h> #include <vlib/unix/unix.h> #include <vlib/unix/plugin.h> +#include <vppinfra/unix.h> +#include <limits.h> #include <signal.h> #include <sys/ucontext.h> #include <syslog.h> @@ -70,12 +72,10 @@ unix_main_init (vlib_main_t * vm) return 0; } -/* *INDENT-OFF* */ VLIB_INIT_FUNCTION (unix_main_init) = { .runs_before = VLIB_INITS ("unix_input_init"), }; -/* *INDENT-ON* */ static int unsetup_signal_handlers (int sig) @@ -144,17 +144,6 @@ unix_signal_handler (int signum, siginfo_t * si, ucontext_t * uc) break; } -#ifdef CLIB_GCOV - /* - * Test framework sends SIGTERM, so we need to flush the - * code coverage stats here. - */ - { - void __gcov_flush (void); - __gcov_flush (); - } -#endif - /* Null terminate. */ vec_add1 (syslog_msg, 0); @@ -210,6 +199,7 @@ setup_signal_handlers (unix_main_t * um) { /* these signals take the default action */ case SIGKILL: + case SIGCONT: case SIGSTOP: case SIGUSR1: case SIGUSR2: @@ -246,14 +236,7 @@ unix_error_handler (void *arg, u8 * msg, int msg_len) } else { - char save = msg[msg_len - 1]; - - /* Null Terminate. */ - msg[msg_len - 1] = 0; - - syslog (LOG_ERR | LOG_DAEMON, "%s", msg); - - msg[msg_len - 1] = save; + syslog (LOG_ERR | LOG_DAEMON, "%.*s", msg_len, msg); } } @@ -266,20 +249,10 @@ vlib_unix_error_report (vlib_main_t * vm, clib_error_t * error) return; { - char save; - u8 *msg; - u32 msg_len; - - msg = error->what; - msg_len = vec_len (msg); - - /* Null Terminate. */ - save = msg[msg_len - 1]; - msg[msg_len - 1] = 0; - - syslog (LOG_ERR | LOG_DAEMON, "%s", msg); - - msg[msg_len - 1] = save; + u8 *msg = error->what; + u32 len = vec_len (msg); + int msg_len = (len > INT_MAX) ? INT_MAX : len; + syslog (LOG_ERR | LOG_DAEMON, "%.*s", msg_len, msg); } } @@ -288,98 +261,34 @@ startup_config_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) { unix_main_t *um = &unix_main; - u8 *buf = 0; - uword l, n = 1; + unformat_input_t in; vlib_process_suspend (vm, 2.0); while (um->unix_config_complete == 0) vlib_process_suspend (vm, 0.1); - if (um->startup_config_filename) + if (!um->startup_config_filename) { - unformat_input_t sub_input; - int fd; - struct stat s; - char *fn = (char *) um->startup_config_filename; - - fd = open (fn, O_RDONLY); - if (fd < 0) - { - clib_warning ("failed to open `%s'", fn); - return 0; - } + return 0; + } - if (fstat (fd, &s) < 0) - { - clib_warning ("failed to stat `%s'", fn); - bail: - close (fd); - return 0; - } + unformat_init_vector (&in, + format (0, "exec %s", um->startup_config_filename)); - if (!(S_ISREG (s.st_mode) || S_ISLNK (s.st_mode))) - { - clib_warning ("not a regular file: `%s'", fn); - goto bail; - } + vlib_cli_input (vm, &in, 0, 0); - while (n > 0) - { - l = vec_len (buf); - vec_resize (buf, 4096); - n = read (fd, buf + l, 4096); - if (n > 0) - { - _vec_len (buf) = l + n; - if (n < 4096) - break; - } - else - break; - } - if (um->log_fd && vec_len (buf)) - { - u8 *lv = 0; - lv = format (lv, "%U: ***** Startup Config *****\n%v", - format_timeval, 0 /* current bat-time */ , - 0 /* current bat-format */ , - buf); - { - int rv __attribute__ ((unused)) = - write (um->log_fd, lv, vec_len (lv)); - } - vec_reset_length (lv); - lv = format (lv, "%U: ***** End Startup Config *****\n", - format_timeval, 0 /* current bat-time */ , - 0 /* current bat-format */ ); - { - int rv __attribute__ ((unused)) = - write (um->log_fd, lv, vec_len (lv)); - } - vec_free (lv); - } + unformat_free (&in); - if (vec_len (buf)) - { - unformat_init_vector (&sub_input, buf); - vlib_cli_input (vm, &sub_input, 0, 0); - /* frees buf for us */ - unformat_free (&sub_input); - } - close (fd); - } return 0; } -/* *INDENT-OFF* */ VLIB_REGISTER_NODE (startup_config_node,static) = { .function = startup_config_process, .type = VLIB_NODE_TYPE_PROCESS, .name = "startup-config-process", .process_log2_n_stack_bytes = 18, }; -/* *INDENT-ON* */ static clib_error_t * unix_config (vlib_main_t * vm, unformat_input_t * input) @@ -480,9 +389,8 @@ unix_config (vlib_main_t * vm, unformat_input_t * input) { u8 *lv = 0; lv = format (0, "%U: ***** Start: PID %d *****\n", - format_timeval, 0 /* current bat-time */ , - 0 /* current bat-format */ , - getpid ()); + format_timeval, NULL /* current bat-format */, + 0 /* current bat-time */, getpid ()); { int rv __attribute__ ((unused)) = write (um->log_fd, lv, vec_len (lv)); @@ -518,6 +426,9 @@ unix_config (vlib_main_t * vm, unformat_input_t * input) if (error) return error; + if (chdir ((char *) um->runtime_dir) < 0) + return clib_error_return_unix (0, "chdir('%s')", um->runtime_dir); + error = setup_signal_handlers (um); if (error) return error; @@ -662,12 +573,13 @@ static uword thread0 (uword arg) { vlib_main_t *vm = (vlib_main_t *) arg; + vlib_global_main_t *vgm = vlib_get_global_main (); unformat_input_t input; int i; vlib_process_finish_switch_stack (vm); - unformat_init_command_line (&input, (char **) vm->argv); + unformat_init_command_line (&input, (char **) vgm->argv); i = vlib_main (vm, &input); unformat_free (&input); @@ -690,6 +602,10 @@ vlib_thread_stack_init (uword thread_index) return stack; } +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif + int vlib_unix_main (int argc, char *argv[]) { @@ -701,12 +617,24 @@ vlib_unix_main (int argc, char *argv[]) vec_validate_aligned (vgm->vlib_mains, 0, CLIB_CACHE_LINE_BYTES); - vm->argv = (u8 **) argv; - vgm->name = argv[0]; - vm->heap_base = clib_mem_get_heap (); - vm->heap_aligned_base = (void *) - (((uword) vm->heap_base) & ~(VLIB_FRAME_ALIGN - 1)); - ASSERT (vm->heap_base); + vgm->exec_path = (char *) os_get_exec_path (); + + if (vgm->exec_path) + { + for (i = vec_len (vgm->exec_path) - 1; i > 0; i--) + if (vgm->exec_path[i - 1] == '/') + break; + + vgm->name = 0; + + vec_add (vgm->name, vgm->exec_path + i, vec_len (vgm->exec_path) - i); + vec_add1 (vgm->exec_path, 0); + vec_add1 (vgm->name, 0); + } + else + vgm->exec_path = vgm->name = argv[0]; + + vgm->argv = (u8 **) argv; clib_time_init (&vm->clib_time); @@ -715,7 +643,7 @@ vlib_unix_main (int argc, char *argv[]) elog_init (vlib_get_elog_main (), vgm->configured_elog_ring_size); elog_enable_disable (vlib_get_elog_main (), 1); - unformat_init_command_line (&input, (char **) vm->argv); + unformat_init_command_line (&input, (char **) vgm->argv); if ((e = vlib_plugin_config (vm, &input))) { clib_error_report (e); @@ -727,7 +655,7 @@ vlib_unix_main (int argc, char *argv[]) if (i) return i; - unformat_init_command_line (&input, (char **) vm->argv); + unformat_init_command_line (&input, (char **) vgm->argv); if (vgm->init_functions_called == 0) vgm->init_functions_called = hash_create (0, /* value bytes */ 0); e = vlib_call_all_config_functions (vm, &input, 1 /* early */ ); @@ -739,7 +667,7 @@ vlib_unix_main (int argc, char *argv[]) unformat_free (&input); /* always load symbols, for signal handler and mheap memory get/put backtrace */ - clib_elf_main_init (vgm->name); + clib_elf_main_init (vgm->exec_path); vec_validate (vlib_thread_stacks, 0); vlib_thread_stack_init (0); |