chiark / gitweb /
journald/server: replace readdir_r with readdir
[elogind.git] / src / shared / conf-parser.c
index 2303d9a50b7bb348bba6f2631f0708d40a02022b..1e3cee5bebc4c21c97f161bda15e8201650fb4a4 100644 (file)
@@ -24,6 +24,7 @@
 #include <errno.h>
 #include <assert.h>
 #include <stdlib.h>
+#include <netinet/ether.h>
 
 #include "conf-parser.h"
 #include "util.h"
@@ -155,6 +156,7 @@ static int next_assignment(const char *unit,
                            ConfigItemLookup lookup,
                            void *table,
                            const char *section,
+                           unsigned section_line,
                            const char *lvalue,
                            const char *rvalue,
                            bool relaxed,
@@ -177,8 +179,8 @@ static int next_assignment(const char *unit,
 
         if (r > 0) {
                 if (func)
-                        return func(unit, filename, line, section, lvalue, ltype,
-                                    rvalue, data, userdata);
+                        return func(unit, filename, line, section, section_line,
+                                    lvalue, ltype, rvalue, data, userdata);
 
                 return 0;
         }
@@ -201,6 +203,7 @@ static int parse_line(const char* unit,
                       bool relaxed,
                       bool allow_include,
                       char **section,
+                      unsigned *section_line,
                       char *l,
                       void *userdata) {
 
@@ -259,10 +262,13 @@ static int parse_line(const char* unit,
                                            "Unknown section '%s'. Ignoring.", n);
 
                         free(n);
+                        free(*section);
                         *section = NULL;
+                        *section_line = 0;
                 } else {
                         free(*section);
                         *section = n;
+                        *section_line = line;
                 }
 
                 return 0;
@@ -292,6 +298,7 @@ static int parse_line(const char* unit,
                                lookup,
                                table,
                                *section,
+                               *section_line,
                                strstrip(l),
                                strstrip(e),
                                relaxed,
@@ -311,7 +318,7 @@ int config_parse(const char *unit,
 
         _cleanup_free_ char *section = NULL, *continuation = NULL;
         _cleanup_fclose_ FILE *ours = NULL;
-        unsigned line = 0;
+        unsigned line = 0, section_line = 0;
         int r;
 
         assert(filename);
@@ -380,6 +387,7 @@ int config_parse(const char *unit,
                                relaxed,
                                allow_include,
                                &section,
+                               &section_line,
                                p,
                                userdata);
                 free(c);
@@ -396,6 +404,7 @@ int config_parse(const char *unit,
                                 const char *filename,                   \
                                 unsigned line,                          \
                                 const char *section,                    \
+                                unsigned section_line,                  \
                                 const char *lvalue,                     \
                                 int ltype,                              \
                                 const char *rvalue,                     \
@@ -432,6 +441,7 @@ int config_parse_bytes_size(const char* unit,
                             const char *filename,
                             unsigned line,
                             const char *section,
+                            unsigned section_line,
                             const char *lvalue,
                             int ltype,
                             const char *rvalue,
@@ -463,6 +473,7 @@ int config_parse_bytes_off(const char* unit,
                            const char *filename,
                            unsigned line,
                            const char *section,
+                           unsigned section_line,
                            const char *lvalue,
                            int ltype,
                            const char *rvalue,
@@ -491,6 +502,7 @@ int config_parse_bool(const char* unit,
                       const char *filename,
                       unsigned line,
                       const char *section,
+                      unsigned section_line,
                       const char *lvalue,
                       int ltype,
                       const char *rvalue,
@@ -516,41 +528,11 @@ int config_parse_bool(const char* unit,
         return 0;
 }
 
-int config_parse_tristate(const char *unit,
-                          const char *filename,
-                          unsigned line,
-                          const char *section,
-                          const char *lvalue,
-                          int ltype,
-                          const char *rvalue,
-                          void *data,
-                          void *userdata) {
-
-        int k;
-        int *b = data;
-
-        assert(filename);
-        assert(lvalue);
-        assert(rvalue);
-        assert(data);
-
-        /* Tristates are like booleans, but can also take the 'default' value, i.e. "-1" */
-
-        k = parse_boolean(rvalue);
-        if (k < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, -k,
-                           "Failed to parse boolean value, ignoring: %s", rvalue);
-                return 0;
-        }
-
-        *b = !!k;
-        return 0;
-}
-
 int config_parse_string(const char *unit,
                         const char *filename,
                         unsigned line,
                         const char *section,
+                        unsigned section_line,
                         const char *lvalue,
                         int ltype,
                         const char *rvalue,
@@ -591,6 +573,7 @@ int config_parse_path(const char *unit,
                       const char *filename,
                       unsigned line,
                       const char *section,
+                      unsigned section_line,
                       const char *lvalue,
                       int ltype,
                       const char *rvalue,
@@ -599,6 +582,7 @@ int config_parse_path(const char *unit,
 
         char **s = data;
         char *n;
+        int offset;
 
         assert(filename);
         assert(lvalue);
@@ -611,7 +595,9 @@ int config_parse_path(const char *unit,
                 return 0;
         }
 
-        if (!path_is_absolute(rvalue)) {
+        offset = rvalue[0] == '-' && (streq(lvalue, "InaccessibleDirectories") ||
+                                      streq(lvalue, "ReadOnlyDirectories"));
+        if (!path_is_absolute(rvalue + offset)) {
                 log_syntax(unit, LOG_ERR, filename, line, EINVAL,
                            "Not an absolute path, ignoring: %s", rvalue);
                 return 0;
@@ -633,6 +619,7 @@ int config_parse_strv(const char *unit,
                       const char *filename,
                       unsigned line,
                       const char *section,
+                      unsigned section_line,
                       const char *lvalue,
                       int ltype,
                       const char *rvalue,
@@ -689,6 +676,7 @@ int config_parse_path_strv(const char *unit,
                            const char *filename,
                            unsigned line,
                            const char *section,
+                           unsigned section_line,
                            const char *lvalue,
                            int ltype,
                            const char *rvalue,
@@ -713,6 +701,7 @@ int config_parse_path_strv(const char *unit,
 
         FOREACH_WORD_QUOTED(w, l, rvalue, state) {
                 _cleanup_free_ char *n;
+                int offset;
 
                 n = strndup(w, l);
                 if (!n)
@@ -724,7 +713,9 @@ int config_parse_path_strv(const char *unit,
                         continue;
                 }
 
-                if (!path_is_absolute(n)) {
+                offset = n[0] == '-' && (streq(lvalue, "InaccessibleDirectories") ||
+                                         streq(lvalue, "ReadOnlyDirectories"));
+                if (!path_is_absolute(n + offset)) {
                         log_syntax(unit, LOG_ERR, filename, line, EINVAL,
                                    "Not an absolute path, ignoring: %s", rvalue);
                         continue;
@@ -743,6 +734,7 @@ int config_parse_mode(const char *unit,
                       const char *filename,
                       unsigned line,
                       const char *section,
+                      unsigned section_line,
                       const char *lvalue,
                       int ltype,
                       const char *rvalue,
@@ -780,6 +772,7 @@ int config_parse_facility(const char *unit,
                           const char *filename,
                           unsigned line,
                           const char *section,
+                          unsigned section_line,
                           const char *lvalue,
                           int ltype,
                           const char *rvalue,
@@ -810,6 +803,7 @@ int config_parse_level(const char *unit,
                        const char *filename,
                        unsigned line,
                        const char *section,
+                       unsigned section_line,
                        const char *lvalue,
                        int ltype,
                        const char *rvalue,
@@ -839,6 +833,7 @@ int config_parse_set_status(const char *unit,
                             const char *filename,
                             unsigned line,
                             const char *section,
+                            unsigned section_line,
                             const char *lvalue,
                             int ltype,
                             const char *rvalue,