diff options
author | Balbir Singh <balbir@linux.vnet.ibm.com> | 2008-04-16 10:53:55 +0000 |
---|---|---|
committer | Balbir Singh <balbir@linux.vnet.ibm.com> | 2008-04-16 10:53:55 +0000 |
commit | 1603195881d3d7902a24cca1861f5808d50202db (patch) | |
tree | a3af57c292d90b62100257e27114e88083ab1cd7 | |
parent | 852880eff7be980c5bd4c86e8451a4e120a054a7 (diff) | |
download | libcg-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
-rw-r--r-- | api.c | 23 | ||||
-rw-r--r-- | libcg.h | 4 | ||||
-rw-r--r-- | tests/libcg_ba.cpp | 2 |
3 files changed, 18 insertions, 11 deletions
@@ -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); } @@ -161,8 +161,8 @@ struct cgroup { int cg_init(void); int cg_attach_task(struct cgroup *cgroup); int cg_modify_cgroup(struct cgroup *cgroup); -int cg_create_cgroup(struct cgroup *cgroup); -int cg_delete_cgroup(struct cgroup *cgroup, int force); +int cg_create_cgroup(struct cgroup *cgroup, int ignore_ownership); +int cg_delete_cgroup(struct cgroup *cgroup, int ignore_migration); __END_DECLS diff --git a/tests/libcg_ba.cpp b/tests/libcg_ba.cpp index 873f12f..6406dda 100644 --- a/tests/libcg_ba.cpp +++ b/tests/libcg_ba.cpp @@ -98,7 +98,7 @@ struct cgroup *cg::makenode(const string &name, const string &task_uid, ccg->control_uid = cuid; ccg->control_gid = cgid; - ret = cg_create_cgroup(ccg); + ret = cg_create_cgroup(ccg, 1); if (ret) { cout << "cg create group failed " << errno << endl; ret = cg_delete_cgroup(ccg, 1); |