about summary refs log tree commit diff
path: root/src/libnm-core-impl
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2022-02-19 17:19:17 +0100
committerMichael Biebl <biebl@debian.org>2022-02-19 17:19:17 +0100
commite3f2ee969d065d2971170563c8aef77d5a0d39b9 (patch)
tree94454d4e2fe0955c09516f18dc4e84a6cf7139fa /src/libnm-core-impl
parent2f94dba7385fd0e0ef19a06eb4a2fcf6c43d7946 (diff)
New upstream version 1.35.92 upstream/1.35.92
Diffstat (limited to 'src/libnm-core-impl')
-rw-r--r--src/libnm-core-impl/nm-keyfile-utils.c19
-rw-r--r--src/libnm-core-impl/nm-keyfile.c133
-rw-r--r--src/libnm-core-impl/tests/test-setting.c18
3 files changed, 96 insertions, 74 deletions
diff --git a/src/libnm-core-impl/nm-keyfile-utils.c b/src/libnm-core-impl/nm-keyfile-utils.c
index 0e2e2d45..c599aefa 100644
--- a/src/libnm-core-impl/nm-keyfile-utils.c
+++ b/src/libnm-core-impl/nm-keyfile-utils.c
@@ -682,3 +682,22 @@ nm_keyfile_key_decode(const char *key, char **out_to_free)
 #endif
     return name;
 }
+
+void
+nm_keyfile_add_group(GKeyFile *keyfile, const char *group)
+{
+    nm_assert(keyfile);
+    nm_assert(group);
+
+    /* You can only call this function if the group doesn't exist yet.
+     * Because, we are about to add a dummy key, so we would have to
+     * be sure that the key doesn't exist. */
+    nm_assert(!g_key_file_has_group(keyfile, group));
+
+    /* Ensure the group is present.
+     * There is no API for that, so add and remove a dummy key.
+     * For a profile it matters whether a setting is present or not,
+     * and we need to ensure that we persist the presence of the setting to keyfile*/
+    g_key_file_set_value(keyfile, group, ".X", "1");
+    g_key_file_remove_key(keyfile, group, ".X", NULL);
+}
diff --git a/src/libnm-core-impl/nm-keyfile.c b/src/libnm-core-impl/nm-keyfile.c
index 4ff9b582..dce53ae2 100644
--- a/src/libnm-core-impl/nm-keyfile.c
+++ b/src/libnm-core-impl/nm-keyfile.c
@@ -2305,8 +2305,21 @@ wired_s390_options_writer_full(KeyfileWriterInfo        *info,
 {
     NMSettingWired *s_wired = NM_SETTING_WIRED(setting);
     guint           i, n;
+    const char     *setting_alias;
 
     n = nm_setting_wired_get_num_s390_options(s_wired);
+    if (n == 0)
+        return;
+
+    setting_alias = nm_keyfile_plugin_get_alias_for_setting_name(NM_SETTING_WIRED_SETTING_NAME);
+    if (!g_key_file_has_group(info->keyfile, NM_SETTING_WIRED_SETTING_NAME)
+        && !g_key_file_has_group(info->keyfile, setting_alias)) {
+        /* groups in the keyfile are ordered. When we are about to add [ethernet-s390-options],
+         * we want to also have an [ethernet] group, first. */
+
+        nm_keyfile_add_group(info->keyfile, setting_alias ?: NM_SETTING_WIRED_SETTING_NAME);
+    }
+
     for (i = 0; i < n; i++) {
         gs_free char *key_to_free = NULL;
         const char   *opt_key;
@@ -2755,6 +2768,11 @@ struct _ParseInfoProperty {
      * default value. By setting this flag to TRUE, also
      * default values are written. */
     bool writer_persist_default : 1;
+
+    /*  This flag indicates that the property should always
+     * be written to keyfile, even if it's the default.
+     * This is currently only implemented for STRV properties. */
+    bool always_write : 1;
 };
 
 #define PARSE_INFO_PROPERTY(_property_name, ...) \
@@ -2856,53 +2874,57 @@ static const ParseInfoSetting *const parse_infos[_NM_META_SETTING_TYPE_NUM] = {
         NM_META_SETTING_TYPE_INFINIBAND,
         PARSE_INFO_PROPERTIES(PARSE_INFO_PROPERTY(NM_SETTING_INFINIBAND_MAC_ADDRESS,
                                                   .parser = mac_address_parser_INFINIBAND, ), ), ),
-    PARSE_INFO_SETTING(NM_META_SETTING_TYPE_IP4_CONFIG,
-                       PARSE_INFO_PROPERTIES(
-                           PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ADDRESSES,
-                                               .parser_no_check_key = TRUE,
-                                               .parser              = ip_address_or_route_parser,
-                                               .writer              = addr_writer, ),
-                           PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_DNS,
-                                               .parser_no_check_key = TRUE,
-                                               .parser              = ip_dns_parser,
-                                               .writer              = dns_writer, ),
-                           PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_GATEWAY, .writer_skip = TRUE, ),
-                           PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ROUTES,
-                                               .parser_no_check_key = TRUE,
-                                               .parser              = ip_address_or_route_parser,
-                                               .writer              = route_writer, ),
-                           PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ROUTING_RULES,
-                                               .parser_no_check_key = TRUE,
-                                               .parser_full         = ip_routing_rule_parser_full,
-                                               .writer_full         = ip_routing_rule_writer_full,
-                                               .has_parser_full     = TRUE,
-                                               .has_writer_full     = TRUE, ), ), ),
-    PARSE_INFO_SETTING(NM_META_SETTING_TYPE_IP6_CONFIG,
-                       PARSE_INFO_PROPERTIES(
-                           PARSE_INFO_PROPERTY(NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE,
-                                               .parser_no_check_key    = TRUE,
-                                               .parser                 = ip6_addr_gen_mode_parser,
-                                               .writer                 = ip6_addr_gen_mode_writer,
-                                               .writer_persist_default = TRUE, ),
-                           PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ADDRESSES,
-                                               .parser_no_check_key = TRUE,
-                                               .parser              = ip_address_or_route_parser,
-                                               .writer              = addr_writer, ),
-                           PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_DNS,
-                                               .parser_no_check_key = TRUE,
-                                               .parser              = ip_dns_parser,
-                                               .writer              = dns_writer, ),
-                           PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_GATEWAY, .writer_skip = TRUE, ),
-                           PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ROUTES,
-                                               .parser_no_check_key = TRUE,
-                                               .parser              = ip_address_or_route_parser,
-                                               .writer              = route_writer, ),
-                           PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ROUTING_RULES,
-                                               .parser_no_check_key = TRUE,
-                                               .parser_full         = ip_routing_rule_parser_full,
-                                               .writer_full         = ip_routing_rule_writer_full,
-                                               .has_parser_full     = TRUE,
-                                               .has_writer_full     = TRUE, ), ), ),
+    PARSE_INFO_SETTING(
+        NM_META_SETTING_TYPE_IP4_CONFIG,
+        PARSE_INFO_PROPERTIES(
+            PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ADDRESSES,
+                                .parser_no_check_key = TRUE,
+                                .parser              = ip_address_or_route_parser,
+                                .writer              = addr_writer, ),
+            PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_DNS,
+                                .parser_no_check_key = TRUE,
+                                .parser              = ip_dns_parser,
+                                .writer              = dns_writer, ),
+            PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_DNS_OPTIONS, .always_write = TRUE, ),
+            PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_GATEWAY, .writer_skip = TRUE, ),
+            PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ROUTES,
+                                .parser_no_check_key = TRUE,
+                                .parser              = ip_address_or_route_parser,
+                                .writer              = route_writer, ),
+            PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ROUTING_RULES,
+                                .parser_no_check_key = TRUE,
+                                .parser_full         = ip_routing_rule_parser_full,
+                                .writer_full         = ip_routing_rule_writer_full,
+                                .has_parser_full     = TRUE,
+                                .has_writer_full     = TRUE, ), ), ),
+    PARSE_INFO_SETTING(
+        NM_META_SETTING_TYPE_IP6_CONFIG,
+        PARSE_INFO_PROPERTIES(
+            PARSE_INFO_PROPERTY(NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE,
+                                .parser_no_check_key    = TRUE,
+                                .parser                 = ip6_addr_gen_mode_parser,
+                                .writer                 = ip6_addr_gen_mode_writer,
+                                .writer_persist_default = TRUE, ),
+            PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ADDRESSES,
+                                .parser_no_check_key = TRUE,
+                                .parser              = ip_address_or_route_parser,
+                                .writer              = addr_writer, ),
+            PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_DNS,
+                                .parser_no_check_key = TRUE,
+                                .parser              = ip_dns_parser,
+                                .writer              = dns_writer, ),
+            PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_DNS_OPTIONS, .always_write = TRUE, ),
+            PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_GATEWAY, .writer_skip = TRUE, ),
+            PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ROUTES,
+                                .parser_no_check_key = TRUE,
+                                .parser              = ip_address_or_route_parser,
+                                .writer              = route_writer, ),
+            PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ROUTING_RULES,
+                                .parser_no_check_key = TRUE,
+                                .parser_full         = ip_routing_rule_parser_full,
+                                .writer_full         = ip_routing_rule_writer_full,
+                                .has_parser_full     = TRUE,
+                                .has_writer_full     = TRUE, ), ), ),
     PARSE_INFO_SETTING(
         NM_META_SETTING_TYPE_OVS_EXTERNAL_IDS,
         PARSE_INFO_PROPERTIES(PARSE_INFO_PROPERTY(NM_SETTING_OVS_EXTERNAL_IDS_DATA,
@@ -3936,11 +3958,13 @@ write_setting_value(KeyfileWriterInfo        *info,
         char **array;
 
         array = (char **) g_value_get_boxed(&value);
-        nm_keyfile_plugin_kf_set_string_list(info->keyfile,
-                                             setting_info->setting_name,
-                                             key,
-                                             (const char **const) array,
-                                             g_strv_length(array));
+        if ((g_strv_length(array) != 0) || (pip && pip->always_write)) {
+            nm_keyfile_plugin_kf_set_string_list(info->keyfile,
+                                                 setting_info->setting_name,
+                                                 key,
+                                                 (const char **const) array,
+                                                 g_strv_length(array));
+        }
     } else if (type == G_TYPE_HASH_TABLE) {
         write_hash_of_string(info->keyfile, setting, key, &value);
     } else if (type == G_TYPE_ARRAY) {
@@ -4190,10 +4214,7 @@ nm_keyfile_write(NMConnection         *connection,
             || g_key_file_has_group(info.keyfile, setting_name)) {
             /* we have a section for the setting. Nothing to do. */
         } else {
-            /* ensure the group is present. There is no API for that, so add and remove
-             * a dummy key. */
-            g_key_file_set_value(info.keyfile, setting_alias ?: setting_name, ".X", "1");
-            g_key_file_remove_key(info.keyfile, setting_alias ?: setting_name, ".X", NULL);
+            nm_keyfile_add_group(info.keyfile, setting_alias ?: setting_name);
         }
 
         if (NM_IS_SETTING_WIREGUARD(setting)) {
diff --git a/src/libnm-core-impl/tests/test-setting.c b/src/libnm-core-impl/tests/test-setting.c
index d6ac37b4..b260ac37 100644
--- a/src/libnm-core-impl/tests/test-setting.c
+++ b/src/libnm-core-impl/tests/test-setting.c
@@ -3587,20 +3587,16 @@ test_roundtrip_conversion(gconstpointer test_data)
                             "uuid=%s\n"
                             "type=ethernet\n"
                             "interface-name=%s\n"
-                            "permissions=\n"
                             "\n"
                             "[ethernet]\n"
-                            "mac-address-blacklist=\n"
                             "%s" /* mtu */
                             "\n"
                             "%s" /* [ethernet-s390-options] */
                             "[ipv4]\n"
-                            "dns-search=\n"
                             "method=auto\n"
                             "\n"
                             "[ipv6]\n"
                             "addr-gen-mode=stable-privacy\n"
-                            "dns-search=\n"
                             "method=auto\n"
                             "\n"
                             "[proxy]\n"
@@ -3618,20 +3614,16 @@ test_roundtrip_conversion(gconstpointer test_data)
                             "uuid=%s\n"
                             "type=ethernet\n"
                             "interface-name=%s\n"
-                            "permissions=\n"
                             "\n"
                             "[ethernet]\n"
-                            "mac-address-blacklist=\n"
                             "%s" /* mtu */
                             "\n"
                             "%s" /* [ethernet-s390-options] */
                             "[ipv4]\n"
-                            "dns-search=\n"
                             "method=auto\n"
                             "\n"
                             "[ipv6]\n"
                             "addr-gen-mode=stable-privacy\n"
-                            "dns-search=\n"
                             "method=auto\n"
                             "",
                             ID,
@@ -3661,17 +3653,14 @@ test_roundtrip_conversion(gconstpointer test_data)
                                         "uuid=%s\n"
                                         "type=wireguard\n"
                                         "interface-name=%s\n"
-                                        "permissions=\n"
                                         "\n"
                                         "[wireguard]\n"
                                         "\n"
                                         "[ipv4]\n"
-                                        "dns-search=\n"
                                         "method=disabled\n"
                                         "\n"
                                         "[ipv6]\n"
                                         "addr-gen-mode=stable-privacy\n"
-                                        "dns-search=\n"
                                         "method=disabled\n"
                                         "\n"
                                         "[proxy]\n"
@@ -3713,7 +3702,6 @@ test_roundtrip_conversion(gconstpointer test_data)
                 "uuid=%s\n"
                 "type=wireguard\n"
                 "interface-name=%s\n"
-                "permissions=\n"
                 "\n"
                 "[wireguard]\n"
                 "%s" /* fwmark */
@@ -3723,12 +3711,10 @@ test_roundtrip_conversion(gconstpointer test_data)
                 "%s" /* [wireguard-peers*] */
                 "\n"
                 "[ipv4]\n"
-                "dns-search=\n"
                 "method=disabled\n"
                 "\n"
                 "[ipv6]\n"
                 "addr-gen-mode=stable-privacy\n"
-                "dns-search=\n"
                 "method=disabled\n"
                 "\n"
                 "[proxy]\n"
@@ -3798,14 +3784,11 @@ test_roundtrip_conversion(gconstpointer test_data)
                             "uuid=%s\n"
                             "type=ethernet\n"
                             "interface-name=%s\n"
-                            "permissions=\n"
                             "\n"
                             "[ethernet]\n"
-                            "mac-address-blacklist=\n"
                             "%s" /* mtu */
                             "\n"
                             "[ipv4]\n"
-                            "dns-search=\n"
                             "method=auto\n"
                             "routing-rule1=priority 1 from 0.0.0.0/0 table 1000\n"
                             "routing-rule2=priority 2 from 192.168.1.0/25 table 1001\n"
@@ -3813,7 +3796,6 @@ test_roundtrip_conversion(gconstpointer test_data)
                             "\n"
                             "[ipv6]\n"
                             "addr-gen-mode=stable-privacy\n"
-                            "dns-search=\n"
                             "method=auto\n"
                             "routing-rule1=priority 1 from ::/0 table 1000\n"
                             "routing-rule2=priority 2 from 1:2:3:b::/65 table 1001\n"