From 2cf9b1a0eed7bcd85543e19ba6f0d26767fe1163 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Sat, 7 Sep 2024 19:51:55 +0200 Subject: [PATCH] network: store netdev drop-in paths and dump into state file --- src/network/netdev/netdev.c | 5 +++- src/network/netdev/netdev.h | 1 + src/network/networkd-state-file.c | 49 +++++++++++++++++++++---------- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/network/netdev/netdev.c b/src/network/netdev/netdev.c index 2b411425ba1..cc32e6d1a6e 100644 --- a/src/network/netdev/netdev.c +++ b/src/network/netdev/netdev.c @@ -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. */ diff --git a/src/network/netdev/netdev.h b/src/network/netdev/netdev.h index 3bfecda6d89..d6b363d4f17 100644 --- a/src/network/netdev/netdev.h +++ b/src/network/netdev/netdev.h @@ -116,6 +116,7 @@ typedef struct NetDev { unsigned n_ref; char *filename; + char **dropins; LIST_HEAD(Condition, conditions); diff --git a/src/network/networkd-state-file.c b/src/network/networkd-state-file.c index a313d5a6a86..d89097b4285 100644 --- a/src/network/networkd-state-file.c +++ b/src/network/networkd-state-file.c @@ -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); -- 2.47.3