From 96ee38b048031ceefcd8eb169fc1c4bd2bee2eb7 Mon Sep 17 00:00:00 2001 From: Dhaval Giani Date: Tue, 9 Dec 2008 11:18:39 +0000 Subject: libcgroup: Better error reporting for libcgroup From: Ankita Garg 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 Signed-off-by: Ankita Garg Signed-off-by: Dhaval Giani git-svn-id: https://libcg.svn.sourceforge.net/svnroot/libcg/trunk@228 4f4bb910-9a46-0410-90c8-c897d4f1cd53 --- api.c | 32 ++++++++++++++++++++++++++++++++ cgconfig.c | 3 +-- libcgroup.h | 7 +++++++ libcgroup.map | 5 +++++ 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/api.c b/api.c index 4efb390..b5bb8ee 100644 --- a/api.c +++ b/api.c @@ -40,6 +40,7 @@ #include #include #include +#include #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]; +} diff --git a/cgconfig.c b/cgconfig.c index fab3a72..043678a 100644 --- a/cgconfig.c +++ b/cgconfig.c @@ -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; -- cgit