]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: store netdev drop-in paths and dump into state file
authorMike Yuan <me@yhndnzj.com>
Sat, 7 Sep 2024 17:51:55 +0000 (19:51 +0200)
committerMike Yuan <me@yhndnzj.com>
Mon, 9 Sep 2024 21:20:41 +0000 (23:20 +0200)
src/network/netdev/netdev.c
src/network/netdev/netdev.h
src/network/networkd-state-file.c

index 2b411425ba1670faad343972460aa7480a33d89a..cc32e6d1a6ecfd26fe2964fc624164c5a73b5280 100644 (file)
@@ -215,6 +215,7 @@ static NetDev *netdev_free(NetDev *netdev) {
 
         condition_free_list(netdev->conditions);
         free(netdev->filename);
+        strv_free(netdev->dropins);
         free(netdev->description);
         free(netdev->ifname);
 
@@ -832,7 +833,9 @@ int netdev_load_one(Manager *manager, const char *filename) {
                         NETDEV_VTABLE(netdev)->sections,
                         config_item_perf_lookup, network_netdev_gperf_lookup,
                         CONFIG_PARSE_WARN,
-                        netdev, NULL, NULL);
+                        netdev,
+                        NULL,
+                        &netdev->dropins);
         if (r < 0)
                 return r; /* config_parse_many() logs internally. */
 
index 3bfecda6d89a4fb7f1af1fa3d9141c63114360ba..d6b363d4f1729c785bf6453bc19cf84442e5bf09 100644 (file)
@@ -116,6 +116,7 @@ typedef struct NetDev {
         unsigned n_ref;
 
         char *filename;
+        char **dropins;
 
         LIST_HEAD(Condition, conditions);
 
index a313d5a6a8650a3fa3bbdda1f07e8532e3b61564..d89097b4285bf1844dd61df78d7cac5f46e0ec43 100644 (file)
@@ -561,6 +561,30 @@ static void link_save_domains(Link *link, FILE *f, OrderedSet *static_domains, U
         }
 }
 
+static int serialize_config_files(FILE *f, const char *prefix, const char *main_config, char * const *dropins) {
+        assert(f);
+        assert(prefix);
+        assert(main_config);
+
+        fprintf(f, "%s_FILE=%s\n", prefix, main_config);
+
+        bool space = false;
+
+        fprintf(f, "%s_FILE_DROPINS=\"", prefix);
+        STRV_FOREACH(d, dropins) {
+                _cleanup_free_ char *escaped = NULL;
+
+                escaped = xescape(*d, ":");
+                if (!escaped)
+                        return -ENOMEM;
+
+                fputs_with_separator(f, escaped, ":", &space);
+        }
+        fputs("\"\n", f);
+
+        return 0;
+}
+
 static int link_save(Link *link) {
         const char *admin_state, *oper_state, *carrier_state, *address_state, *ipv4_address_state, *ipv6_address_state;
         _cleanup_(unlink_and_freep) char *temp_path = NULL;
@@ -622,19 +646,15 @@ static int link_save(Link *link) {
                 fprintf(f, "ACTIVATION_POLICY=%s\n",
                         activation_policy_to_string(link->network->activation_policy));
 
-                fprintf(f, "NETWORK_FILE=%s\n", link->network->filename);
-
-                fputs("NETWORK_FILE_DROPINS=\"", f);
-                STRV_FOREACH(d, link->network->dropins) {
-                        _cleanup_free_ char *escaped = NULL;
-
-                        escaped = xescape(*d, ":");
-                        if (!escaped)
-                                return -ENOMEM;
+                r = serialize_config_files(f, "NETWORK", link->network->filename, link->network->dropins);
+                if (r < 0)
+                        return r;
 
-                        fputs_with_separator(f, escaped, ":", &space);
+                if (link->netdev) {
+                        r = serialize_config_files(f, "NETDEV", link->netdev->filename, link->netdev->dropins);
+                        if (r < 0)
+                                return r;
                 }
-                fputs("\"\n", f);
 
                 /************************************************************/
 
@@ -759,8 +779,9 @@ static int link_save(Link *link) {
                 if (!set_isempty(nta_anchors)) {
                         const char *n;
 
-                        fputs("DNSSEC_NTA=", f);
                         space = false;
+
+                        fputs("DNSSEC_NTA=", f);
                         SET_FOREACH(n, nta_anchors)
                                 fputs_with_separator(f, n, NULL, &space);
                         fputc('\n', f);
@@ -775,9 +796,7 @@ static int link_save(Link *link) {
                 if (r < 0)
                         return r;
 
-                fprintf(f,
-                        "DHCP_LEASE=%s\n",
-                        link->lease_file);
+                fprintf(f, "DHCP_LEASE=%s\n", link->lease_file);
         } else
                 (void) unlink(link->lease_file);