diff options
Diffstat (limited to 'src/settings/plugins/ifcfg-rh/reader.c')
| -rw-r--r-- | src/settings/plugins/ifcfg-rh/reader.c | 78 |
1 files changed, 43 insertions, 35 deletions
diff --git a/src/settings/plugins/ifcfg-rh/reader.c b/src/settings/plugins/ifcfg-rh/reader.c index af5d2910..5a351cfa 100644 --- a/src/settings/plugins/ifcfg-rh/reader.c +++ b/src/settings/plugins/ifcfg-rh/reader.c @@ -1621,26 +1621,29 @@ check_if_bond_slave (shvarFile *ifcfg, */ } -static void +static gboolean check_if_team_slave (shvarFile *ifcfg, NMSettingConnection *s_con) { - char *value; + gs_free char *value = NULL; - value = svGetValue (ifcfg, "DEVICETYPE", FALSE); - if (!value) - return; - if (strcasecmp (value, TYPE_TEAM_PORT)) { - g_free (value); - return; - } - g_free (value); value = svGetValue (ifcfg, "TEAM_MASTER", FALSE); if (!value) - return; + return FALSE; g_object_set (s_con, NM_SETTING_CONNECTION_MASTER, value, NULL); g_object_set (s_con, NM_SETTING_CONNECTION_SLAVE_TYPE, NM_SETTING_TEAM_SETTING_NAME, NULL); - g_free (value); + return TRUE; +} + +static void +check_if_slave (shvarFile *ifcfg, + NMSettingConnection *s_con) +{ + g_return_if_fail (NM_IS_SETTING_CONNECTION (s_con)); + + if (check_if_team_slave (ifcfg, s_con)) + return; + check_if_bond_slave (ifcfg, s_con); } typedef struct { @@ -3157,14 +3160,6 @@ make_wpa_setting (shvarFile *ifcfg, if (allow_rsn && svGetValueBoolean (ifcfg, "WPA_ALLOW_WPA2", TRUE)) nm_setting_wireless_security_add_proto (wsec, "rsn"); - /* If neither WPA_ALLOW_WPA or WPA_ALLOW_WPA2 were present, default - * to both WPA and RSN allowed. - */ - if (!allow_wpa && !allow_rsn && !ieee8021x) { - nm_setting_wireless_security_add_proto (wsec, "wpa"); - nm_setting_wireless_security_add_proto (wsec, "rsn"); - } - g_free (allow_wpa); g_free (allow_rsn); } @@ -3211,6 +3206,12 @@ make_wpa_setting (shvarFile *ifcfg, } g_free (value); + + value = svGetValue (ifcfg, "SECURITYMODE", FALSE); + if (NM_IN_STRSET (value, NULL, "open")) + g_object_set (wsec, NM_SETTING_WIRELESS_SECURITY_AUTH_ALG, value, NULL); + + g_free (value); return (NMSetting *) wsec; error: @@ -3948,8 +3949,7 @@ wired_connection_from_ifcfg (const char *file, g_object_unref (connection); return NULL; } - check_if_bond_slave (ifcfg, NM_SETTING_CONNECTION (con_setting)); - check_if_team_slave (ifcfg, NM_SETTING_CONNECTION (con_setting)); + check_if_slave (ifcfg, (NMSettingConnection *) con_setting); nm_connection_add_setting (connection, con_setting); wired_setting = make_wired_setting (ifcfg, file, &s_8021x, error); @@ -4099,8 +4099,7 @@ infiniband_connection_from_ifcfg (const char *file, g_object_unref (connection); return NULL; } - check_if_bond_slave (ifcfg, NM_SETTING_CONNECTION (con_setting)); - check_if_team_slave (ifcfg, NM_SETTING_CONNECTION (con_setting)); + check_if_slave (ifcfg, (NMSettingConnection *) con_setting); nm_connection_add_setting (connection, con_setting); infiniband_setting = make_infiniband_setting (ifcfg, file, error); @@ -4237,6 +4236,7 @@ bond_connection_from_ifcfg (const char *file, static char * read_team_config (shvarFile *ifcfg, const char *key, GError **error) { + gs_free_error GError *local_error = NULL; char *value; size_t l; @@ -4257,6 +4257,12 @@ read_team_config (shvarFile *ifcfg, const char *key, GError **error) return NULL; } svUnescape (value); + + if (value && value[0] && !_nm_utils_check_valid_json (value, &local_error)) { + PARSE_WARNING ("ignoring invalid team configuration: %s", local_error->message); + g_clear_pointer (&value, g_free); + } + return value; } @@ -4599,8 +4605,6 @@ is_bond_device (const char *name, shvarFile *parsed) if (svGetValueBoolean (parsed, "BONDING_MASTER", FALSE)) return TRUE; - - /* XXX: Check for "bond[\d]+"? */ return FALSE; } @@ -4816,8 +4820,7 @@ vlan_connection_from_ifcfg (const char *file, g_object_unref (connection); return NULL; } - check_if_bond_slave (ifcfg, NM_SETTING_CONNECTION (con_setting)); - check_if_team_slave (ifcfg, NM_SETTING_CONNECTION (con_setting)); + check_if_slave (ifcfg, (NMSettingConnection *) con_setting); nm_connection_add_setting (connection, con_setting); vlan_setting = make_vlan_setting (ifcfg, file, error); @@ -4848,7 +4851,7 @@ create_unhandled_connection (const char *filename, shvarFile *ifcfg, NMSetting *s_con; char *value; - g_assert (out_spec != NULL); + nm_assert (out_spec && !*out_spec); connection = nm_simple_connection_new (); @@ -4963,8 +4966,7 @@ connection_from_file_full (const char *filename, const char *ifcfg_name = NULL; g_return_val_if_fail (filename != NULL, NULL); - if (out_unhandled) - g_return_val_if_fail (*out_unhandled == NULL, NULL); + g_return_val_if_fail (out_unhandled && !*out_unhandled, NULL); /* Non-NULL only for unit tests; normally use /etc/sysconfig/network */ if (!network_file) @@ -4982,8 +4984,6 @@ connection_from_file_full (const char *filename, return NULL; if (!svGetValueBoolean (parsed, "NM_CONTROLLED", TRUE)) { - g_assert (out_unhandled != NULL); - connection = create_unhandled_connection (filename, parsed, "unmanaged", out_unhandled); if (!connection) g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED, @@ -5011,6 +5011,16 @@ connection_from_file_full (const char *filename, type = g_strdup (TYPE_ETHERNET); g_free (devtype); } + if (!type) { + gs_free char *t = NULL; + + /* Team and TeamPort types are also accepted by the mere + * presense of TEAM_CONFIG/TEAM_MASTER. They don't require + * DEVICETYPE. */ + t = svGetValue (parsed, "TEAM_CONFIG", FALSE); + if (t) + type = g_strdup (TYPE_TEAM); + } if (!type) type = svGetValue (parsed, "TYPE", FALSE); @@ -5136,8 +5146,6 @@ connection_from_file_full (const char *filename, else if (!strcasecmp (type, TYPE_BRIDGE)) connection = bridge_connection_from_ifcfg (filename, parsed, error); else { - g_assert (out_unhandled != NULL); - connection = create_unhandled_connection (filename, parsed, "unrecognized", out_unhandled); if (!connection) PARSE_WARNING ("connection type was unrecognized but device was not uniquely identified; device may be managed"); |