The format of the file is described in
\fBcgconfig.conf\fR. This option can be used multiple times and can be mixed
with \fB-L\fR option.
+
.TP
.B -L, --load-directory=DIR
Finds all files in given directory and parses them in alphabetical order
like they were specified by \fB-l\fR option. This option can be used
multiple times and can be mixed with \fB-l\fR option.
+
+.TP
+.B -a <agid>:<auid>
+defines the default owner of the
+rest of the defined control group’s files. These users are
+allowed to set subsystem parameters and create subgroups.
+The default value is the same as has the parent cgroup.
+
+.TP
+.B -d, --dperm=mode
+sets the default permissions of a control groups directory.
+The permissions needs to be specified as octal numbers e.g.
+\fB-d 775\fR.
+
+.TP
+.B -f, --fperm=mode
+sets the default permissions of the control groups and tasks files.
+The permissions needs to be specified as octal numbers e.g.
+\fB-f 775\fR.
+The value is not used as given because the current owner's
+permissions are used as an umask (so 777 will set group and
+others permissions to the owners permissions).
+
+.TP
+.B -t <tuid>:<tgid>
+defines the default owner of tasks file of the defined control
+group. I.e. this user and members
+of this group have write access to the file.
+
.LP
.SH SEE ALSO
static struct cgroup_string_list cfg_files;
-
static void usage(char *progname)
{
printf("Usage: %s [-l FILE] ...\n", basename(progname));
" configuration file\n");
printf(" -L, --load-directory=DIR Parse and load the cgroups"\
" configuration files from a directory\n");
+ printf(" -a <tuid>:<tgid> Default owner of groups files"\
+ " and directories\n");
+ printf(" -d, --dperm mode Default group directory"\
+ " permissions\n");
+ printf(" -f, --fperm mode Default group file"\
+ " permissions\n");
+ printf(" -t <tuid>:<tgid> Default owner of the tasks "
+ "file");
exit(2);
}
{"help", 0, 0, 'h'},
{"load", 1, 0, 'l'},
{"load-directory", 1, 0, 'L'},
+ {"task", required_argument, NULL, 't'},
+ {"admin", required_argument, NULL, 'a'},
+ {"dperm", required_argument, NULL, 'd'},
+ {"fperm", required_argument, NULL, 'f' },
{0, 0, 0, 0}
};
+ uid_t tuid = NO_UID_GID, auid = NO_UID_GID;
+ gid_t tgid = NO_UID_GID, agid = NO_UID_GID;
+ mode_t dir_mode = 0;
+ mode_t file_mode = 0;
+ int dirm_change = 0;
+ int filem_change = 0;
+ struct cgroup *default_group = NULL;
if (argc < 2)
usage(argv[0]); /* usage() exits */
ret = cgroup_string_list_init(&cfg_files, argc/2);
- while ((c = getopt_long(argc, argv, "hl:L:", options, NULL)) > 0) {
+ while ((c = getopt_long(argc, argv, "hl:L:t:a:d:f:", options,
+ NULL)) > 0) {
switch (c) {
case 'h':
usage(argv[0]);
cgroup_string_list_add_directory(&cfg_files, optarg,
argv[0]);
break;
+ case 'a':
+ /* set admin uid/gid */
+ if (parse_uid_gid(optarg, &auid, &agid, argv[0]))
+ goto err;
+ break;
+ case 't':
+ /* set task uid/gid */
+ if (parse_uid_gid(optarg, &tuid, &tgid, argv[0]))
+ goto err;
+ break;
+ case 'd':
+ dirm_change = 1;
+ ret = parse_mode(optarg, &dir_mode, argv[0]);
+ break;
+ case 'f':
+ filem_change = 1;
+ ret = parse_mode(optarg, &file_mode, argv[0]);
+ break;
default:
usage(argv[0]);
break;
}
}
+ /* set default permissions */
+ default_group = cgroup_new_cgroup("default");
+ if (!default_group) {
+ fprintf(stderr, "%s: cannot create default cgroup\n", argv[0]);
+ goto err;
+ }
+
+ error = cgroup_set_uid_gid(default_group, tuid, tgid, auid, agid);
+ if (error) {
+ fprintf(stderr, "%s: cannot set default UID and GID: %s\n",
+ argv[0], cgroup_strerror(ret));
+ goto err;
+ }
+
+ if (dirm_change | filem_change) {
+ cgroup_set_permissions(default_group, dir_mode, file_mode,
+ file_mode);
+ }
+
+ error = cgroup_config_set_default(default_group);
+ if (error) {
+ fprintf(stderr, "%s: cannot set config parser defaults: %s\n",
+ argv[0], cgroup_strerror(ret));
+ goto err;
+ }
+
for (i = 0; i < cfg_files.count; i++) {
ret = cgroup_config_load_config(cfg_files.items[i]);
if (ret) {
}
}
+err:
+ cgroup_free(&default_group);
cgroup_string_list_free(&cfg_files);
return error;
}