summaryrefslogtreecommitdiffstats
path: root/svm/svm_test.c
blob: ab0b9e248e628d6a1d2d112b394b4677a8a9b197 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
 * Copyright (c) 2015 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/*
 *------------------------------------------------------------------
 * svm_test.c -- brain police
 *------------------------------------------------------------------
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <signal.h>
#include <pthread.h>
#include <unistd.h>
#include <time.h>
#include <fcntl.h>
#include <string.h>
#include <vppinfra/clib.h>
#include <vppinfra/vec.h>
#include <vppinfra/hash.h>
#include <vppinfra/bitmap.h>
#include <vppinfra/fifo.h>
#include <vppinfra/time.h>
#include <vppinfra/mheap.h>
#include <vppinfra/heap.h>
#include <vppinfra/pool.h>

#include "svm.h"


int
main (int argc, char **argv)
{
  svm_region_t *root_rp, *rp;
  svm_map_region_args_t *a = 0;

  vec_validate (a, 0);

  root_rp = svm_region_init ();

  ASSERT (root_rp);

  a->name = "/qvnet";
  a->size = (4 << 10);

  rp = svm_region_find_or_create (root_rp, a);

  ASSERT (rp);

  *((u32 *) rp->data_base) = 0xdeadbeef;
  svm_region_unmap (root_rp, rp);

  fformat (stdout, "exiting...\n");

  exit (0);
}

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */
ise, the poor slob won't know what happened. * Ask me how I know that... */ if (handle == 0) { clib_warning ("%s", dlerror ()); return 0; } pi->handle = handle; register_handle = dlsym (pi->handle, "vat_plugin_register"); if (register_handle == 0) { clib_warning ("%s: symbol vat_plugin_register not found", pi->name); dlclose (handle); return 0; } fp = register_handle; error = (*fp) (pm->vat_main); if (error) { clib_error_report (error); dlclose (handle); return 1; } clib_warning ("Loaded plugin: %s", pi->name); return 0; } static u8 ** split_plugin_path (plugin_main_t * pm) { int i; u8 **rv = 0; u8 *path = pm->plugin_path; u8 *this = 0; for (i = 0; i < vec_len (pm->plugin_path); i++) { if (path[i] != ':') { vec_add1 (this, path[i]); continue; } vec_add1 (this, 0); vec_add1 (rv, this); this = 0; } if (this) { vec_add1 (this, 0); vec_add1 (rv, this); } return rv; } int vat_load_new_plugins (plugin_main_t * pm) { DIR *dp; struct dirent *entry; struct stat statb; uword *p; plugin_info_t *pi; u8 **plugin_path; int i; plugin_path = split_plugin_path (pm); for (i = 0; i < vec_len (plugin_path); i++) { dp = opendir ((char *) plugin_path[i]); if (dp == 0) continue; while ((entry = readdir (dp))) { u8 *plugin_name; if (pm->plugin_name_filter) { int j; for (j = 0; j < vec_len (pm->plugin_name_filter); j++) if (entry->d_name[j] != pm->plugin_name_filter[j]) goto next; } plugin_name = format (0, "%s/%s%c", plugin_path[i], entry->d_name, 0); /* unreadable */ if (stat ((char *) plugin_name, &statb) < 0) { ignore: vec_free (plugin_name); continue; } /* a dir or other things which aren't plugins */ if (!S_ISREG (statb.st_mode)) goto ignore; p = hash_get_mem (pm->plugin_by_name_hash, plugin_name); if (p == 0) { vec_add2 (pm->plugin_info, pi, 1); pi->name = plugin_name; pi->file_info = statb; if (load_one_plugin (pm, pi)) { vec_free (plugin_name); _vec_len (pm->plugin_info) = vec_len (pm->plugin_info) - 1; continue; } clib_memset (pi, 0, sizeof (*pi)); hash_set_mem (pm->plugin_by_name_hash, plugin_name, pi - pm->plugin_info); } next: ; } closedir (dp); vec_free (plugin_path[i]); } vec_free (plugin_path); return 0; } #define QUOTE_(x) #x #define QUOTE(x) QUOTE_(x) /* * Load plugins from /usr/lib/vpp_api_test_plugins by default */ char *vat_plugin_path = "/usr/lib/vpp_api_test_plugins"; char *vat_plugin_name_filter = 0; int vat_plugin_init (vat_main_t * vam) { plugin_main_t *pm = &vat_plugin_main; pm->plugin_path = format (0, "%s%c", vat_plugin_path, 0); if (vat_plugin_name_filter) pm->plugin_name_filter = format (0, "%s%c", vat_plugin_name_filter, 0); pm->plugin_by_name_hash = hash_create_string (0, sizeof (uword)); pm->vat_main = vam; return vat_load_new_plugins (pm); } /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */