if (a->name[0] == '/')
name_offset = 1;
- shm_name = format (0, "/%s-%s%c", a->root_path,
+ shm_name = format (0, "/%s-%s%c", &a->root_path[root_path_offset],
&a->name[name_offset], 0);
}
else
if (svm_fd >= 0)
{
- if (fchmod (svm_fd, 0770) < 0)
+ if (fchmod (svm_fd, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP) < 0)
clib_unix_warning ("segment chmod");
/* This turns out to fail harmlessly if the client starts first */
if (fchown (svm_fd, a->uid, a->gid) < 0)
}
}
-static void
+static int
svm_region_init_internal (svm_map_region_args_t * a)
{
svm_region_t *rp;
/* guard against klutz calls */
if (root_rp)
- return;
+ return -1;
root_rp_refcount++;
a->baseva += randomize_baseva;
rp = svm_map_region (a);
- ASSERT (rp);
+ if (!rp)
+ return -1;
region_lock (rp, 3);
vec_validate (mp, 0);
mp->name_hash = hash_create_string (0, sizeof (uword));
mp->root_path = a->root_path ? format (0, "%s%c", a->root_path, 0) : 0;
+ mp->uid = a->uid;
+ mp->gid = a->gid;
rp->data_base = mp;
svm_pop_heap (oldheap);
}
region_unlock (rp);
root_rp = rp;
+
+ return 0;
}
void
svm_region_init_internal (a);
}
-void
+int
svm_region_init_chroot (const char *root_path)
{
svm_map_region_args_t _a, *a = &_a;
a->uid = 0;
a->gid = 0;
- svm_region_init_internal (a);
+ return svm_region_init_internal (a);
}
void