]> git.ipfire.org Git - thirdparty/libcgroup.git/commitdiff
Added parsing of CGROUP_LOGLEVEL
authorPeter Schiffer <pschiffe@redhat.com>
Tue, 2 Apr 2013 08:55:33 +0000 (10:55 +0200)
committerIvana Hutarova Varekova <varekova@redhat.com>
Tue, 2 Apr 2013 08:55:33 +0000 (10:55 +0200)
Allowed values are:
 - DEBUG, INFO, WARNING, ERROR (case insensitive)
 - integer numbers

Signed-off-by: Peter Schiffer <pschiffe@redhat.com>
Acked-by: Ivana Hutarova Varekova <varekova@redhat.com>
include/libcgroup/log.h
src/libcgroup.map
src/log.c

index 356eefb8327b41467b52ddaa29ce23efbbfe9f5c..0dd03b41dad1a294f95257e1f5cf635f6fb07bed 100644 (file)
@@ -131,6 +131,13 @@ extern void cgroup_set_loglevel(int loglevel);
  * This logging automatically benefits from CGROUP_LOGLEVEL env. variable.
  */
 extern void cgroup_log(int loglevel, const char *fmt, ...);
+
+/**
+ * Parse levelstr string for information about desired loglevel. The levelstr
+ * is usually a value of the CGROUP_LOGLEVEL environment variable.
+ * @param levelstr String containing desired loglevel.
+ */
+extern int cgroup_parse_log_level_str(const char *levelstr);
 /**
  * @}
  * @}
index df651b5600a1f5bcb2b451dfcb80a25013373213..b0c162c2581c746d8a4f1caa8adca95b06c2f87a 100644 (file)
@@ -115,4 +115,5 @@ CGROUP_0.39 {
        cgroup_set_default_logger;
        cgroup_set_loglevel;
        cgroup_log;
+       cgroup_parse_log_level_str;
 } CGROUP_0.38;
index d0a68540b0e7d2f91ddec048376a8f2db0952790..f6a386d49b8d68436c1601cc884107175d58809e 100644 (file)
--- a/src/log.c
+++ b/src/log.c
@@ -18,6 +18,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <errno.h>
+#include <strings.h>
 
 static cgroup_logger_callback cgroup_logger;
 static void *cgroup_logger_userdata;
@@ -58,6 +59,29 @@ void cgroup_set_default_logger(int level)
                cgroup_set_logger(cgroup_default_logger, level, NULL);
 }
 
+int cgroup_parse_log_level_str(const char *levelstr)
+{
+       char *end;
+       long level;
+       errno = 0;
+
+       /* try to parse integer first */
+       level = strtol(levelstr, &end, 10);
+       if (end != levelstr && *end == '\0')
+               return level;
+
+       if (strcasecmp(levelstr, "ERROR") == 0)
+               return CGROUP_LOG_ERROR;
+       if (strcasecmp(levelstr, "WARNING") == 0)
+               return CGROUP_LOG_WARNING;
+       if (strcasecmp(levelstr, "INFO") == 0)
+               return CGROUP_LOG_INFO;
+       if (strcasecmp(levelstr, "DEBUG") == 0)
+               return CGROUP_LOG_DEBUG;
+
+       return CGROUP_DEFAULT_LOGLEVEL;
+}
+
 void cgroup_set_loglevel(int loglevel)
 {
        if (loglevel != -1)
@@ -65,11 +89,7 @@ void cgroup_set_loglevel(int loglevel)
        else {
                char *level_str = getenv("CGROUP_LOGLEVEL");
                if (level_str != NULL)
-                       /*
-                        * TODO: add better loglevel detection, e.g. strings
-                        * instead of plain numbers.
-                        */
-                       cgroup_loglevel = atoi(level_str);
+                       cgroup_loglevel = cgroup_parse_log_level_str(level_str);
                else
                        cgroup_loglevel = CGROUP_DEFAULT_LOGLEVEL;
        }