#include "vat.h"
#include "plugin.h"
#include <signal.h>
+#include <limits.h>
vat_main_t vat_main;
connect_to_vpe (char *name)
{
vat_main_t *vam = &vat_main;
- api_main_t *am = &api_main;
+ api_main_t *am = vlibapi_get_main ();
if (vl_client_connect_to_vlib ("/vpe-api", name, 32) < 0)
return -1;
return 0;
}
-vlib_main_t vlib_global_main;
-vlib_main_t **vlib_mains;
+/* *INDENT-OFF* */
+
+vlib_global_main_t vlib_global_main;
+
void
vlib_cli_output (struct vlib_main_t *vm, char *fmt, ...)
{
clib_warning ("BUG");
}
-
static u8 *
format_api_error (u8 * s, va_list * args)
{
this_cmd =
(u8 *) clib_macro_eval (&vam->macro_main, (i8 *) vam->inbuf,
- 1 /* complain */ );
+ 1 /* complain */ ,
+ 0 /* level */ ,
+ 8 /* max_level */ );
if (vam->exec_mode == 0)
{
if (vam->client_index_invalid)
{
vat_main_t *vam = &vat_main;
- api_main_t *am = &api_main;
+ api_main_t *am = vlibapi_get_main ();
vam->vl_input_queue = am->shmem_hdr->vl_input_queue;
vam->my_client_index = am->my_client_index;
}
static i8 *
-eval_current_file (macro_main_t * mm, i32 complain)
+eval_current_file (clib_macro_main_t * mm, i32 complain)
{
vat_main_t *vam = &vat_main;
return ((i8 *) format (0, "%s%c", vam->current_file, 0));
}
static i8 *
-eval_current_line (macro_main_t * mm, i32 complain)
+eval_current_line (clib_macro_main_t * mm, i32 complain)
{
vat_main_t *vam = &vat_main;
return ((i8 *) format (0, "%d%c", vam->input_line_number, 0));
case SIGSTOP:
case SIGUSR1:
case SIGUSR2:
+ case SIGPROF:
continue;
/* ignore SIGPIPE, SIGCHLD */
case SIGPIPE:
case SIGCHLD:
+ case SIGWINCH:
sa.sa_sigaction = (void *) SIG_IGN;
break;
}
}
+static void
+vat_find_plugin_path ()
+{
+ char *p, path[PATH_MAX];
+ int rv;
+ u8 *s;
+
+ /* find executable path */
+ if ((rv = readlink ("/proc/self/exe", path, PATH_MAX - 1)) == -1)
+ return;
+
+ /* readlink doesn't provide null termination */
+ path[rv] = 0;
+
+ /* strip filename */
+ if ((p = strrchr (path, '/')) == 0)
+ return;
+ *p = 0;
+
+ /* strip bin/ */
+ if ((p = strrchr (path, '/')) == 0)
+ return;
+ *p = 0;
+
+ s = format (0, "%s/lib/" CLIB_TARGET_TRIPLET "/vpp_api_test_plugins:"
+ "%s/lib/vpp_api_test_plugins", path, path);
+ vec_add1 (s, 0);
+ vat_plugin_path = (char *) s;
+}
+
+static void
+load_features (void)
+{
+ vat_registered_features_t *f;
+ vat_main_t *vam = &vat_main;
+ clib_error_t *error;
+
+ f = vam->feature_function_registrations;
+
+ while (f)
+ {
+ error = f->function (vam);
+ if (error)
+ {
+ clib_warning ("INIT FAILED");
+ }
+ f = f->next;
+ }
+}
+
+static inline clib_error_t *
+call_init_exit_functions_internal (vlib_main_t *vm,
+ _vlib_init_function_list_elt_t **headp,
+ int call_once, int do_sort, int is_global)
+{
+ vlib_global_main_t *vgm = vlib_get_global_main ();
+ clib_error_t *error = 0;
+ _vlib_init_function_list_elt_t *i;
+
+ ASSERT (is_global == 1);
+
+#if 0
+ /* Not worth copying the topological sort code */
+ if (do_sort && (error = vlib_sort_init_exit_functions (headp)))
+ return (error);
+#endif
+
+ i = *headp;
+ while (i)
+ {
+ if (call_once && !hash_get (vgm->init_functions_called, i->f))
+ {
+ if (call_once)
+ hash_set1 (vgm->init_functions_called, i->f);
+ error = i->f (vm);
+ if (error)
+ return error;
+ }
+ i = i->next_init_function;
+ }
+ return error;
+}
+
+clib_error_t *
+vlib_call_init_exit_functions (vlib_main_t *vm,
+ _vlib_init_function_list_elt_t **headp,
+ int call_once, int is_global)
+{
+ return call_init_exit_functions_internal (vm, headp, call_once,
+ 1 /* do_sort */, is_global);
+}
+
int
main (int argc, char **argv)
{
+ vlib_global_main_t *vgm = vlib_get_global_main ();
vat_main_t *vam = &vat_main;
unformat_input_t _argv, *a = &_argv;
u8 **input_files = 0;
u8 json_output = 0;
int i;
f64 timeout;
+ clib_error_t *error;
+ vlib_main_t *vm;
clib_mem_init_thread_safe (0, 128 << 20);
+ vlib_main_init ();
+ vm = vlib_get_first_main ();
clib_macro_init (&vam->macro_main);
clib_macro_add_builtin (&vam->macro_main, "current_file",
vec_validate (vam->cmd_reply, 0);
vec_reset_length (vam->cmd_reply);
+ vat_find_plugin_path ();
+
unformat_init_command_line (a, argv);
while (unformat_check_input (a) != UNFORMAT_END_OF_INPUT)
vec_validate (vam->inbuf, 4096);
+ load_features ();
+
vam->current_file = (u8 *) "plugin-init";
vat_plugin_init (vam);
+ /* Set up the init function hash table */
+ vgm->init_functions_called = hash_create (0, 0);
+
+ /* Execute plugin init and api_init functions */
+ error = vlib_call_init_exit_functions (vm, &vgm->init_function_registrations,
+ 1 /* call once */, 1 /* is_global*/);
+
+ if (error)
+ clib_error_report (error);
+
+ error =
+ vlib_call_init_exit_functions (vm, &vgm->api_init_function_registrations,
+ 1 /* call_once */, 1 /* is_global */);
+
+ if (error)
+ clib_error_report (error);
+
for (i = 0; i < vec_len (input_files); i++)
{
vam->ifp = fopen ((char *) input_files[i], "r");