vlib: improve exec path search 78/35878/2
authorDamjan Marion <[email protected]>
Mon, 4 Apr 2022 16:48:11 +0000 (18:48 +0200)
committerFlorin Coras <[email protected]>
Mon, 4 Apr 2022 19:12:10 +0000 (19:12 +0000)
Fixes VPP invocation with relative path, i.e.:

$ bin/vpp unix interactive

Type: improvement
Change-Id: I0278710bb472b92e31389b2d28955c3d33550230
Signed-off-by: Damjan Marion <[email protected]>
src/vlib/cli.c
src/vlib/main.h
src/vlib/unix/main.c
src/vpp/app/version.c

index 2187d28..b7c4c00 100644 (file)
@@ -1097,7 +1097,7 @@ restart_cmd_fn (vlib_main_t * vm, unformat_input_t * input,
   /* *INDENT-ON* */
 
   /* Exec ourself */
-  execve (vgm->name, (char **) vm->argv, environ);
+  execve (vgm->name, (char **) vgm->argv, environ);
 
   return 0;
 }
index 18ec3be..2581d49 100644 (file)
@@ -220,7 +220,6 @@ typedef struct vlib_main_t
   volatile u32 queue_signal_pending;
   volatile u32 api_queue_nonempty;
   void (*queue_signal_callback) (struct vlib_main_t *);
-  u8 **argv;
 
   /* Top of (worker) dispatch loop callback */
   void (**volatile worker_thread_main_loop_callbacks)
@@ -283,6 +282,12 @@ typedef struct vlib_global_main_t
   /* Name for e.g. syslog. */
   char *name;
 
+  /* full path to main executable */
+  char *exec_path;
+
+  /* command line arguments */
+  u8 **argv;
+
   /* post-mortem callbacks */
   void (**post_mortem_callbacks) (void);
 
index ba1c9d1..0ebda24 100644 (file)
@@ -647,12 +647,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);
 
@@ -675,6 +676,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[])
 {
@@ -682,12 +687,27 @@ vlib_unix_main (int argc, char *argv[])
   vlib_main_t *vm = vlib_get_first_main (); /* one and only time for this! */
   unformat_input_t input;
   clib_error_t *e;
+  char buffer[PATH_MAX];
   int i;
 
   vec_validate_aligned (vgm->vlib_mains, 0, CLIB_CACHE_LINE_BYTES);
 
-  vm->argv = (u8 **) argv;
-  vgm->name = argv[0];
+  if ((i = readlink ("/proc/self/exe", buffer, sizeof (buffer) - 1)) > 0)
+    {
+      int j;
+      buffer[i] = 0;
+      vgm->exec_path = vec_new (char, i + 1);
+      clib_memcpy_fast (vgm->exec_path, buffer, i + 1);
+      for (j = i - 1; j > 0; j--)
+       if (buffer[j - 1] == '/')
+         break;
+      vgm->name = vec_new (char, i - j + 1);
+      clib_memcpy_fast (vgm->name, buffer + j, i - j + 1);
+    }
+  else
+    vgm->exec_path = vgm->name = argv[0];
+
+  vgm->argv = (u8 **) argv;
   vm->heap_base = clib_mem_get_heap ();
   vm->heap_aligned_base =
     (void *) (((uword) vm->heap_base) & ~(CLIB_CACHE_LINE_BYTES - 1));
@@ -700,7 +720,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);
@@ -712,7 +732,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 */ );
@@ -724,7 +744,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);
index db13c86..e6a7328 100644 (file)
@@ -59,7 +59,8 @@ show_vpe_version_command_fn (vlib_main_t * vm,
   int verbose = 0;
   int cmdline = 0;
   int indent = 2;
-  char **argv = (char **) vm->argv;
+  vlib_global_main_t *vgm = vlib_get_global_main ();
+  char **argv = (char **) vgm->argv;
 
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     {