split_point++;
}
vec_add1 (mkdir_arg, 0);
- if (mkdir ((char *) mkdir_arg, 0777) < 0 && errno != EEXIST)
- clib_unix_warning ("mkdir %s", mkdir_arg);
/* ready to descend another level */
mkdir_arg[vec_len(mkdir_arg)-1] = '-';
svm_pop_heap (oldheap);
}
+void vl_set_memory_root_path (char *name)
+{
+ api_main_t *am = &api_main;
+
+ am->root_path = name;
+}
+
int vl_map_shmem (char *region_name, int is_vlib)
{
svm_map_region_args_t *a = 0;
struct timespec ts, tsrem;
if (is_vlib == 0)
- svm_region_init();
+ svm_region_init_chroot(am->root_path);
vec_validate (a, 0);
clib_error_t *
vlibmemory_init (vlib_main_t * vm)
{
- /* Do this early, to avoid glibc malloc fubar */
- svm_region_init();
- return 0;
+ api_main_t *am = &api_main;
+ /* Normally NULL, can be set by cmd line "chroot {prefix foo}" */
+ svm_region_init_chroot (am->root_path);
+ return 0;
}
VLIB_INIT_FUNCTION (vlibmemory_init);
am->region_name = name;
}
-void vl_set_memory_root_path (char *name)
-{
- api_main_t *am = &api_main;
-
- am->root_path = name;
-}
-
static int range_compare (vl_api_msg_range_t * a0, vl_api_msg_range_t * a1)
{
int len0, len1, clen;
unformat_input_t _argv, *a = &_argv;
u8 **input_files = 0;
u8 *output_file = 0;
+ u8 *chroot_prefix;
u8 *this_input_file;
u8 interactive = 1;
u8 json_output = 0;
else if (unformat (a, "plugin_name_filter %s",
(u8 *)&vat_plugin_name_filter))
vec_add1 (vat_plugin_name_filter, 0);
- else {
+ else if (unformat (a, "chroot prefix %s", &chroot_prefix)) {
+ vl_set_memory_root_path ((char *)chroot_prefix);
+ } else {
fformat (stderr,
"%s: usage [in <f1> ... in <fn>] [out <fn>] [script] [json]\n");
exit (1);
VLIB_INIT_FUNCTION(vpe_api_init);
+static clib_error_t *
+chroot_config (vlib_main_t * vm, unformat_input_t * input)
+{
+ u8 * chroot_path;
+
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (input, "prefix %s", &chroot_path))
+ {
+ vec_add1 (chroot_path, 0);
+ vl_set_memory_root_path ((char *)chroot_path);
+ }
+ else
+ return clib_error_return (0, "unknown input `%U'",
+ format_unformat_error, input);
+ }
+ return 0;
+}
+VLIB_EARLY_CONFIG_FUNCTION (chroot_config, "chroot");
+
void * get_unformat_vnet_sw_interface (void)
{
return (void *) &unformat_vnet_sw_interface;
#include <vppinfra/heap.h>
#include <vppinfra/pool.h>
#include <vppinfra/format.h>
+#include <vlibapi/api.h>
+#include <vlibmemory/api.h>
#include <vlib/vlib.h>
#include <vlib/unix/unix.h>
gmon_init (vlib_main_t *vm)
{
gmon_main_t *gm = &gmon_main;
+ api_main_t * am = &api_main;
pid_t *swp = 0;
f64 *v = 0;
gm->vlib_main = vm;
- gm->svmdb_client = svmdb_map();
+ gm->svmdb_client = svmdb_map_chroot(am->root_path);
/* Find or create, set to zero */
vec_add1 (v, 0.0);