]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: also read mtime of drop-in configs 16030/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 1 Jun 2020 05:53:06 +0000 (14:53 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 1 Jun 2020 08:03:40 +0000 (17:03 +0900)
Fixes #15521.

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

index 997dafa719f124dd5606a565b5a423877466befb..a990c64b55f6af64c7ca736078125b2315ce74f8 100644 (file)
@@ -689,7 +689,7 @@ int netdev_load_one(Manager *manager, const char *filename) {
         r = config_parse_many(filename, NETWORK_DIRS, dropin_dirname,
                               NETDEV_COMMON_SECTIONS NETDEV_OTHER_SECTIONS,
                               config_item_perf_lookup, network_netdev_gperf_lookup,
-                              CONFIG_PARSE_WARN, netdev_raw);
+                              CONFIG_PARSE_WARN, netdev_raw, NULL);
         if (r < 0)
                 return r;
 
@@ -729,7 +729,7 @@ int netdev_load_one(Manager *manager, const char *filename) {
         r = config_parse_many(filename, NETWORK_DIRS, dropin_dirname,
                               NETDEV_VTABLE(netdev)->sections,
                               config_item_perf_lookup, network_netdev_gperf_lookup,
-                              CONFIG_PARSE_WARN, netdev);
+                              CONFIG_PARSE_WARN, netdev, NULL);
         if (r < 0)
                 return r;
 
index 1921fe2ff36c65b41ed5a2fbc3ae46a4f0a9e3b9..2e8cba4ae2edee0a9998409c2cd2cb52f45bb7d9 100644 (file)
@@ -335,6 +335,7 @@ int network_verify(Network *network) {
 int network_load_one(Manager *manager, OrderedHashmap **networks, const char *filename) {
         _cleanup_free_ char *fname = NULL, *name = NULL;
         _cleanup_(network_unrefp) Network *network = NULL;
+        _cleanup_strv_free_ char **dropins = NULL;
         _cleanup_fclose_ FILE *file = NULL;
         const char *dropin_dirname;
         char *d;
@@ -522,7 +523,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
                               "TokenBucketFilter\0"
                               "TrivialLinkEqualizer\0",
                               config_item_perf_lookup, network_network_gperf_lookup,
-                              CONFIG_PARSE_WARN, network);
+                              CONFIG_PARSE_WARN, network, &dropins);
         if (r < 0)
                 return r;
 
@@ -541,6 +542,20 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
         if (stat(filename, &stats) >= 0)
                 network->timestamp = timespec_load(&stats.st_mtim);
 
+        char **f;
+        STRV_FOREACH(f, dropins) {
+                usec_t t;
+
+                if (stat(*f, &stats) < 0) {
+                        network->timestamp = 0;
+                        break;
+                }
+
+                t = timespec_load(&stats.st_mtim);
+                if (t > network->timestamp)
+                        network->timestamp = t;
+        }
+
         if (network_verify(network) < 0)
                 /* Ignore .network files that do not match the conditions. */
                 return 0;
index bc886fd0e0bd6b42b85ebe0bde0ce87862063de0..c331b2d94c9453bea2ec93e3e9a3b7c9afffdca6 100644 (file)
@@ -89,7 +89,7 @@ static int dnssd_service_load(Manager *manager, const char *filename) {
         r = config_parse_many(filename, DNSSD_SERVICE_DIRS, dropin_dirname,
                               "Service\0",
                               config_item_perf_lookup, resolved_dnssd_gperf_lookup,
-                              false, service);
+                              false, service, NULL);
         if (r < 0)
                 return r;
 
index e685ecbff7af8779c7a42926dc14488fd0e4dc69..b04eb3912c19a4f51cd235b7d45993c6c0db7771 100644 (file)
@@ -493,7 +493,8 @@ int config_parse_many(
                 ConfigItemLookup lookup,
                 const void *table,
                 ConfigParseFlags flags,
-                void *userdata) {
+                void *userdata,
+                char ***ret_dropins) {
 
         _cleanup_strv_free_ char **dropin_dirs = NULL;
         _cleanup_strv_free_ char **files = NULL;
@@ -509,7 +510,14 @@ int config_parse_many(
         if (r < 0)
                 return r;
 
-        return config_parse_many_files(conf_file, files, sections, lookup, table, flags, userdata);
+        r = config_parse_many_files(conf_file, files, sections, lookup, table, flags, userdata);
+        if (r < 0)
+                return r;
+
+        if (ret_dropins)
+                *ret_dropins = TAKE_PTR(files);
+
+        return 0;
 }
 
 #define DEFINE_PARSER(type, vartype, conv_func)                         \
index 82c692af10c3a91366dd0f4aaf5876ab181788ed..480988f392bf7c646c997b913f39b842c2ab9726 100644 (file)
@@ -107,7 +107,8 @@ int config_parse_many(
                 ConfigItemLookup lookup,
                 const void *table,
                 ConfigParseFlags flags,
-                void *userdata);
+                void *userdata,
+                char ***ret_dropins);       /* possibly NULL */
 
 CONFIG_PARSER_PROTOTYPE(config_parse_int);
 CONFIG_PARSER_PROTOTYPE(config_parse_unsigned);