summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDhaval Giani <dhaval@linux.vnet.ibm.com>2008-12-09 11:18:39 +0000
committerDhaval Giani <dhaval@linux.vnet.ibm.com>2008-12-09 11:18:39 +0000
commit96ee38b048031ceefcd8eb169fc1c4bd2bee2eb7 (patch)
tree578d985f59883daac59438952e572519e1db56df
parent50dce522e4a5a09d43012b1d3d18ac80a5c16863 (diff)
downloadlibcg-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.c32
-rw-r--r--cgconfig.c3
-rw-r--r--libcgroup.h7
-rw-r--r--libcgroup.map5
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 <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];
+}
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;