]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
shared/conf-parser: allow more than one location of the main config file
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sat, 20 Feb 2021 16:04:05 +0000 (17:04 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sun, 21 Feb 2021 11:22:13 +0000 (12:22 +0100)
No functional change as long as only one path is passed.

src/basic/macro.h
src/network/netdev/netdev.c
src/network/networkd-network.c
src/resolve/resolved-dnssd.c
src/shared/conf-parser.c
src/shared/conf-parser.h
src/test/test-conf-parser.c

index eebd0769dded2a81aa9a6a059132852137c7a005..f1d5e0894e3a077e9b302e19de263f89af129956 100644 (file)
@@ -376,6 +376,7 @@ static inline int __coverity_check_and_return__(int condition) {
 
 #define STRV_MAKE(...) ((char**) ((const char*[]) { __VA_ARGS__, NULL }))
 #define STRV_MAKE_EMPTY ((char*[1]) { NULL })
+#define STRV_MAKE_CONST(...) ((const char* const*) ((const char*[]) { __VA_ARGS__, NULL }))
 
 /* Pointers range from NULL to POINTER_MAX */
 #define POINTER_MAX ((void*) UINTPTR_MAX)
index b26064297b296c5ae7f1d138acbfe0859c2283bc..36d6c5168a178d2a54da83040293d699ed59a7d5 100644 (file)
@@ -686,7 +686,7 @@ int netdev_load_one(Manager *manager, const char *filename) {
 
         dropin_dirname = strjoina(basename(filename), ".d");
         r = config_parse_many(
-                        filename, NETWORK_DIRS, dropin_dirname,
+                        STRV_MAKE_CONST(filename), NETWORK_DIRS, dropin_dirname,
                         NETDEV_COMMON_SECTIONS NETDEV_OTHER_SECTIONS,
                         config_item_perf_lookup, network_netdev_gperf_lookup,
                         CONFIG_PARSE_WARN,
@@ -729,7 +729,7 @@ int netdev_load_one(Manager *manager, const char *filename) {
                 NETDEV_VTABLE(netdev)->init(netdev);
 
         r = config_parse_many(
-                        filename, NETWORK_DIRS, dropin_dirname,
+                        STRV_MAKE_CONST(filename), NETWORK_DIRS, dropin_dirname,
                         NETDEV_VTABLE(netdev)->sections,
                         config_item_perf_lookup, network_netdev_gperf_lookup,
                         CONFIG_PARSE_WARN,
index 4f0dfe469f04f50d91c965d6b4a7a361f2ca01eb..e3c138411ed5349b993185a9725e5f05977d958f 100644 (file)
@@ -446,7 +446,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
         };
 
         r = config_parse_many(
-                        filename, NETWORK_DIRS, dropin_dirname,
+                        STRV_MAKE_CONST(filename), NETWORK_DIRS, dropin_dirname,
                         "Match\0"
                         "Link\0"
                         "SR-IOV\0"
index 34c96e18bd4f785aacb3a76a7845d44630a3dbb7..33d695a9ce7e60cec56afef2e944f05fee899fb5 100644 (file)
@@ -88,7 +88,7 @@ static int dnssd_service_load(Manager *manager, const char *filename) {
         dropin_dirname = strjoina(service->name, ".dnssd.d");
 
         r = config_parse_many(
-                        filename, DNSSD_SERVICE_DIRS, dropin_dirname,
+                        STRV_MAKE_CONST(filename), DNSSD_SERVICE_DIRS, dropin_dirname,
                         "Service\0",
                         config_item_perf_lookup, resolved_dnssd_gperf_lookup,
                         CONFIG_PARSE_WARN,
index c3d7e536ec088cbd955c310240080f7e1ecea3b6..eb468390c286468fba70693c01c139d78a7674a0 100644 (file)
@@ -419,11 +419,11 @@ int config_parse(
         if (ret_mtime)
                 *ret_mtime = mtime;
 
-        return 0;
+        return 1;
 }
 
 static int config_parse_many_files(
-                const char *conf_file,
+                const char* const* conf_files,
                 char **files,
                 const char *sections,
                 ConfigItemLookup lookup,
@@ -436,20 +436,23 @@ static int config_parse_many_files(
         char **fn;
         int r;
 
-        if (conf_file) {
-                r = config_parse(NULL, conf_file, NULL, sections, lookup, table, flags, userdata, &mtime);
+        /* First read the first found main config file. */
+        STRV_FOREACH(fn, (char**) conf_files) {
+                r = config_parse(NULL, *fn, NULL, sections, lookup, table, flags, userdata, &mtime);
                 if (r < 0)
                         return r;
+                if (r > 0)
+                        break;
         }
 
+        /* Then read all the drop-ins. */
         STRV_FOREACH(fn, files) {
                 usec_t t;
 
                 r = config_parse(NULL, *fn, NULL, sections, lookup, table, flags, userdata, &t);
                 if (r < 0)
                         return r;
-                if (t > mtime) /* Find the newest */
-                        mtime = t;
+                mtime = MAX(mtime, t); /* Find the newest */
         }
 
         if (ret_mtime)
@@ -476,12 +479,14 @@ int config_parse_many_nulstr(
         if (r < 0)
                 return r;
 
-        return config_parse_many_files(conf_file, files, sections, lookup, table, flags, userdata, ret_mtime);
+        return config_parse_many_files(STRV_MAKE_CONST(conf_file),
+                                       files, sections, lookup, table, flags, userdata,
+                                       ret_mtime);
 }
 
 /* Parse each config file in the directories specified as strv. */
 int config_parse_many(
-                const char *conf_file,
+                const char* const* conf_files,
                 const char* const* conf_file_dirs,
                 const char *dropin_dirname,
                 const char *sections,
@@ -505,7 +510,7 @@ int config_parse_many(
         if (r < 0)
                 return r;
 
-        return config_parse_many_files(conf_file, files, sections, lookup, table, flags, userdata, ret_mtime);
+        return config_parse_many_files(conf_files, files, sections, lookup, table, flags, userdata, ret_mtime);
 }
 
 #define DEFINE_PARSER(type, vartype, conv_func)                         \
index 5a7dc7ff597885cd33f1b45bf8142d2989fd8662..cd09491112428c9695c41731795046af4ccdf962 100644 (file)
@@ -102,7 +102,7 @@ int config_parse_many_nulstr(
                 usec_t *ret_mtime);         /* possibly NULL */
 
 int config_parse_many(
-                const char *conf_file,      /* possibly NULL */
+                const char* const* conf_files,  /* possibly empty */
                 const char* const* conf_file_dirs,
                 const char *dropin_dirname,
                 const char *sections,       /* nulstr */
index 04b610c6f1fdb29f690d46049a46a514b011e001..5da864347e8aa626228b57258824b9571daad78f 100644 (file)
@@ -349,27 +349,27 @@ static void test_config_parse(unsigned i, const char *s) {
 
         switch (i) {
         case 0 ... 4:
-                assert_se(r == 0);
+                assert_se(r == 1);
                 assert_se(streq(setting1, "1"));
                 break;
 
         case 5 ... 10:
-                assert_se(r == 0);
+                assert_se(r == 1);
                 assert_se(streq(setting1, "1 2 3"));
                 break;
 
         case 11:
-                assert_se(r == 0);
+                assert_se(r == 1);
                 assert_se(streq(setting1, "1\\\\ \\\\2"));
                 break;
 
         case 12:
-                assert_se(r == 0);
+                assert_se(r == 1);
                 assert_se(streq(setting1, x1000("ABCD")));
                 break;
 
         case 13 ... 14:
-                assert_se(r == 0);
+                assert_se(r == 1);
                 assert_se(streq(setting1, x1000("ABCD") " foobar"));
                 break;
 
@@ -379,7 +379,7 @@ static void test_config_parse(unsigned i, const char *s) {
                 break;
 
         case 17:
-                assert_se(r == 0);
+                assert_se(r == 1);
                 assert_se(streq(setting1, "2"));
                 break;
         }