From d252fad6aa69aefa17b592111c2db23864f63907 Mon Sep 17 00:00:00 2001 From: Mu Qiao Date: Tue, 25 Jan 2011 10:31:53 +0000 Subject: [PATCH] shared-connection Signed-off-by: Mu Qiao --- system-settings/plugins/ifnet/connection_parser.c | 90 ++++++++++++++------ system-settings/plugins/ifnet/net_parser.c | 55 +++++++----- system-settings/plugins/ifnet/net_parser.h | 4 +- system-settings/plugins/ifnet/net_utils.c | 6 +- .../plugins/ifnet/nm-ifnet-connection.c | 8 +- system-settings/plugins/ifnet/wpa_parser.c | 21 +++-- 6 files changed, 122 insertions(+), 62 deletions(-) diff --git a/system-settings/plugins/ifnet/connection_parser.c b/system-settings/plugins/ifnet/connection_parser.c index f9fae51..9b5ddc1 100644 --- a/system-settings/plugins/ifnet/connection_parser.c +++ b/system-settings/plugins/ifnet/connection_parser.c @@ -557,7 +557,7 @@ make_ip4_setting (NMConnection * connection, gchar * conn_name, GError ** error) NMSettingIP4Config *ip4_setting = NM_SETTING_IP4_CONFIG (nm_setting_ip4_config_new ()); - gchar *value; + gchar *value, *method = NULL; gboolean is_static_block = is_static_ip4 (conn_name); ip_block *iblock = NULL; @@ -569,13 +569,41 @@ make_ip4_setting (NMConnection * connection, gchar * conn_name, GError ** error) && strstr (value, "nogateway") ? TRUE : FALSE, NULL); if (!is_static_block) { - g_object_set (ip4_setting, - NM_SETTING_IP4_CONFIG_METHOD, - NM_SETTING_IP4_CONFIG_METHOD_AUTO, - NM_SETTING_IP4_CONFIG_NEVER_DEFAULT, FALSE, NULL); - PLUGIN_PRINT (IFNET_PLUGIN_NAME, "Using DHCP for %s", - conn_name); - } else { + method = ifnet_get_data (conn_name, "config"); + if (!method){ + g_set_error (error, ifnet_plugin_error_quark (), 0, + "Unknown config for %s", conn_name); + g_object_unref (ip4_setting); + return; + } + if (!strcmp (method, "dhcp")) + g_object_set (ip4_setting, + NM_SETTING_IP4_CONFIG_METHOD, + NM_SETTING_IP4_CONFIG_METHOD_AUTO, + NM_SETTING_IP4_CONFIG_NEVER_DEFAULT, FALSE, NULL); + else if (!strcmp (method, "autoip")){ + g_object_set (ip4_setting, + NM_SETTING_IP4_CONFIG_METHOD, + NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL, + NM_SETTING_IP4_CONFIG_NEVER_DEFAULT, FALSE, NULL); + nm_connection_add_setting (connection, NM_SETTING (ip4_setting)); + return; + } else if (!strcmp (method, "shared")){ + g_object_set (ip4_setting, + NM_SETTING_IP4_CONFIG_METHOD, + NM_SETTING_IP4_CONFIG_METHOD_SHARED, + NM_SETTING_IP4_CONFIG_NEVER_DEFAULT, FALSE, NULL); + nm_connection_add_setting (connection, NM_SETTING (ip4_setting)); + return; + } else { + g_set_error (error, ifnet_plugin_error_quark (), 0, + "Unknown config for %s", conn_name); + g_object_unref (ip4_setting); + return; + } + PLUGIN_PRINT (IFNET_PLUGIN_NAME, "Using %s method for %s", + method, conn_name); + }else { iblock = convert_ip4_config_block (conn_name); if (!iblock) { g_set_error (error, ifnet_plugin_error_quark (), 0, @@ -625,7 +653,7 @@ make_ip4_setting (NMConnection * connection, gchar * conn_name, GError ** error) } /* add dhcp hostname and client id */ - if (!is_static_block) { + if (method && !strcmp (method, "dhcp")) { gchar *dhcp_hostname, *client_id; get_dhcp_hostname_and_client_id (&dhcp_hostname, &client_id); @@ -712,7 +740,6 @@ make_ip4_setting (NMConnection * connection, gchar * conn_name, GError ** error) iblock = iblock->next; destroy_ip_block (current_iblock); } - /* Finally add setting to connection */ nm_connection_add_setting (connection, NM_SETTING (ip4_setting)); } @@ -1243,10 +1270,10 @@ parse_wpa_psk (gchar * psk, GError ** error) * the passphrase contains spaces. */ - p = psk; - if (p[0] == '"' && psk[strlen (psk) - 1] == '"') + p = g_strdup (psk); + if (p[0] == '"' && p[strlen (p) - 1] == '"') quoted = TRUE; - if (!quoted && (strlen (psk) == 64)) { + if (!quoted && (strlen (p) == 64)) { /* Verify the hex PSK; 64 digits */ if (!is_hex (p)) { g_set_error (error, ifnet_plugin_error_quark (), @@ -1254,7 +1281,7 @@ parse_wpa_psk (gchar * psk, GError ** error) "Invalid WPA_PSK (contains non-hexadecimal characters)"); goto out; } - hashed = g_strdup (psk); + hashed = g_strdup (p); } else { strip_string (p, '"'); @@ -1276,6 +1303,7 @@ parse_wpa_psk (gchar * psk, GError ** error) } out: + g_free (p); return hashed; } @@ -2085,7 +2113,8 @@ write_wireless_security_setting (NMConnection * connection, } else if (!strcmp (key_mgmt, "wpa-eap")) { wpa_set_data (conn_name, "key_mgmt", "WPA-EAP"); wpa = TRUE; - } + } else + PLUGIN_WARN (IFNET_PLUGIN_NAME, "Unknown key_mgmt: %s", key_mgmt); if (auth_alg) { if (!strcmp (auth_alg, "shared")) @@ -2180,8 +2209,11 @@ write_wireless_security_setting (NMConnection * connection, g_string_append (quoted, psk); g_string_append_c (quoted, '"'); } - wpa_set_data (conn_name, "psk", - quoted ? quoted->str : (gchar *) psk); + if (psk) + wpa_set_data (conn_name, "psk", + quoted ? quoted->str : (gchar *) psk); + else + PLUGIN_WARN (IFNET_PLUGIN_NAME, "Use WPA, but no psk received from NM"); if (quoted) g_string_free (quoted, TRUE); } else @@ -2190,15 +2222,19 @@ write_wireless_security_setting (NMConnection * connection, return TRUE; } -/* remove old ssid and add new one*/ +/* Only remove old config when ssid is changed. + * See bug #350476. + * */ static void update_wireless_ssid (NMConnection * connection, gchar * conn_name, gchar * ssid, gboolean hex) { - ifnet_delete_network (conn_name); - ifnet_add_connection (ssid, "wireless"); + if (strcmp (conn_name, ssid)){ + ifnet_delete_network (conn_name); + wpa_delete_security (conn_name); + } - wpa_delete_security (conn_name); + ifnet_add_network (ssid, "wireless"); wpa_add_security (ssid); } @@ -2443,7 +2479,11 @@ write_ip4_setting (NMConnection * connection, gchar * conn_name, } ifnet_set_data (conn_name, "config", ips->str); g_string_free (ips, TRUE); - } else + } else if (!strcmp (value, NM_SETTING_IP4_CONFIG_METHOD_SHARED)) + ifnet_set_data (conn_name, "config", "shared"); + else if (!strcmp (value, NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL)) + ifnet_set_data (conn_name, "config", "autoip"); + else ifnet_set_data (conn_name, "config", "dhcp"); /* DNS Servers */ @@ -2858,7 +2898,7 @@ get_wired_name () for (; i < 256; i++) { gchar *conn_name = g_strdup_printf ("eth%d", i); - if (!ifnet_has_connection (conn_name)) { + if (!ifnet_has_network (conn_name)) { return conn_name; } else g_free (conn_name); @@ -2875,7 +2915,7 @@ get_ppp_name () for (; i < 256; i++) { gchar *conn_name = g_strdup_printf ("ppp%d", i); - if (!ifnet_has_connection (conn_name)) { + if (!ifnet_has_network (conn_name)) { return conn_name; } else g_free (conn_name); @@ -2982,7 +3022,7 @@ ifnet_add_new_connection (NMConnection * connection, goto out; } - if (ifnet_add_connection (new_name, new_type)) + if (ifnet_add_network (new_name, new_type)) success = ifnet_update_parsers_by_connection (connection, new_name, NULL, config_file, diff --git a/system-settings/plugins/ifnet/net_parser.c b/system-settings/plugins/ifnet/net_parser.c index b4a381d..de2db8a 100644 --- a/system-settings/plugins/ifnet/net_parser.c +++ b/system-settings/plugins/ifnet/net_parser.c @@ -37,6 +37,9 @@ static GList *functions_list; /* Used to decide whether to write changes to file*/ static gboolean net_parser_data_changed = FALSE; +static void +destroy_connection_config (GHashTable * conn); + static GHashTable * add_new_connection_config (const gchar * type, const gchar * name) { @@ -58,8 +61,10 @@ add_new_connection_config (const gchar * type, const gchar * name) } gboolean -ifnet_add_connection (gchar * name, gchar * type) +ifnet_add_network (gchar * name, gchar * type) { + if (ifnet_has_network (name)) + return TRUE; if (add_new_connection_config (type, name)) { PLUGIN_PRINT (IFNET_PLUGIN_NAME, "Adding network for %s", name); net_parser_data_changed = TRUE; @@ -69,11 +74,27 @@ ifnet_add_connection (gchar * name, gchar * type) } gboolean -ifnet_has_connection (gchar * conn_name) +ifnet_has_network (gchar * conn_name) { return g_hash_table_lookup (conn_table, conn_name) != NULL; } +gboolean +ifnet_delete_network (gchar * conn_name) +{ + GHashTable *network = NULL; + + g_return_val_if_fail (conn_table != NULL && conn_name != NULL, FALSE); + PLUGIN_PRINT (IFNET_PLUGIN_NAME, "Deleting network for %s", conn_name); + network = g_hash_table_lookup (conn_table, conn_name); + if (!network) + return FALSE; + g_hash_table_remove (conn_table, conn_name); + destroy_connection_config (network); + net_parser_data_changed = TRUE; + return TRUE; +} + static GHashTable * get_connection_config (gchar * name) { @@ -377,21 +398,27 @@ ifnet_set_data (gchar * conn_name, gchar * key, gchar * value) { gpointer orin_key = NULL, orin_value = NULL; GHashTable *conn = g_hash_table_lookup (conn_table, conn_name); + gchar *new_value = NULL; if (!conn) { PLUGIN_WARN (IFNET_PLUGIN_NAME, "%s does not exsit!", conn_name); return; } + if (value){ + new_value = g_strdup (value); + strip_string (new_value, '"'); + } /* Remove existing key value pair */ if (g_hash_table_lookup_extended (conn, key, &orin_key, &orin_value)) { + if (new_value && !strcmp (orin_value, new_value)) + return; g_hash_table_remove (conn, orin_key); g_free (orin_key); g_free (orin_value); } - if (value) - g_hash_table_insert (conn, g_strdup (key), - strip_string (g_strdup (value), '"')); + if (new_value) + g_hash_table_insert (conn, g_strdup (key), new_value); net_parser_data_changed = TRUE; } @@ -467,7 +494,7 @@ ifnet_flush_to_file (gchar * config_file) gboolean result = FALSE; if (!net_parser_data_changed) - return FALSE; + return TRUE; if (!conn_table || !global_settings_table) return FALSE; @@ -583,22 +610,6 @@ ifnet_flush_to_file (gchar * config_file) return result; } -gboolean -ifnet_delete_network (gchar * conn_name) -{ - GHashTable *network = NULL; - - g_return_val_if_fail (conn_table != NULL && conn_name != NULL, FALSE); - PLUGIN_PRINT (IFNET_PLUGIN_NAME, "Deleting network for %s", conn_name); - network = g_hash_table_lookup (conn_table, conn_name); - if (!network) - return FALSE; - g_hash_table_remove (conn_table, conn_name); - destroy_connection_config (network); - net_parser_data_changed = TRUE; - return TRUE; -} - void ifnet_destroy (void) { diff --git a/system-settings/plugins/ifnet/net_parser.h b/system-settings/plugins/ifnet/net_parser.h index 73a44c8..b71a01f 100644 --- a/system-settings/plugins/ifnet/net_parser.h +++ b/system-settings/plugins/ifnet/net_parser.h @@ -36,11 +36,11 @@ GList *ifnet_get_connection_names (void); gchar *ifnet_get_data (gchar * conn_name, const gchar * key); gchar *ifnet_get_global_data (const gchar * key); gchar *ifnet_get_global_setting (gchar * group, gchar * key); -gboolean ifnet_has_connection (gchar * conn_name); +gboolean ifnet_has_network (gchar * conn_name); /* Writer functions */ gboolean ifnet_flush_to_file (gchar * config_file); void ifnet_set_data (gchar * conn_name, gchar * key, gchar * value); -gboolean ifnet_add_connection (gchar * name, gchar * type); +gboolean ifnet_add_network (gchar * name, gchar * type); gboolean ifnet_delete_network (gchar * conn_name); #endif diff --git a/system-settings/plugins/ifnet/net_utils.c b/system-settings/plugins/ifnet/net_utils.c index 2dc253c..83b4325 100644 --- a/system-settings/plugins/ifnet/net_utils.c +++ b/system-settings/plugins/ifnet/net_utils.c @@ -278,6 +278,10 @@ is_static_ip4 (gchar * conn_name) if (!data) return FALSE; + if (!strcmp (data, "shared")) + return FALSE; + if (!strcmp (data, "autoip")) + return FALSE; dhcp6 = strstr (data, "dhcp6"); if (dhcp6) { gchar *dhcp4; @@ -942,8 +946,8 @@ get_dhcp_hostname_and_client_id (char **hostname, char **client_id) else if ((tmp = strstr (line, "send host-name")) != NULL) { tmp += strlen ("send host-name"); g_strstrip (tmp); - strip_string (tmp, '"'); strip_string (tmp, ';'); + strip_string (tmp, '"'); if (tmp[0] != '\0') *hostname = g_strdup (tmp); else diff --git a/system-settings/plugins/ifnet/nm-ifnet-connection.c b/system-settings/plugins/ifnet/nm-ifnet-connection.c index e47495c..ebe2581 100644 --- a/system-settings/plugins/ifnet/nm-ifnet-connection.c +++ b/system-settings/plugins/ifnet/nm-ifnet-connection.c @@ -71,12 +71,14 @@ nm_ifnet_connection_new (gchar * conn_name) { NMConnection *tmp; GObject *object; - GError **error = NULL; + GError *error = NULL; g_return_val_if_fail (conn_name != NULL, NULL); - tmp = ifnet_update_connection_from_config_block (conn_name, error); - if (!tmp) + tmp = ifnet_update_connection_from_config_block (conn_name, &error); + if (!tmp){ + g_error_free (error); return NULL; + } object = (GObject *) g_object_new (NM_TYPE_IFNET_CONNECTION, NM_IFNET_CONNECTION_CONN_NAME, conn_name, NULL); diff --git a/system-settings/plugins/ifnet/wpa_parser.c b/system-settings/plugins/ifnet/wpa_parser.c index 5e94108..42c52c3 100644 --- a/system-settings/plugins/ifnet/wpa_parser.c +++ b/system-settings/plugins/ifnet/wpa_parser.c @@ -366,7 +366,7 @@ wpa_flush_to_file (gchar * config_file) gboolean result = FALSE; if (!wpa_parser_data_changed) - return FALSE; + return TRUE; if (!wsec_table || !wsec_global_table) return FALSE; @@ -450,26 +450,29 @@ wpa_set_data (gchar * ssid, gchar * key, gchar * value) { gpointer orig_key = NULL, orig_value = NULL; GHashTable *security = g_hash_table_lookup (wsec_table, ssid); + gchar *new_value = NULL; g_return_if_fail (security != NULL); + if (value){ + new_value = g_strdup(value); + if (strcmp (key, "ssid") != 0 && strcmp (key, "psk") != 0 + && !g_str_has_prefix (key, "wep_key")) + strip_string (new_value, '"'); + } /* Remove old key value pairs */ if (g_hash_table_lookup_extended (security, key, &orig_key, &orig_value)) { + if (new_value && !strcmp(orig_value, new_value)) + return; g_hash_table_remove (security, orig_key); g_free (orig_key); g_free (orig_value); } /* Add new key value */ - if (value) { - gchar *new_value = g_strdup (value); - - if (strcmp (key, "ssid") != 0 && strcmp (key, "psk") != 0 - && !g_str_has_prefix (key, "wep_key")) - strip_string (new_value, '"'); + if (new_value) g_hash_table_insert (security, g_strdup (key), new_value); - } wpa_parser_data_changed = TRUE; } @@ -483,7 +486,7 @@ gboolean wpa_add_security (gchar * ssid) { if (wpa_has_security (ssid)) - return FALSE; + return TRUE; else { GHashTable *security = g_hash_table_new (g_str_hash, g_str_equal); -- 1.7.3.4