chiark / gitweb /
Do not unescape unit names in [Install] section
[elogind.git] / src / shared / conf-parser.c
index d27b1b7eeac40206888376c216a443932cb33c23..158e9efd4cecb260bb15426379fa468e9c8dfe7b 100644 (file)
@@ -204,6 +204,7 @@ static int parse_line(const char* unit,
                       bool allow_include,
                       char **section,
                       unsigned *section_line,
+                      bool *section_ignored,
                       char *l,
                       void *userdata) {
 
@@ -266,7 +267,7 @@ static int parse_line(const char* unit,
 
                 if (sections && !nulstr_contains(sections, n)) {
 
-                        if (!relaxed)
+                        if (!relaxed && !startswith(n, "X-"))
                                 log_syntax(unit, LOG_WARNING, filename, line, EINVAL,
                                            "Unknown section '%s'. Ignoring.", n);
 
@@ -274,10 +275,12 @@ static int parse_line(const char* unit,
                         free(*section);
                         *section = NULL;
                         *section_line = 0;
+                        *section_ignored = true;
                 } else {
                         free(*section);
                         *section = n;
                         *section_line = line;
+                        *section_ignored = false;
                 }
 
                 return 0;
@@ -285,7 +288,7 @@ static int parse_line(const char* unit,
 
         if (sections && !*section) {
 
-                if (!relaxed)
+                if (!relaxed && !*section_ignored)
                         log_syntax(unit, LOG_WARNING, filename, line, EINVAL,
                                    "Assignment outside of section. Ignoring.");
 
@@ -328,6 +331,7 @@ int config_parse(const char *unit,
         _cleanup_free_ char *section = NULL, *continuation = NULL;
         _cleanup_fclose_ FILE *ours = NULL;
         unsigned line = 0, section_line = 0;
+        bool section_ignored = false;
         int r;
 
         assert(filename);
@@ -336,8 +340,8 @@ int config_parse(const char *unit,
         if (!f) {
                 f = ours = fopen(filename, "re");
                 if (!f) {
-                        log_error("Failed to open configuration file '%s': %m", filename);
-                        return -errno;
+                        log_full(errno == ENOENT ? LOG_DEBUG : LOG_ERR, "Failed to open configuration file '%s': %m", filename);
+                        return errno == ENOENT ? 0 : -errno;
                 }
         }
 
@@ -399,6 +403,7 @@ int config_parse(const char *unit,
                                allow_include,
                                &section,
                                &section_line,
+                               &section_ignored,
                                p,
                                userdata);
                 free(c);
@@ -683,7 +688,7 @@ int config_parse_strv(const char *unit,
         FOREACH_WORD_QUOTED(w, l, rvalue, state) {
                 char *n;
 
-                n = cunescape_length(w, l);
+                n = strndup(w, l);
                 if (!n)
                         return log_oom();