From: Zbigniew Jędrzejewski-Szmek Date: Sat, 20 Feb 2021 16:04:05 +0000 (+0100) Subject: shared/conf-parser: allow more than one location of the main config file X-Git-Tag: v248-rc1~8^2~11 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8b8024f1c231c166f5c450905c8fd91d11704ae7;p=thirdparty%2Fsystemd.git shared/conf-parser: allow more than one location of the main config file No functional change as long as only one path is passed. --- diff --git a/src/basic/macro.h b/src/basic/macro.h index eebd0769dde..f1d5e0894e3 100644 --- a/src/basic/macro.h +++ b/src/basic/macro.h @@ -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) diff --git a/src/network/netdev/netdev.c b/src/network/netdev/netdev.c index b26064297b2..36d6c5168a1 100644 --- a/src/network/netdev/netdev.c +++ b/src/network/netdev/netdev.c @@ -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, diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 4f0dfe469f0..e3c138411ed 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -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" diff --git a/src/resolve/resolved-dnssd.c b/src/resolve/resolved-dnssd.c index 34c96e18bd4..33d695a9ce7 100644 --- a/src/resolve/resolved-dnssd.c +++ b/src/resolve/resolved-dnssd.c @@ -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, diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c index c3d7e536ec0..eb468390c28 100644 --- a/src/shared/conf-parser.c +++ b/src/shared/conf-parser.c @@ -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) \ diff --git a/src/shared/conf-parser.h b/src/shared/conf-parser.h index 5a7dc7ff597..cd094911124 100644 --- a/src/shared/conf-parser.h +++ b/src/shared/conf-parser.h @@ -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 */ diff --git a/src/test/test-conf-parser.c b/src/test/test-conf-parser.c index 04b610c6f1f..5da864347e8 100644 --- a/src/test/test-conf-parser.c +++ b/src/test/test-conf-parser.c @@ -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; }