459 lines
15 KiB
Diff
459 lines
15 KiB
Diff
From d252fad6aa69aefa17b592111c2db23864f63907 Mon Sep 17 00:00:00 2001
|
|
From: Mu Qiao <qiaomuf@gentoo.org>
|
|
Date: Tue, 25 Jan 2011 10:31:53 +0000
|
|
Subject: [PATCH] shared-connection
|
|
|
|
Signed-off-by: Mu Qiao <qiaomuf@gentoo.org>
|
|
---
|
|
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
|
|
|