diff options
author | Dhaval Giani <dhaval@linux.vnet.ibm.com> | 2008-09-29 14:14:51 +0000 |
---|---|---|
committer | Dhaval Giani <dhaval@linux.vnet.ibm.com> | 2008-09-29 14:14:51 +0000 |
commit | 3a581d5f2dfe420c30dfd12c3be80628d7c953bf (patch) | |
tree | 731f5eb562c8482799ce3f7617903bf6d3ee591c | |
parent | d1ab753ba5d0d641b52cb90e00ce2eabfae476f4 (diff) | |
download | libcg-3a581d5f2dfe420c30dfd12c3be80628d7c953bf.tar.gz libcg-3a581d5f2dfe420c30dfd12c3be80628d7c953bf.tar.xz libcg-3a581d5f2dfe420c30dfd12c3be80628d7c953bf.zip |
libcgroup: Change how cgroup_get_cgroup works
Since we will not deprecate API now, and will do so with the
next release, let's include this one in and get the API right.
With this pathc, we now return int type, and the pointer passed
as the argument redirects to the cgroup we are reading.
Signed-off-by: Dhaval Giani <dhaval@linux.vnet.ibm.com>
git-svn-id: https://libcg.svn.sourceforge.net/svnroot/libcg/trunk@202 4f4bb910-9a46-0410-90c8-c897d4f1cd53
-rw-r--r-- | api.c | 38 | ||||
-rw-r--r-- | libcgroup.h | 2 |
2 files changed, 26 insertions, 14 deletions
@@ -1215,7 +1215,7 @@ int cgroup_create_cgroup_from_parent(struct cgroup *cgroup, if (!parent_cgroup) goto err_nomem; - if (cgroup_get_cgroup(parent_cgroup) == NULL) + if (cgroup_get_cgroup(parent_cgroup)) goto err_parent; dbg("got parent group for %s\n", parent_cgroup->name); @@ -1430,12 +1430,12 @@ fill_error: } /* - * cgroup_get_cgroup returns the cgroup data from the filesystem. + * cgroup_get_cgroup reads the cgroup data from the filesystem. * struct cgroup has the name of the group to be populated * - * return succesfully filled cgroup data structure on success. + * return 0 on success. */ -struct cgroup *cgroup_get_cgroup(struct cgroup *cgroup) +int cgroup_get_cgroup(struct cgroup *cgroup) { int i; char path[FILENAME_MAX]; @@ -1446,12 +1446,12 @@ struct cgroup *cgroup_get_cgroup(struct cgroup *cgroup) if (!cgroup_initialized) { /* ECGROUPNOTINITIALIZED */ - return NULL; + return ECGROUPNOTINITIALIZED; } if (!cgroup) { /* ECGROUPNOTALLOWED */ - return NULL; + return ECGROUPNOTALLOWED; } pthread_rwlock_rdlock(&cg_mount_table_lock); @@ -1489,15 +1489,19 @@ struct cgroup *cgroup_get_cgroup(struct cgroup *cgroup) */ control_path = malloc(strlen(path) + strlen("tasks") + 1); - strcpy(control_path, path); - if (!control_path) + if (!control_path) { + error = ECGOTHER; goto unlock_error; + } + + strcpy(control_path, path); strcat(control_path, "tasks"); if (stat(control_path, &stat_buffer)) { free(control_path); + error = ECGOTHER; goto unlock_error; } @@ -1508,12 +1512,14 @@ struct cgroup *cgroup_get_cgroup(struct cgroup *cgroup) cgc = cgroup_add_controller(cgroup, cg_mount_table[i].name); - if (!cgc) + if (!cgc) { + error = ECGINVAL; goto unlock_error; + } dir = opendir(path); if (!dir) { - /* error = ECGROUPSTRUCTERROR; */ + error = ECGOTHER; goto unlock_error; } @@ -1534,16 +1540,22 @@ struct cgroup *cgroup_get_cgroup(struct cgroup *cgroup) } /* Check if the group really exists or not */ - if (!cgroup->index) + if (!cgroup->index) { + error = ECGROUPNOTEXIST; goto unlock_error; + } pthread_rwlock_unlock(&cg_mount_table_lock); - return cgroup; + return 0; unlock_error: pthread_rwlock_unlock(&cg_mount_table_lock); + /* + * XX: Need to figure out how to cleanup? Cleanup just the stuff + * we added, or the whole structure. + */ cgroup = NULL; - return NULL; + return error; } /** cg_prepare_cgroup diff --git a/libcgroup.h b/libcgroup.h index 9325846..2a93022 100644 --- a/libcgroup.h +++ b/libcgroup.h @@ -114,7 +114,7 @@ int cgroup_modify_cgroup(struct cgroup *cgroup); int cgroup_create_cgroup(struct cgroup *cgroup, int ignore_ownership); int cgroup_delete_cgroup(struct cgroup *cgroup, int ignore_migration); int cgroup_attach_task_pid(struct cgroup *cgroup, pid_t tid); -struct cgroup *cgroup_get_cgroup(struct cgroup *cgroup); +int cgroup_get_cgroup(struct cgroup *cgroup); int cgroup_create_cgroup_from_parent(struct cgroup *cgroup, int ignore_ownership); int cgroup_copy_cgroup(struct cgroup *dst, struct cgroup *src); |