{
uword size = va_arg (*args, uword);
- if (size >= (1>>20)) {
+ if (size >= (1<<20)) {
s = format (s, "(%d mb)", size >> 20);
- } else if (size >= (1>>10)) {
+ } else if (size >= (1<<10)) {
s = format (s, "(%d kb)", size >> 10);
} else {
s = format (s, "(%d bytes)", size);
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_fd = shm_open((char *) shm_name, O_RDWR | O_CREAT | O_EXCL, 0777);
if (svm_fd >= 0) {
+ if (fchmod (svm_fd, 0770) < 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)
+ clib_unix_warning ("segment chown [ok if client starts first]");
vec_free(shm_name);
}
}
-static void svm_region_init_internal (char *root_path)
+static void svm_region_init_internal (char *root_path, int uid, int gid)
{
svm_region_t *rp;
- svm_map_region_args_t *a=0;
+ svm_map_region_args_t _a, *a=&_a;
u64 ticks = clib_cpu_time_now();
uword randomize_baseva;
/* guard against klutz calls */
- root_rp_refcount++;
if (root_rp)
return;
+ root_rp_refcount++;
+
atexit(svm_mutex_cleanup);
/* Randomize the shared-VM base at init time */
else
randomize_baseva = (ticks & 3) * MMAP_PAGESIZE;
- vec_validate(a,0);
+ memset (a, 0, sizeof (*a));
a->root_path = root_path;
a->name = SVM_GLOBAL_REGION_NAME;
a->baseva = SVM_GLOBAL_REGION_BASEVA + randomize_baseva;
a->size = SVM_GLOBAL_REGION_SIZE;
a->flags = SVM_FLAGS_NODATA;
+ a->uid = uid;
+ a->gid = gid;
rp = svm_map_region (a);
ASSERT(rp);
svm_pop_heap (oldheap);
}
region_unlock(rp);
- vec_free (a);
root_rp = rp;
}
void svm_region_init (void)
{
- svm_region_init_internal (0);
+ svm_region_init_internal (0, 0 /* uid */, 0 /* gid */);
}
void svm_region_init_chroot (char *root_path)
{
- svm_region_init_internal (root_path);
+ svm_region_init_internal (root_path, 0 /* uid */, 0 /* gid */);
+}
+
+void svm_region_init_chroot_uid_gid (char *root_path, int uid, int gid)
+{
+ svm_region_init_internal (root_path, uid, gid);
}
void *svm_region_find_or_create (svm_map_region_args_t *a)