chiark / gitweb /
Use _cleanup_ when reading config files
[elogind.git] / src / shared / conf-parser.c
index c5dd26db5240d1dcf650e46275f29c1485df3f45..fbacf986a515b3e30ceeb0a1c5fe1c958733d283 100644 (file)
@@ -262,23 +262,19 @@ int config_parse(
                 void *userdata) {
 
         unsigned line = 0;
-        char *section = NULL;
+        char _cleanup_free_ *section = NULL, *continuation = NULL;
+        FILE _cleanup_fclose_ *ours = NULL;
         int r;
-        bool ours = false;
-        char *continuation = NULL;
 
         assert(filename);
         assert(lookup);
 
         if (!f) {
-                f = fopen(filename, "re");
+                f = ours = fopen(filename, "re");
                 if (!f) {
-                        r = -errno;
-                        log_error("Failed to open configuration file '%s': %s", filename, strerror(-r));
-                        goto finish;
+                        log_error("Failed to open configuration file '%s': %m", filename);
+                        return -errno;
                 }
-
-                ours = true;
         }
 
         while (!feof(f)) {
@@ -289,19 +285,16 @@ int config_parse(
                         if (feof(f))
                                 break;
 
-                        r = -errno;
-                        log_error("Failed to read configuration file '%s': %s", filename, strerror(-r));
-                        goto finish;
+                        log_error("Failed to read configuration file '%s': %m", filename);
+                        return -errno;
                 }
 
                 truncate_nl(l);
 
                 if (continuation) {
                         c = strappend(continuation, l);
-                        if (!c) {
-                                r = -ENOMEM;
-                                goto finish;
-                        }
+                        if (!c)
+                                return -ENOMEM;
 
                         free(continuation);
                         continuation = NULL;
@@ -323,10 +316,8 @@ int config_parse(
                                 continuation = c;
                         else {
                                 continuation = strdup(l);
-                                if (!continuation) {
-                                        r = -ENOMEM;
-                                        goto finish;
-                                }
+                                if (!continuation)
+                                        return -ENOMEM;
                         }
 
                         continue;
@@ -344,19 +335,10 @@ int config_parse(
                 free(c);
 
                 if (r < 0)
-                        goto finish;
+                        return r;
         }
 
-        r = 0;
-
-finish:
-        free(section);
-        free(continuation);
-
-        if (f && ours)
-                fclose(f);
-
-        return r;
+        return 0;
 }
 
 int config_parse_int(
@@ -467,6 +449,33 @@ int config_parse_unsigned(
         return 0;
 }
 
+int config_parse_double(
+                const char *filename,
+                unsigned line,
+                const char *section,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        double *d = data;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = safe_atod(rvalue, d);
+        if (r < 0) {
+                log_error("[%s:%u] Failed to parse numeric value: %s", filename, line, rvalue);
+                return r;
+        }
+
+        return 0;
+}
+
 int config_parse_bytes_size(
                 const char *filename,
                 unsigned line,
@@ -678,9 +687,18 @@ int config_parse_strv(
         assert(data);
 
         if (isempty(rvalue)) {
-                /* Empty assignment resets the list */
+                char **empty;
+
+                /* Empty assignment resets the list. As a special rule
+                 * we actually fill in a real empty array here rather
+                 * than NULL, since some code wants to know if
+                 * something was set at all... */
+                empty = strv_new(NULL, NULL);
+                if (!empty)
+                        return log_oom();
+
                 strv_free(*sv);
-                *sv = NULL;
+                *sv = empty;
                 return 0;
         }
 
@@ -756,7 +774,7 @@ int config_parse_path_strv(
         return 0;
 }
 
-int config_parse_usec(
+int config_parse_sec(
                 const char *filename,
                 unsigned line,
                 const char *section,
@@ -773,7 +791,7 @@ int config_parse_usec(
         assert(rvalue);
         assert(data);
 
-        if (parse_usec(rvalue, usec) < 0) {
+        if (parse_sec(rvalue, usec) < 0) {
                 log_error("[%s:%u] Failed to parse time value, ignoring: %s", filename, line, rvalue);
                 return 0;
         }