diff options
author | Dan Williams <dcbw@redhat.com> | 2013-04-19 11:44:28 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2013-05-28 12:26:56 -0500 |
commit | f73d066382726e6d47852e676013e478983ce9df (patch) | |
tree | 003038b080d3978c51ce632785dec8a35c5f1e85 | |
parent | 689dadaffbe0ba6f078a0bf3b8d5106788c289eb (diff) | |
download | NetworkManager-f73d066382726e6d47852e676013e478983ce9df.tar.gz |
ifnet: don't require a conn_name when creating an ifnet connection
If the connection doesn't yet have a conn_name, that means it's not
yet saved to disk.
-rw-r--r-- | src/settings/plugins/ifnet/nm-ifnet-connection.c | 97 | ||||
-rw-r--r-- | src/settings/plugins/ifnet/nm-ifnet-connection.h | 4 | ||||
-rw-r--r-- | src/settings/plugins/ifnet/plugin.c | 19 |
3 files changed, 68 insertions, 52 deletions
diff --git a/src/settings/plugins/ifnet/nm-ifnet-connection.c b/src/settings/plugins/ifnet/nm-ifnet-connection.c index 3bc356fc47..57aab6b55f 100644 --- a/src/settings/plugins/ifnet/nm-ifnet-connection.c +++ b/src/settings/plugins/ifnet/nm-ifnet-connection.c @@ -37,11 +37,6 @@ G_DEFINE_TYPE (NMIfnetConnection, nm_ifnet_connection, NM_TYPE_SETTINGS_CONNECTION) #define NM_IFNET_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_IFNET_CONNECTION, NMIfnetConnectionPrivate)) -enum { - PROP_ZERO, - PROP_CONN_NAME, - _PROP_END, -}; enum { IFNET_SETUP_MONITORS, @@ -57,20 +52,20 @@ typedef struct { } NMIfnetConnectionPrivate; NMIfnetConnection * -nm_ifnet_connection_new (const char *conn_name, NMConnection *source) +nm_ifnet_connection_new (NMConnection *source, const char *conn_name) { NMConnection *tmp; GObject *object; GError *error = NULL; gboolean update_unsaved = TRUE; - g_return_val_if_fail (conn_name != NULL, NULL); + g_return_val_if_fail (source || conn_name, NULL); if (source) tmp = g_object_ref (source); else { tmp = ifnet_update_connection_from_config_block (conn_name, NULL, &error); - if (!tmp){ + if (!tmp) { g_error_free (error); return NULL; } @@ -80,6 +75,7 @@ nm_ifnet_connection_new (const char *conn_name, NMConnection *source) } object = (GObject *) g_object_new (NM_TYPE_IFNET_CONNECTION, NULL); + g_assert (object); NM_IFNET_CONNECTION_GET_PRIVATE (object)->conn_name = g_strdup (conn_name); nm_settings_connection_replace_settings (NM_SETTINGS_CONNECTION (object), tmp, @@ -109,29 +105,48 @@ commit_changes (NMSettingsConnection *connection, GError *error = NULL; NMIfnetConnectionPrivate *priv = NM_IFNET_CONNECTION_GET_PRIVATE (connection); gchar *new_name = NULL; + gboolean success = FALSE; g_signal_emit (connection, signals[IFNET_CANCEL_MONITORS], 0); - if (!ifnet_update_parsers_by_connection (NM_CONNECTION (connection), - priv->conn_name, - CONF_NET_FILE, - WPA_SUPPLICANT_CONF, - &new_name, - NULL, - &error)) { - PLUGIN_PRINT (IFNET_PLUGIN_NAME, "Failed to update %s", priv->conn_name); + + if (priv->conn_name) { + /* Existing connection; update it */ + success = ifnet_update_parsers_by_connection (NM_CONNECTION (connection), + priv->conn_name, + CONF_NET_FILE, + WPA_SUPPLICANT_CONF, + &new_name, + NULL, + &error); + } else { + /* New connection, add it */ + success = ifnet_add_new_connection (NM_CONNECTION (connection), + CONF_NET_FILE, + WPA_SUPPLICANT_CONF, + &new_name, + NULL, + &error); + if (success) + reload_parsers (); + } + + if (success) { + /* update connection name */ + g_assert (new_name); + g_free (priv->conn_name); + priv->conn_name = new_name; + + NM_SETTINGS_CONNECTION_CLASS (nm_ifnet_connection_parent_class)->commit_changes (connection, callback, user_data); + PLUGIN_PRINT (IFNET_PLUGIN_NAME, "Successfully updated %s", priv->conn_name); + } else { + PLUGIN_PRINT (IFNET_PLUGIN_NAME, "Failed to update %s", + priv->conn_name ? priv->conn_name : + nm_connection_get_id (NM_CONNECTION (connection))); reload_parsers (); callback (connection, error, user_data); g_error_free (error); - g_signal_emit (connection, signals[IFNET_SETUP_MONITORS], 0); - return; } - g_free (priv->conn_name); - priv->conn_name = new_name; - - NM_SETTINGS_CONNECTION_CLASS (nm_ifnet_connection_parent_class)->commit_changes (connection, callback, user_data); - PLUGIN_PRINT (IFNET_PLUGIN_NAME, "Successfully updated %s", priv->conn_name); - g_signal_emit (connection, signals[IFNET_SETUP_MONITORS], 0); } @@ -144,31 +159,32 @@ do_delete (NMSettingsConnection *connection, NMIfnetConnectionPrivate *priv = NM_IFNET_CONNECTION_GET_PRIVATE (connection); g_signal_emit (connection, signals[IFNET_CANCEL_MONITORS], 0); - if (!ifnet_delete_connection_in_parsers (priv->conn_name, CONF_NET_FILE, WPA_SUPPLICANT_CONF, NULL)) { - PLUGIN_PRINT (IFNET_PLUGIN_NAME, "Failed to delete %s", - priv->conn_name); - reload_parsers (); - callback (connection, error, user_data); - g_error_free (error); - g_signal_emit (connection, signals[IFNET_SETUP_MONITORS], 0); - return; + + /* Only connections which exist in /etc/conf.d/net will have a conn_name */ + if (priv->conn_name) { + if (!ifnet_delete_connection_in_parsers (priv->conn_name, CONF_NET_FILE, WPA_SUPPLICANT_CONF, NULL)) { + PLUGIN_PRINT (IFNET_PLUGIN_NAME, "Failed to delete %s", priv->conn_name); + reload_parsers (); + callback (connection, error, user_data); + g_error_free (error); + g_signal_emit (connection, signals[IFNET_SETUP_MONITORS], 0); + return; + } } NM_SETTINGS_CONNECTION_CLASS (nm_ifnet_connection_parent_class)->delete (connection, callback, user_data); - PLUGIN_PRINT (IFNET_PLUGIN_NAME, "Successfully deleted %s", - priv->conn_name); g_signal_emit (connection, signals[IFNET_SETUP_MONITORS], 0); + + PLUGIN_PRINT (IFNET_PLUGIN_NAME, "Successfully deleted %s", + priv->conn_name ? priv->conn_name : + nm_connection_get_id (NM_CONNECTION (connection))); } static void finalize (GObject * object) { - NMIfnetConnectionPrivate *priv = - NM_IFNET_CONNECTION_GET_PRIVATE (object); - g_return_if_fail (priv); - - g_free (priv->conn_name); + g_free (NM_IFNET_CONNECTION_GET_PRIVATE (object)->conn_name); G_OBJECT_CLASS (nm_ifnet_connection_parent_class)->finalize (object); } @@ -178,8 +194,7 @@ nm_ifnet_connection_class_init (NMIfnetConnectionClass * ifnet_connection_class) GObjectClass *object_class = G_OBJECT_CLASS (ifnet_connection_class); NMSettingsConnectionClass *settings_class = NM_SETTINGS_CONNECTION_CLASS (ifnet_connection_class); - g_type_class_add_private (ifnet_connection_class, - sizeof (NMIfnetConnectionPrivate)); + g_type_class_add_private (ifnet_connection_class, sizeof (NMIfnetConnectionPrivate)); object_class->finalize = finalize; settings_class->delete = do_delete; diff --git a/src/settings/plugins/ifnet/nm-ifnet-connection.h b/src/settings/plugins/ifnet/nm-ifnet-connection.h index 7055dca8b0..1cb67c3410 100644 --- a/src/settings/plugins/ifnet/nm-ifnet-connection.h +++ b/src/settings/plugins/ifnet/nm-ifnet-connection.h @@ -44,8 +44,8 @@ typedef struct { GType nm_ifnet_connection_get_type (void); -NMIfnetConnection *nm_ifnet_connection_new (const char *conn_name, - NMConnection *source); +NMIfnetConnection *nm_ifnet_connection_new (NMConnection *source, + const char *conn_name); const char *nm_ifnet_connection_get_conn_name (NMIfnetConnection *connection); diff --git a/src/settings/plugins/ifnet/plugin.c b/src/settings/plugins/ifnet/plugin.c index be410ae083..486f893514 100644 --- a/src/settings/plugins/ifnet/plugin.c +++ b/src/settings/plugins/ifnet/plugin.c @@ -260,7 +260,7 @@ reload_connections (gpointer config) const char *conn_name = n_iter->data; /* read the new connection */ - new = nm_ifnet_connection_new (conn_name, NULL); + new = nm_ifnet_connection_new (NULL, conn_name); if (!new) continue; @@ -321,7 +321,12 @@ reload_connections (gpointer config) /* remove deleted/unused connections */ g_hash_table_iter_init (&iter, priv->connections); while (g_hash_table_iter_next (&iter, (gpointer) &uuid, (gpointer) &candidate)) { - if (!g_hash_table_lookup (new_connections, uuid)) { + /* only saved connections (which have a conn_name) get removed; unsaved + * ones obviously don't exist in /etc/conf.d/net yet and shouldn't get + * blown away by net file changes. + */ + if ( nm_ifnet_connection_get_conn_name (NM_IFNET_CONNECTION (candidate)) + && !g_hash_table_lookup (new_connections, uuid)) { nm_settings_connection_signal_remove (candidate); g_hash_table_iter_remove (&iter); } @@ -453,16 +458,12 @@ get_connections (NMSystemConfigInterface *config) NMIfnetConnection *connection; PLUGIN_PRINT (IFNET_PLUGIN_NAME, "(%p) ... get_connections.", config); - if (priv->unmanaged_well_known) { - PLUGIN_PRINT (IFNET_PLUGIN_NAME, - "(%p) ... get_connections (managed=false): return empty list.", - config); - return NULL; - } g_hash_table_iter_init (&iter, priv->connections); while (g_hash_table_iter_next (&iter, NULL, (gpointer) &connection)) { - if (is_managed (nm_ifnet_connection_get_conn_name (connection))) + const char *conn_name = nm_ifnet_connection_get_conn_name (connection); + + if (!conn_name || (!priv->unmanaged_well_known && is_managed (conn_name))) connections = g_slist_prepend (connections, connection); } PLUGIN_PRINT (IFNET_PLUGIN_NAME, "(%p) connections count: %d", |