summaryrefslogtreecommitdiffstats
path: root/api.c
diff options
context:
space:
mode:
authorBalbir Singh <balbir@linux.vnet.ibm.com>2008-04-16 10:53:55 +0000
committerBalbir Singh <balbir@linux.vnet.ibm.com>2008-04-16 10:53:55 +0000
commit1603195881d3d7902a24cca1861f5808d50202db (patch)
treea3af57c292d90b62100257e27114e88083ab1cd7 /api.c
parent852880eff7be980c5bd4c86e8451a4e120a054a7 (diff)
downloadlibcg-1603195881d3d7902a24cca1861f5808d50202db.tar.gz
libcg-1603195881d3d7902a24cca1861f5808d50202db.tar.xz
libcg-1603195881d3d7902a24cca1861f5808d50202db.zip
api.c | 23 +++++++++++++++--------
libcg.h | 4 ++-- tests/libcg_ba.cpp | 2 +- Added additional parameters for create and destroy cgroup. Fixed a cg_init segfault (faulty, if-else check) Signed-off-by: Balbir Singh <balbir@linux.vnet.ibm.com> git-svn-id: https://libcg.svn.sourceforge.net/svnroot/libcg/branches/balbir@15 4f4bb910-9a46-0410-90c8-c897d4f1cd53
Diffstat (limited to 'api.c')
-rw-r--r--api.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/api.c b/api.c
index 8dbeab9..c2d6ef9 100644
--- a/api.c
+++ b/api.c
@@ -121,7 +121,7 @@ int cg_init()
*/
if (!found_mnt)
ret = ECGROUPNOTMOUNTED;
- if (found_mnt > 1)
+ else if (found_mnt > 1)
ret = ECGROUPMULTIMOUNTED;
else {
/*
@@ -340,7 +340,7 @@ err:
* returns 0 on success. We recommend calling cg_delete_cgroup
* if this routine fails. That should do the cleanup operation.
*/
-int cg_create_cgroup(struct cgroup *cgroup)
+int cg_create_cgroup(struct cgroup *cgroup, int ignore_ownership)
{
char *fts_path[2], base[FILENAME_MAX], *path;
int i;
@@ -359,7 +359,12 @@ int cg_create_cgroup(struct cgroup *cgroup)
strcpy(base, path);
- cg_chown_recursive(fts_path, cgroup->control_uid, cgroup->control_gid);
+ if (!ignore_ownership)
+ error = cg_chown_recursive(fts_path, cgroup->control_uid,
+ cgroup->control_gid);
+
+ if (error)
+ goto err;
for (i = 0; i < CG_CONTROLLER_MAX && cgroup->controller[i];
i++, strcpy(path, base)) {
@@ -378,9 +383,11 @@ int cg_create_cgroup(struct cgroup *cgroup)
}
}
- strcpy(path, base);
- strcat(path, "/tasks");
- chown(path, cgroup->tasks_uid, cgroup->tasks_gid);
+ if (!ignore_ownership) {
+ strcpy(path, base);
+ strcat(path, "/tasks");
+ chown(path, cgroup->tasks_uid, cgroup->tasks_gid);
+ }
err:
free(path);
return error;
@@ -391,7 +398,7 @@ err:
*
* returns 0 on success.
*/
-int cg_delete_cgroup(struct cgroup *cgroup, int force)
+int cg_delete_cgroup(struct cgroup *cgroup, int ignore_migration)
{
FILE *delete_tasks, *base_tasks;
int tids;
@@ -424,7 +431,7 @@ int cg_delete_cgroup(struct cgroup *cgroup, int force)
del_open_err:
fclose(base_tasks);
base_open_err:
- if (force) {
+ if (ignore_migration) {
cg_build_path(cgroup->name, path);
error = rmdir(path);
}