diff options
author | Dhaval Giani <dhaval@linux.vnet.ibm.com> | 2008-12-09 11:18:39 +0000 |
---|---|---|
committer | Dhaval Giani <dhaval@linux.vnet.ibm.com> | 2008-12-09 11:18:39 +0000 |
commit | 96ee38b048031ceefcd8eb169fc1c4bd2bee2eb7 (patch) | |
tree | 578d985f59883daac59438952e572519e1db56df | |
parent | 50dce522e4a5a09d43012b1d3d18ac80a5c16863 (diff) | |
download | libcg-96ee38b048031ceefcd8eb169fc1c4bd2bee2eb7.tar.gz libcg-96ee38b048031ceefcd8eb169fc1c4bd2bee2eb7.tar.xz libcg-96ee38b048031ceefcd8eb169fc1c4bd2bee2eb7.zip |
libcgroup: Better error reporting for libcgroup
From: Ankita Garg <ankita@in.ibm.com>
This patch adds human readable error messages to the configuration parser.
The error lookup is implemented as a simple table, indexed by the error.
TODO: Save errno at ECGOTHER and pass it down as cgroup_lasterror.
Signed-off-by: Balbir Singh <balbir@linux.vnet.ibm.com>
Signed-off-by: Ankita Garg <ankita@in.ibm.com>
Signed-off-by: Dhaval Giani <dhaval@linux.vnet.ibm.com>
git-svn-id: https://libcg.svn.sourceforge.net/svnroot/libcg/trunk@228 4f4bb910-9a46-0410-90c8-c897d4f1cd53
-rw-r--r-- | api.c | 32 | ||||
-rw-r--r-- | cgconfig.c | 3 | ||||
-rw-r--r-- | libcgroup.h | 7 | ||||
-rw-r--r-- | libcgroup.map | 5 |
4 files changed, 45 insertions, 2 deletions
@@ -40,6 +40,7 @@ #include <ctype.h> #include <pwd.h> #include <libgen.h> +#include <assert.h> #ifndef PACKAGE_VERSION #define PACKAGE_VERSION 0.01 @@ -70,6 +71,31 @@ static struct cgroup_rule_list trl; /* Lock for the list of rules (rl) */ static pthread_rwlock_t rl_lock = PTHREAD_RWLOCK_INITIALIZER; +char *cgroup_strerror_codes[] = { + "Cgroup is not compiled in", + "Cgroup is not mounted", + "Cgroup does not exist", + "Cgroup has not been created", + "Cgroup one of the needed subsystems is not mounted", + "Cgroup, request came in from non owner", + "Cgroup controllers controllers are bound to different mount points", + "Cgroup, operation not allowed", + "Cgroup value set exceeds maximum", + "Cgroup controller already exists", + "Cgroup value already exists", + "Cgroup invalid operation", + "Cgroup, creation of controller failed", + "Cgroup operation failed", + "Cgroup not initialized", + "Cgroup trying to set value for control that does not exist", + "Cgroup generic error, see errno", + "Cgroup values are not equal", + "Cgroup controllers are different", + "Cgroup parsing failed", + "Cgroup, rules file does not exist", + "Cgroup mounting failed", +}; + static int cg_chown_file(FTS *fts, FTSENT *ent, uid_t owner, gid_t group) { int ret = 0; @@ -2077,3 +2103,9 @@ cleanup_path: free(path); return ret; } + +char *cgroup_strerror(int code) +{ + assert((code >= ECGROUPNOTCOMPILED) && (code < ECGSENTINEL)); + return cgroup_strerror_codes[code % ECGROUPNOTCOMPILED]; +} @@ -61,8 +61,7 @@ int main(int argc, char *argv[]) if (ret) { printf("Loading configuration file %s " "failed, error: %s\n", filename, - strerror(errno)); - printf("return code = %d\n", ret); + cgroup_strerror(ret)); exit(3); } return 0; diff --git a/libcgroup.h b/libcgroup.h index 2a93022..4fb99ff 100644 --- a/libcgroup.h +++ b/libcgroup.h @@ -94,6 +94,7 @@ enum cgroup_errors { ECGROUPPARSEFAIL, /* Failed to parse rules configuration file. */ ECGROUPNORULES, /* Rules list does not exist. */ ECGMOUNTFAIL, + ECGSENTINEL, /* Please insert further error codes above this */ }; #define CG_NV_MAX 100 @@ -187,6 +188,12 @@ int cgroup_init_rules_cache(void); */ int cgroup_get_current_controller_path(pid_t pid, const char *controller, char **current_path); +/** + * Return error corresponding to @code in human readable format. + * @code: error code for which the corresponding error string is to be + * returned + */ +char *cgroup_strerror(int code); /* The wrappers for filling libcg structures */ diff --git a/libcgroup.map b/libcgroup.map index 61ae3ba..3b55ff2 100644 --- a/libcgroup.map +++ b/libcgroup.map @@ -40,3 +40,8 @@ global: local: *; }; + +CGROUP_0.32.1 { +global: + cgroup_strerror; +} CGROUP_0.32; |