chiark / gitweb /
various cleanups
[elogind.git] / conf-parser.c
index 3a7da7960ca84f5f5418f95603d27beed4702808..c7f48eafef3f836feb9fae15f38ec84197c858f9 100644 (file)
@@ -10,8 +10,8 @@
 #include "util.h"
 #include "macro.h"
 #include "strv.h"
+#include "log.h"
 
-#define WHITESPACE " \t\n"
 #define COMMENTS "#;\n"
 #define LINE_MAX 4096
 
@@ -44,7 +44,7 @@ static int next_assignment(
                 return t->parse(filename, line, section, lvalue, rvalue, t->data, userdata);
         }
 
-        fprintf(stderr, "[%s:%u] Unknown lvalue '%s' in section '%s'.\n", filename, line, lvalue, strna(section));
+        log_error("[%s:%u] Unknown lvalue '%s' in section '%s'.", filename, line, lvalue, strna(section));
         return -EBADMSG;
 }
 
@@ -122,7 +122,7 @@ static int parse_line(const char *filename, unsigned line, char **section, const
                 assert(k > 0);
 
                 if (b[k-1] != ']') {
-                        fprintf(stderr, "[%s:%u] Invalid section header.\n", filename, line);
+                        log_error("[%s:%u] Invalid section header.", filename, line);
                         return -EBADMSG;
                 }
 
@@ -151,7 +151,7 @@ static int parse_line(const char *filename, unsigned line, char **section, const
         }
 
         if (!(e = strchr(b, '='))) {
-                fprintf(stderr, "[%s:%u] Missing '='.\n", filename, line);
+                log_error("[%s:%u] Missing '='.", filename, line);
                 return -EBADMSG;
         }
 
@@ -173,7 +173,7 @@ int config_parse(const char *filename, const char* const * sections, const Confi
 
         if (!(f = fopen(filename, "re"))) {
                 r = -errno;
-                fprintf(stderr, "Failed to open configuration file '%s': %s\n", filename, strerror(-r));
+                log_error("Failed to open configuration file '%s': %s", filename, strerror(-r));
                 goto finish;
         }
 
@@ -185,7 +185,7 @@ int config_parse(const char *filename, const char* const * sections, const Confi
                                 break;
 
                         r = -errno;
-                        fprintf(stderr, "Failed to read configuration file '%s': %s\n", filename, strerror(-r));
+                        log_error("Failed to read configuration file '%s': %s", filename, strerror(-r));
                         goto finish;
                 }
 
@@ -222,7 +222,7 @@ int config_parse_int(
         assert(data);
 
         if ((r = safe_atoi(rvalue, i)) < 0) {
-                fprintf(stderr, "[%s:%u] Failed to parse numeric value: %s\n", filename, line, rvalue);
+                log_error("[%s:%u] Failed to parse numeric value: %s", filename, line, rvalue);
                 return r;
         }
 
@@ -247,7 +247,7 @@ int config_parse_unsigned(
         assert(data);
 
         if ((r = safe_atou(rvalue, u)) < 0) {
-                fprintf(stderr, "[%s:%u] Failed to parse numeric value: %s\n", filename, line, rvalue);
+                log_error("[%s:%u] Failed to parse numeric value: %s", filename, line, rvalue);
                 return r;
         }
 
@@ -273,7 +273,7 @@ int config_parse_size(
         assert(data);
 
         if ((r = safe_atou(rvalue, &u)) < 0) {
-                fprintf(stderr, "[%s:%u] Failed to parse numeric value: %s\n", filename, line, rvalue);
+                log_error("[%s:%u] Failed to parse numeric value: %s", filename, line, rvalue);
                 return r;
         }
 
@@ -299,7 +299,7 @@ int config_parse_bool(
         assert(data);
 
         if ((k = parse_boolean(rvalue)) < 0) {
-                fprintf(stderr, "[%s:%u] Failed to parse boolean value: %s\n", filename, line, rvalue);
+                log_error("[%s:%u] Failed to parse boolean value: %s", filename, line, rvalue);
                 return k;
         }
 
@@ -336,6 +336,36 @@ int config_parse_string(
         return 0;
 }
 
+int config_parse_path(
+                const char *filename,
+                unsigned line,
+                const char *section,
+                const char *lvalue,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        char **s = data;
+        char *n;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        if (*rvalue != '/') {
+                log_error("[%s:%u] Not an absolute path: %s", filename, line, rvalue);
+                return -EINVAL;
+        }
+
+        if (!(n = strdup(rvalue)))
+                return -ENOMEM;
+
+        free(*s);
+        *s = n;
+
+        return 0;
+}
 
 int config_parse_strv(
                 const char *filename,
@@ -359,7 +389,7 @@ int config_parse_strv(
         assert(data);
 
         k = strv_length(*sv);
-        FOREACH_WORD(w, &l, rvalue, state)
+        FOREACH_WORD_QUOTED(w, l, rvalue, state)
                 k++;
 
         if (!(n = new(char*, k+1)))
@@ -367,7 +397,7 @@ int config_parse_strv(
 
         for (k = 0; (*sv)[k]; k++)
                 n[k] = (*sv)[k];
-        FOREACH_WORD(w, &l, rvalue, state)
+        FOREACH_WORD_QUOTED(w, l, rvalue, state)
                 if (!(n[k++] = strndup(w, l)))
                         goto fail;
 
@@ -380,6 +410,7 @@ int config_parse_strv(
 fail:
         for (; k > 0; k--)
                 free(n[k-1]);
+        free(n);
 
         return -ENOMEM;
 }