]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/network/networkd-network.c
network: also read mtime of drop-in configs
[thirdparty/systemd.git] / src / network / networkd-network.c
index 1b4083febf23432d7b32093b28a7b10ef97ac1b0..2e8cba4ae2edee0a9998409c2cd2cb52f45bb7d9 100644 (file)
@@ -271,6 +271,9 @@ int network_verify(Network *network) {
         if (network->dhcp_use_gateway < 0)
                 network->dhcp_use_gateway = network->dhcp_use_routes;
 
+        if (network->ignore_carrier_loss < 0)
+                network->ignore_carrier_loss = network->configure_without_carrier;
+
         if (network->dhcp_critical >= 0) {
                 if (network->keep_configuration >= 0)
                         log_warning("%s: Both KeepConfiguration= and deprecated CriticalConnection= are set. "
@@ -332,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;
@@ -409,12 +413,15 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
                 .dhcp6_use_ntp = true,
                 .dhcp6_use_dns = true,
 
+                .dhcp6_pd_assign_prefix = true,
+
                 .dhcp_server_emit_dns = true,
                 .dhcp_server_emit_ntp = true,
                 .dhcp_server_emit_sip = true,
                 .dhcp_server_emit_router = true,
                 .dhcp_server_emit_timezone = true,
 
+                .router_prefix_subnet_id = -1,
                 .router_emit_dns = true,
                 .router_emit_domains = true,
 
@@ -460,6 +467,8 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
                 .ipv6_accept_ra_route_table_set = false,
                 .ipv6_accept_ra_start_dhcp6_client = true,
 
+                .configure_without_carrier = false,
+                .ignore_carrier_loss = -1,
                 .keep_configuration = _KEEP_CONFIGURATION_INVALID,
                 .ipv6_address_gen_mode = _LINK_IPV6_ADDRESS_GEN_MODE_INVALID,
                 .can_triple_sampling = -1,
@@ -514,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;
 
@@ -530,9 +539,22 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
                                   network->filename);
 
         struct stat stats;
-        if (stat(filename, &stats) < 0)
-                return -errno;
-        network->timestamp = timespec_load(&stats.st_mtim);
+        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. */
@@ -731,6 +753,9 @@ static Network *network_free(Network *network) {
         free(network->dhcp_server_dns);
         free(network->dhcp_server_ntp);
         free(network->dhcp_server_sip);
+        free(network->dhcp_server_pop3);
+        free(network->dhcp_server_smtp);
+        free(network->dhcp_server_lpr);
 
         set_free_free(network->dnssec_negative_trust_anchors);
 
@@ -741,6 +766,8 @@ static Network *network_free(Network *network) {
         ordered_hashmap_free(network->dhcp_server_send_options);
         ordered_hashmap_free(network->dhcp_server_send_vendor_options);
         ordered_hashmap_free(network->ipv6_tokens);
+        ordered_hashmap_free(network->dhcp6_client_send_options);
+        ordered_hashmap_free(network->dhcp6_client_send_vendor_options);
 
         return mfree(network);
 }