summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-12-19 13:26:36 +0100
committerThomas Haller <thaller@redhat.com>2019-12-21 12:41:48 +0100
commit81e6fe963e42bf81704d11f4725f05cd7b6cf497 (patch)
treef0447a0946570d1a30837eb3c996b3c1c2937d01
parent3fa86a463c29ca51b9fddc1434f0eed68beaf6c8 (diff)
downloadNetworkManager-81e6fe963e42bf81704d11f4725f05cd7b6cf497.tar.gz
ifcfg-rh: add functions to detect well-known ifcfg-rh keys
This adds a lot of meta-data about how we handle ifcfg-rh. We will use this to prune/delete all variables that are not explicitly set (dirty) but also well-known. We could now easily emit a warning when an ifcfg-rh file contains unused key. We also could add more meta-data for each key. For example, we write different files (ifcfg- and keys- files). We could add flags to indicate that variables are valid in certain files. Currently that's not done. Also, for simple properties we could associate the key with the NMSetting property, and treat does generically, like keyfile does. Anyway, there are potentials. For now, we will use this to clear dirty variables.
-rw-r--r--src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c299
-rw-r--r--src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h49
-rw-r--r--src/settings/plugins/ifcfg-rh/shvar.c17
-rw-r--r--src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-wpa-psk2
-rw-r--r--src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-write-unknown-424
-rw-r--r--src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-write-unknown-4.expected14
-rw-r--r--src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c100
7 files changed, 467 insertions, 38 deletions
diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c
index d514768357..b8a66924f5 100644
--- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c
+++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c
@@ -620,3 +620,302 @@ nms_ifcfg_rh_utils_is_numbered_tag_impl (const char *key,
NM_SET_OUT (out_idx, idx);
return TRUE;
}
+
+/*****************************************************************************/
+
+#define _KEY_TYPE(key, flags) { .key_name = ""key"", .key_flags = ((NMS_IFCFG_KEY_TYPE_WELL_KNOWN) | (flags)), }
+
+const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[] = {
+ _KEY_TYPE ("ACD_TIMEOUT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("ADDRESS", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
+ _KEY_TYPE ("ARPING_WAIT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("AUTH_RETRIES", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("AUTOCONNECT_PRIORITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("AUTOCONNECT_RETRIES", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("AUTOCONNECT_SLAVES", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("BAND", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("BONDING_MASTER", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("BONDING_OPTS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("BOOTPROTO", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("BRIDGE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("BRIDGE_MACADDR", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("BRIDGE_PORT_VLANS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("BRIDGE_UUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("BRIDGE_VLANS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("BRIDGING_OPTS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("BROWSER_ONLY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("BSSID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("CHANNEL", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("CIPHER_GROUP", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("CIPHER_PAIRWISE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("CONNECTED_MODE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("CONNECTION_METERED", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("CTCPROT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DCB", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_APP_FCOE_ADVERTISE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_APP_FCOE_ENABLE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_APP_FCOE_MODE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DCB_APP_FCOE_PRIORITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_APP_FCOE_WILLING, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_APP_FIP_ADVERTISE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_APP_FIP_ENABLE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DCB_APP_FIP_PRIORITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_APP_FIP_WILLING, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_APP_ISCSI_ADVERTISE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_APP_ISCSI_ENABLE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DCB_APP_ISCSI_PRIORITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_APP_ISCSI_WILLING, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_PFC_ADVERTISE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_PFC_ENABLE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_PFC_UP, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_PFC_WILLING, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_PG_ADVERTISE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_PG_ENABLE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_PG_ID, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_PG_PCT, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_PG_STRICT, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_PG_UP2TC, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_PG_UPPCT, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE (KEY_DCB_PG_WILLING, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DEFAULTKEY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DEFROUTE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DELAY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DEVICE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DEVICETYPE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DEVTIMEOUT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DHCPV6C", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DHCPV6_DUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DHCPV6_HOSTNAME", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DHCPV6_HOSTNAME_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DHCPV6_IAID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DHCPV6_SEND_HOSTNAME", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DHCP_CLIENT_ID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DHCP_FQDN", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DHCP_HOSTNAME", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DHCP_HOSTNAME_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DHCP_IAID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DHCP_SEND_HOSTNAME", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DHCPv6_DUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DHCPv6_IAID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("DNS", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
+ _KEY_TYPE ("DOMAIN", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("ESSID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("ETHTOOL_OPTS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("ETHTOOL_WAKE_ON_LAN", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("FILS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("FILTER", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
+ _KEY_TYPE ("GATEWAY", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
+ _KEY_TYPE ("GATEWAYDEV", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("GATEWAY_PING_TIMEOUT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("GENERATE_MAC_ADDRESS_MASK", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("GVRP", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("HWADDR", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("HWADDR_BLACKLIST", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_ALTSUBJECT_MATCHES", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_ANON_IDENTITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_AUTH_TIMEOUT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_CA_CERT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_CA_CERT_PASSWORD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_CA_CERT_PASSWORD_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_CLIENT_CERT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_CLIENT_CERT_PASSWORD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_CLIENT_CERT_PASSWORD_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_DOMAIN_SUFFIX_MATCH", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_EAP_METHODS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_FAST_PROVISIONING", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_IDENTITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_INNER_AUTH_METHODS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_INNER_CA_CERT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_INNER_CA_CERT_PASSWORD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_INNER_CA_CERT_PASSWORD_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_INNER_CLIENT_CERT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_INNER_CLIENT_CERT_PASSWORD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_INNER_CLIENT_CERT_PASSWORD_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_INNER_PRIVATE_KEY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_INNER_PRIVATE_KEY_PASSWORD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_INNER_PRIVATE_KEY_PASSWORD_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_OPTIONAL", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_PAC_FILE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_PASSWORD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_PASSWORD_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_PASSWORD_RAW", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_PASSWORD_RAW_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_PEAP_FORCE_NEW_LABEL", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_PEAP_VERSION", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_PHASE1_AUTH_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_PHASE2_ALTSUBJECT_MATCHES", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_PHASE2_DOMAIN_SUFFIX_MATCH", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_PHASE2_SUBJECT_MATCH", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_PRIVATE_KEY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_PRIVATE_KEY_PASSWORD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_PRIVATE_KEY_PASSWORD_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_SUBJECT_MATCH", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IEEE_8021X_SYSTEM_CA_CERTS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPADDR", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
+ _KEY_TYPE ("IPV4_DHCP_TIMEOUT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV4_DNS_PRIORITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV4_FAILURE_FATAL", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV4_ROUTE_METRIC", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV4_ROUTE_TABLE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6ADDR", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6ADDR_SECONDARIES", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6FORWARDING", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6INIT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6TUNNELIPV4", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6_ADDR_GEN_MODE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6_AUTOCONF", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6_DEFAULTDEV", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6_DEFAULTGW", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6_DEFROUTE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6_DISABLED", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6_DNS_PRIORITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6_DOMAIN", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6_FAILURE_FATAL", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6_PEERDNS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6_PEERROUTES", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6_PRIVACY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6_PRIVACY_PREFER_PUBLIC_IP", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6_RES_OPTIONS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6_ROUTE_METRIC", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6_ROUTE_TABLE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("IPV6_TOKEN", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("KEY", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
+ _KEY_TYPE ("KEY_MGMT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("KEY_PASSPHRASE", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
+ _KEY_TYPE ("KEY_TYPE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("LLDP", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("LLMNR", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("MACADDR", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("MAC_ADDRESS_RANDOMIZATION", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("MASTER", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("MASTER_UUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("MATCH_INTERFACE_NAME", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("MDNS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("METRIC", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
+ _KEY_TYPE ("MODE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("MTU", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("MULTI_CONNECT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("MVRP", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("NAME", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("NETMASK", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
+ _KEY_TYPE ("NETTYPE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("NM_CONTROLLED", NMS_IFCFG_KEY_TYPE_IS_PLAIN | NMS_IFCFG_KEY_TYPE_KEEP_WHEN_DIRTY ),
+ _KEY_TYPE ("NM_USER_", NMS_IFCFG_KEY_TYPE_IS_PREFIX ),
+ _KEY_TYPE ("ONBOOT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("OPTIONS", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
+ _KEY_TYPE ("OVS_PORT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("OVS_PORT_UUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("PAC_SCRIPT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("PAC_URL", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("PEERDNS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("PEERROUTES", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("PHYSDEV", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("PKEY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("PMF", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("PORTNAME", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("POWERSAVE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("PREFIX", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
+ _KEY_TYPE ("PROXY_METHOD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("QDISC", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
+ _KEY_TYPE ("REORDER_HDR", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("RES_OPTIONS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("ROUTING_RULE6_", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
+ _KEY_TYPE ("ROUTING_RULE_", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
+ _KEY_TYPE ("SEARCH", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("SECONDARY_UUIDS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("SECURITYMODE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("SLAVE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("SRIOV_AUTOPROBE_DRIVERS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("SRIOV_TOTAL_VFS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("SRIOV_VF", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
+ _KEY_TYPE ("SSID_HIDDEN", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("STABLE_ID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("STP", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("SUBCHANNELS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("TEAM_CONFIG", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("TEAM_MASTER", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("TEAM_MASTER_UUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("TEAM_PORT_CONFIG", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("TYPE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("USERS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("UUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("VLAN", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("VLAN_EGRESS_PRIORITY_MAP", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("VLAN_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("VLAN_ID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("VLAN_INGRESS_PRIORITY_MAP", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("WEP_KEY_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("WPA_ALLOW_WPA", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("WPA_ALLOW_WPA2", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("WPA_PSK", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("WPA_PSK_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("WPS_METHOD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("ZONE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+};
+
+const NMSIfcfgKeyTypeInfo *
+nms_ifcfg_well_known_key_find_info (const char *key, gssize *out_idx)
+{
+ gssize idx;
+
+ G_STATIC_ASSERT (G_STRUCT_OFFSET (NMSIfcfgKeyTypeInfo, key_name) == 0);
+
+ idx = nm_utils_array_find_binary_search (nms_ifcfg_well_known_keys,
+ sizeof (nms_ifcfg_well_known_keys[0]),
+ G_N_ELEMENTS (nms_ifcfg_well_known_keys),
+ &key,
+ nm_strcmp_p_with_data,
+ NULL);
+ NM_SET_OUT (out_idx, idx);
+ if (idx < 0)
+ return NULL;
+ return &nms_ifcfg_well_known_keys[idx];
+}
+
+const NMSIfcfgKeyTypeInfo *
+nms_ifcfg_rh_utils_is_well_known_key (const char *key)
+{
+ const NMSIfcfgKeyTypeInfo *ti;
+ gssize idx;
+
+ nm_assert (key);
+
+ ti = nms_ifcfg_well_known_key_find_info (key, &idx);
+
+ if (ti) {
+ if (NM_FLAGS_ANY (ti->key_flags, NMS_IFCFG_KEY_TYPE_IS_PLAIN
+ | NMS_IFCFG_KEY_TYPE_IS_NUMBERED)) {
+ /* these tags are valid on full match. */
+ return ti;
+ }
+ nm_assert (NM_FLAGS_HAS (ti->key_flags, NMS_IFCFG_KEY_TYPE_IS_PREFIX));
+ /* a prefix tag needs some extra words afterwards. */
+ return NULL;
+ }
+
+ /* Not found. Maybe it's a numbered/prefixed key? With idx we got the index where
+ * we should insert the key. Since the numbered/prefixed keys share a prefix, we can
+ * find the possible prefix at the index before the insert position. */
+ idx = ~idx;
+ if (idx == 0)
+ return NULL;
+
+ ti = &nms_ifcfg_well_known_keys[idx - 1];
+
+ if (NM_FLAGS_HAS (ti->key_flags, NMS_IFCFG_KEY_TYPE_IS_NUMBERED)) {
+ if (nms_ifcfg_rh_utils_is_numbered_tag (key, ti->key_name, NULL))
+ return ti;
+ return NULL;
+ }
+
+ if (NM_FLAGS_HAS (ti->key_flags, NMS_IFCFG_KEY_TYPE_IS_PREFIX)) {
+ gsize l = strlen (ti->key_name);
+
+ if ( strncmp (key, ti->key_name, l) == 0
+ && key[l] != '\0')
+ return ti;
+ return NULL;
+ }
+
+ return NULL;
+}
diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h
index bcbc87e5c6..734a6a63c2 100644
--- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h
+++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h
@@ -11,6 +11,45 @@
#include "shvar.h"
+/*****************************************************************************/
+
+typedef enum {
+ NMS_IFCFG_KEY_TYPE_UNKNOWN = 0,
+ NMS_IFCFG_KEY_TYPE_WELL_KNOWN = (1u << 0),
+
+ NMS_IFCFG_KEY_TYPE_IS_PLAIN = (1u << 1),
+ NMS_IFCFG_KEY_TYPE_IS_NUMBERED = (1u << 2),
+ NMS_IFCFG_KEY_TYPE_IS_PREFIX = (1u << 3),
+
+ /* by default, well knowns keys that are not explicitly set
+ * by the writer (the unvisited, dirty ones) are removed.
+ * With this flag, such keys are kept if they are present. */
+ NMS_IFCFG_KEY_TYPE_KEEP_WHEN_DIRTY = (1u << 4),
+
+} NMSIfcfgKeyTypeFlags;
+
+typedef struct {
+ const char *key_name;
+ NMSIfcfgKeyTypeFlags key_flags;
+} NMSIfcfgKeyTypeInfo;
+
+const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[225];
+
+const NMSIfcfgKeyTypeInfo *nms_ifcfg_well_known_key_find_info (const char *key, gssize *out_idx);
+
+static inline NMSIfcfgKeyTypeFlags
+nms_ifcfg_well_known_key_find_info_flags (const char *key)
+{
+ const NMSIfcfgKeyTypeInfo *ti;
+
+ ti = nms_ifcfg_well_known_key_find_info (key, NULL);
+ if (!ti)
+ return NMS_IFCFG_KEY_TYPE_UNKNOWN;
+ return ti->key_flags;
+}
+
+/*****************************************************************************/
+
gboolean nms_ifcfg_rh_utils_parse_unhandled_spec (const char *unhandled_spec,
const char **out_unmanaged_spec,
const char **out_unrecognized_spec);
@@ -51,6 +90,12 @@ _nms_ifcfg_rh_utils_numbered_tag (char *buf, gsize buf_len, const char *tag_name
{
gsize l;
+#if NM_MORE_ASSERTS > 5
+ nm_assert (NM_FLAGS_ALL (nms_ifcfg_well_known_key_find_info_flags (tag_name),
+ NMS_IFCFG_KEY_TYPE_WELL_KNOWN
+ | NMS_IFCFG_KEY_TYPE_IS_NUMBERED));
+#endif
+
l = g_strlcpy (buf, tag_name, buf_len);
nm_assert (l < buf_len);
if (which != -1) {
@@ -90,6 +135,10 @@ nms_ifcfg_rh_utils_is_numbered_tag (const char *key,
/*****************************************************************************/
+const NMSIfcfgKeyTypeInfo *nms_ifcfg_rh_utils_is_well_known_key (const char *key);
+
+/*****************************************************************************/
+
extern const char *const _nm_ethtool_ifcfg_names[_NM_ETHTOOL_ID_FEATURE_NUM];
static inline const char *
diff --git a/src/settings/plugins/ifcfg-rh/shvar.c b/src/settings/plugins/ifcfg-rh/shvar.c
index 19e9ef3659..7da0666814 100644
--- a/src/settings/plugins/ifcfg-rh/shvar.c
+++ b/src/settings/plugins/ifcfg-rh/shvar.c
@@ -62,6 +62,19 @@ struct _shvarFile {
/*****************************************************************************/
+#define ASSERT_key_is_well_known(key) \
+ nm_assert ( ({ \
+ const char *_key = (key); \
+ gboolean _is_wellknown = TRUE; \
+ \
+ if (!nms_ifcfg_rh_utils_is_well_known_key (_key)) { \
+ _is_wellknown = FALSE; \
+ g_critical ("ifcfg-rh key \"%s\" is not well-known", _key); \
+ } \
+ \
+ _is_wellknown; \
+ }) )
+
/**
* svParseBoolean:
* @value: the input string
@@ -1017,6 +1030,8 @@ _svGetValue (shvarFile *s, const char *key, char **to_free)
nm_assert (_shell_is_name (key, -1));
nm_assert (to_free);
+ ASSERT_key_is_well_known (key);
+
line = NULL;
c_list_for_each (current, &s->lst_head) {
l = c_list_entry (current, shvarLine, lst);
@@ -1252,6 +1267,8 @@ svSetValue (shvarFile *s, const char *key, const char *value)
nm_assert (_shell_is_name (key, -1));
+ ASSERT_key_is_well_known (key);
+
line = NULL;
c_list_for_each (current, &s->lst_head) {
l = c_list_entry (current, shvarLine, lst);
diff --git a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-wpa-psk b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-wpa-psk
index a78051aad4..4ab45ae39b 100644
--- a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-wpa-psk
+++ b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-wpa-psk
@@ -16,4 +16,4 @@ CIPHER_GROUP="TKIP CCMP WEP40 WEP104"
KEY_MGMT=WPA-PSK
WPA_ALLOW_WPA=yes
WPA_ALLOW_WPA2=yes
-LAST_ENTRY=no-newline \ No newline at end of file
+CTCPROT=no-newline \ No newline at end of file
diff --git a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-write-unknown-4 b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-write-unknown-4
index 2c1b7fb4ea..f834464eb9 100644
--- a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-write-unknown-4
+++ b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-write-unknown-4
@@ -5,32 +5,32 @@
# don't consider only line-by-line, thus this is
# expected.
#
-# Also note that setting NAME will replace the last
+# Also note that setting IPADDR will replace the last
# occurrence, and delete all previous once.
#L1
-NAME=l2
+IPADDR=l2
#L2
-NAME=l3
+IPADDR=l3
-some_key1=''
-some_key2=$'\U0x'
-some_key3=$'x\U0'
+METRIC1=''
+METRIC2=$'\U0x'
+METRIC3=$'x\U0'
#L4
-NAME='
-NAME=l4x
+IPADDR='
+IPADDR=l4x
'
#Lx-1
-NAME2=not-visible
+IPADDR2=not-visible
#Lx-2
-NAME2='invalid
+IPADDR2='invalid
#Lx-3
#Ly-1
-NAME3='invalid
+IPADDR3='invalid
#Ly-2
-NAME3=name3-value
+IPADDR3=name3-value
#Ly-3
diff --git a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-write-unknown-4.expected b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-write-unknown-4.expected
index cf3f45bd12..040ddc9d7d 100644
--- a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-write-unknown-4.expected
+++ b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-write-unknown-4.expected
@@ -5,27 +5,27 @@
# don't consider only line-by-line, thus this is
# expected.
#
-# Also note that setting NAME will replace the last
+# Also note that setting IPADDR will replace the last
# occurrence, and delete all previous once.
#L1
#L2
-some_key1=''
-some_key2=$'\U0x'
-some_key3=$'x\U0'
+METRIC1=''
+METRIC2=$'\U0x'
+METRIC3=$'x\U0'
#L4
-NAME=set-by-test1
+IPADDR=set-by-test1
#NM: '
#Lx-1
#Lx-2
-NAME2=set-by-test2
+IPADDR2=set-by-test2
#Lx-3
#Ly-1
#Ly-2
-NAME3=set-by-test3
+IPADDR3=set-by-test3
#Ly-3
diff --git a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
index 74f8afc907..762af6de10 100644
--- a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
+++ b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
@@ -2868,7 +2868,7 @@ test_ifcfg_no_trailing_newline (void)
shvarFile *sv;
sv = _svOpenFile (TEST_IFCFG_DIR"/ifcfg-test-wifi-wpa-psk");
- _svGetValue_check (sv, "LAST_ENTRY", "no-newline");
+ _svGetValue_check (sv, "CTCPROT", "no-newline");
svCloseFile (sv);
}
@@ -9781,23 +9781,23 @@ test_write_unknown (gconstpointer test_data)
_nmtst_svFileSetModified (sv);
if (g_str_has_suffix (testfile, "ifcfg-test-write-unknown-4")) {
- _svGetValue_check (sv, "NAME", "l4x");
- _svGetValue_check (sv, "NAME2", "");
- _svGetValue_check (sv, "NAME3", "name3-value");
-
- svSetValue (sv, "NAME", "set-by-test1");
- svSetValue (sv, "NAME2", NULL);
- svSetValue (sv, "NAME2", "set-by-test2");
- svSetValue (sv, "NAME3", "set-by-test3");
-
- _svGetValue_check (sv, "some_key", NULL);
- _svGetValue_check (sv, "some_key1", "");
- _svGetValue_check (sv, "some_key2", "");
- _svGetValue_check (sv, "some_key3", "x");
-
- _svGetValue_check (sv, "NAME", "set-by-test1");
- _svGetValue_check (sv, "NAME2", "set-by-test2");
- _svGetValue_check (sv, "NAME3", "set-by-test3");
+ _svGetValue_check (sv, "IPADDR", "l4x");
+ _svGetValue_check (sv, "IPADDR2", "");
+ _svGetValue_check (sv, "IPADDR3", "name3-value");
+
+ svSetValue (sv, "IPADDR", "set-by-test1");
+ svSetValue (sv, "IPADDR2", NULL);
+ svSetValue (sv, "IPADDR2", "set-by-test2");
+ svSetValue (sv, "IPADDR3", "set-by-test3");
+
+ _svGetValue_check (sv, "METRIC", NULL);
+ _svGetValue_check (sv, "METRIC1", "");
+ _svGetValue_check (sv, "METRIC2", "");
+ _svGetValue_check (sv, "METRIC3", "x");
+
+ _svGetValue_check (sv, "IPADDR", "set-by-test1");
+ _svGetValue_check (sv, "IPADDR2", "set-by-test2");
+ _svGetValue_check (sv, "IPADDR3", "set-by-test3");
}
success = svWriteFile (sv, 0644, &error);
@@ -10242,6 +10242,69 @@ test_tc_write (void)
/*****************************************************************************/
+static void
+test_well_known_keys (void)
+{
+ gsize i;
+
+ for (i = 0; i < G_N_ELEMENTS (nms_ifcfg_well_known_keys); i++) {
+ const NMSIfcfgKeyTypeInfo *ti = &nms_ifcfg_well_known_keys[i];
+
+ g_assert (ti->key_name);
+ g_assert (ti->key_name[0]);
+ g_assert (NM_FLAGS_HAS (ti->key_flags, NMS_IFCFG_KEY_TYPE_WELL_KNOWN));
+ g_assert (nm_utils_is_power_of_two (ti->key_flags & ( NMS_IFCFG_KEY_TYPE_IS_PLAIN
+ | NMS_IFCFG_KEY_TYPE_IS_NUMBERED
+ | NMS_IFCFG_KEY_TYPE_IS_PREFIX)));
+ }
+
+ for (i = 1; i < G_N_ELEMENTS (nms_ifcfg_well_known_keys); i++) {
+ const NMSIfcfgKeyTypeInfo *ti_prev = &nms_ifcfg_well_known_keys[i - 1];
+ const NMSIfcfgKeyTypeInfo *ti = &nms_ifcfg_well_known_keys[i];
+
+ g_assert_cmpstr (ti_prev->key_name, <, ti->key_name);
+ }
+
+ for (i = 0; i < G_N_ELEMENTS (nms_ifcfg_well_known_keys); i++) {
+ const NMSIfcfgKeyTypeInfo *ti = &nms_ifcfg_well_known_keys[i];
+ gs_free char *key_name = NULL;
+ gssize idx;
+
+ g_assert (ti == nms_ifcfg_well_known_key_find_info (ti->key_name, &idx));
+ g_assert_cmpint (i, ==, idx);
+
+ key_name = g_strdup (ti->key_name);
+ g_assert (ti == nms_ifcfg_well_known_key_find_info (key_name, &idx));
+ g_assert_cmpint (i, ==, idx);
+ }
+
+#define _test_well_known(key, expected) \
+ G_STMT_START { \
+ const NMSIfcfgKeyTypeInfo *_ti; \
+ const char *_expected = (expected); \
+ \
+ _ti = nms_ifcfg_rh_utils_is_well_known_key (""key""); \
+ if (!_expected) { \
+ g_assert (!_ti); \
+ } else { \
+ g_assert (_ti); \
+ g_assert_cmpstr (_ti->key_name, ==, _expected); \
+ } \
+ } G_STMT_END
+
+#define _test_well_known_plain(key) \
+ _test_well_known (""key"", ""key"")
+
+ _test_well_known_plain ("ONBOOT");
+ _test_well_known ("NM_USER_", NULL);
+ _test_well_known ("NM_USER_x", "NM_USER_");
+ _test_well_known ("IPADDR", "IPADDR");
+ _test_well_known ("IPADDR1", "IPADDR");
+ _test_well_known ("IPADDRx", NULL);
+}
+
+/*****************************************************************************/
+
#define TPATH "/settings/plugins/ifcfg-rh/"
#define TEST_IFCFG_WIFI_OPEN_SSID_LONG_QUOTED TEST_IFCFG_DIR"/ifcfg-test-wifi-open-ssid-long-quoted"
@@ -10538,6 +10601,7 @@ int main (int argc, char **argv)
g_test_add_func (TPATH "tc/read", test_tc_read);
g_test_add_func (TPATH "tc/write", test_tc_write);
+ g_test_add_func (TPATH "utils/test_well_known_keys", test_well_known_keys);
return g_test_run ();
}