summaryrefslogtreecommitdiffstats
path: root/src/tools/cgcreate.c
diff options
context:
space:
mode:
authorJan Safranek <jsafrane@redhat.com>2009-10-29 15:48:06 +0100
committerDhaval Giani <dhaval@linux.vnet.ibm.com>2009-11-01 03:09:09 +0530
commitc97161d985b99fea161272185085c4e23c1de951 (patch)
tree24b2d4978c6019809f3fc9edb34e368f29aaf0a5 /src/tools/cgcreate.c
parentbcbe0a35334e08fd1aa5dbb7b96dd1fbd847955a (diff)
downloadlibcg-c97161d985b99fea161272185085c4e23c1de951.tar.gz
libcg-c97161d985b99fea161272185085c4e23c1de951.tar.xz
libcg-c97161d985b99fea161272185085c4e23c1de951.zip
Allow cgcreate to create unlimited nr. of groups
Don't limit the number of groups cgcreate can create, allocate them dynamically. The size of allocated space for the group is only aproximate, but still should be better than hard CG_HIER_MAX. Signed-off-by: Jan Safranek <jsafrane@redhat.com> Signed-off-by: Dhaval Giani <dhaval@linux.vnet.ibm.com>
Diffstat (limited to 'src/tools/cgcreate.c')
-rw-r--r--src/tools/cgcreate.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/tools/cgcreate.c b/src/tools/cgcreate.c
index dc8305c..6204cfb 100644
--- a/src/tools/cgcreate.c
+++ b/src/tools/cgcreate.c
@@ -28,10 +28,13 @@ int main(int argc, char *argv[])
uid_t tuid = CGRULE_INVALID, auid = CGRULE_INVALID;
gid_t tgid = CGRULE_INVALID, agid = CGRULE_INVALID;
- struct cgroup_group_spec *cgroup_list[CG_HIER_MAX];
+ struct cgroup_group_spec **cgroup_list;
struct cgroup *cgroup;
struct cgroup_controller *cgc;
+ /* approximation of max. numbers of groups that will be created */
+ int capacity = argc;
+
/* no parametr on input */
if (argc < 2) {
fprintf(stderr, "Usage is %s "
@@ -40,8 +43,12 @@ int main(int argc, char *argv[])
argv[0]);
return -1;
}
+ cgroup_list = calloc(capacity, sizeof(struct cgroup_group_spec *));
+ if (cgroup_list == NULL) {
+ fprintf(stderr, "%s: out of memory\n", argv[0]);
+ return -1;
+ }
- memset(cgroup_list, 0, sizeof(cgroup_list));
/* parse arguments */
while ((c = getopt(argc, argv, "a:t:g:")) > 0) {
switch (c) {
@@ -113,8 +120,7 @@ int main(int argc, char *argv[])
}
break;
case 'g':
- ret = parse_cgroup_spec(cgroup_list, optarg,
- CG_HIER_MAX);
+ ret = parse_cgroup_spec(cgroup_list, optarg, capacity);
if (ret) {
fprintf(stderr, "%s: "
"cgroup controller and path"
@@ -151,7 +157,7 @@ int main(int argc, char *argv[])
}
/* for each new cgroup */
- for (i = 0; i < CG_HIER_MAX; i++) {
+ for (i = 0; i < capacity; i++) {
if (!cgroup_list[i])
break;
@@ -198,9 +204,12 @@ int main(int argc, char *argv[])
cgroup_free(&cgroup);
}
err:
- for (i = 0; i < CG_HIER_MAX; i++) {
- if (cgroup_list[i])
- cgroup_free_group_spec(cgroup_list[i]);
+ if (cgroup_list) {
+ for (i = 0; i < capacity; i++) {
+ if (cgroup_list[i])
+ cgroup_free_group_spec(cgroup_list[i]);
+ }
+ free(cgroup_list);
}
return ret;
}