diff --git a/ChangeLog b/ChangeLog index 8f5b535b4b..9c063008da 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2008-11-19 Dan Williams + + * libnm-util/nm-connection.c + libnm-util/nm-connection.h + - (nm_connection_replace_settings): take a GError + + * libnm-glib/nm-settings.c + libnm-glib/nm-dbus-connection.c + src/nm-manager.c + system-settings/plugins/ifcfg-suse/nm-suse-connection.c + system-settings/plugins/keyfile/nm-keyfile-connection.c + system-settings/plugins/keyfile/plugin.c + - Handle, or don't handle, errors from nm_connection_replace_settings() + 2008-11-19 Dan Williams * libnm-util/libnm-util.ver diff --git a/libnm-glib/nm-dbus-connection.c b/libnm-glib/nm-dbus-connection.c index f027b0a272..631ee3c871 100644 --- a/libnm-glib/nm-dbus-connection.c +++ b/libnm-glib/nm-dbus-connection.c @@ -94,12 +94,20 @@ connection_updated_cb (DBusGProxy *proxy, GHashTable *settings, gpointer user_da { NMExportedConnection *exported = NM_EXPORTED_CONNECTION (user_data); NMConnection *wrapped; + GError *error = NULL; wrapped = nm_exported_connection_get_connection (exported); - if (nm_connection_replace_settings (wrapped, settings)) + if (nm_connection_replace_settings (wrapped, settings, &error)) nm_exported_connection_signal_updated (exported, settings); - else + else { + g_warning ("%s: '%s' / '%s' invalid: %d", + __func__, + error ? g_type_name (nm_connection_lookup_setting_type_by_quark (error->domain)) : "(none)", + (error && error->message) ? error->message : "(none)", + error ? error->code : -1); + g_clear_error (&error); nm_exported_connection_signal_removed (exported); + } } static void diff --git a/libnm-glib/nm-settings.c b/libnm-glib/nm-settings.c index ab860f9ddf..34516b766b 100644 --- a/libnm-glib/nm-settings.c +++ b/libnm-glib/nm-settings.c @@ -524,6 +524,7 @@ nm_exported_connection_update (NMExportedConnection *connection, GError **err) { gboolean success = TRUE; + GError *error = NULL; g_return_val_if_fail (NM_IS_EXPORTED_CONNECTION (connection), FALSE); g_return_val_if_fail (new_settings != NULL, FALSE); @@ -532,8 +533,16 @@ nm_exported_connection_update (NMExportedConnection *connection, success = EXPORTED_CONNECTION_CLASS (connection)->update (connection, new_settings, err); if (success) { - nm_connection_replace_settings (NM_EXPORTED_CONNECTION_GET_PRIVATE (connection)->wrapped, new_settings); - nm_exported_connection_signal_updated (connection, new_settings); + if (!nm_connection_replace_settings (NM_EXPORTED_CONNECTION_GET_PRIVATE (connection)->wrapped, new_settings, &error)) { + g_warning ("%s: '%s' / '%s' invalid: %d", + __func__, + error ? g_type_name (nm_connection_lookup_setting_type_by_quark (error->domain)) : "(none)", + (error && error->message) ? error->message : "(none)", + error ? error->code : -1); + g_clear_error (&error); + success = FALSE; + } else + nm_exported_connection_signal_updated (connection, new_settings); } return success; diff --git a/libnm-util/nm-connection.c b/libnm-util/nm-connection.c index e44a144c6e..c16f8a03a4 100644 --- a/libnm-util/nm-connection.c +++ b/libnm-util/nm-connection.c @@ -347,29 +347,30 @@ nm_connection_get_setting_by_name (NMConnection *connection, const char *name) return type ? nm_connection_get_setting (connection, type) : NULL; } +/** + * nm_connection_replace_settings: + * @connection: a #NMConnection + * @new_settings: a #GHashTable of settings + * @error: location to store error, or %NULL + * + * Returns: TRUE if the settings were valid and added to the connection, FALSE + * if they were not + **/ gboolean nm_connection_replace_settings (NMConnection *connection, - GHashTable *new_settings) + GHashTable *new_settings, + GError **error) { - GError *error = NULL; - + g_return_val_if_fail (connection != NULL, FALSE); g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE); g_return_val_if_fail (new_settings != NULL, FALSE); + if (error) + g_return_val_if_fail (*error == NULL, FALSE); g_hash_table_remove_all (NM_CONNECTION_GET_PRIVATE (connection)->settings); g_hash_table_foreach (new_settings, parse_one_setting, connection); - if (!nm_connection_verify (connection, &error)) { - g_warning ("%s: '%s' / '%s' invalid: %d", - __func__, - g_type_name (nm_connection_lookup_setting_type_by_quark (error->domain)), - error->message, - error->code); - g_error_free (error); - return FALSE; - } - - return TRUE; + return nm_connection_verify (connection, error); } typedef struct { diff --git a/libnm-util/nm-connection.h b/libnm-util/nm-connection.h index 27229356ba..749340bee6 100644 --- a/libnm-util/nm-connection.h +++ b/libnm-util/nm-connection.h @@ -92,7 +92,8 @@ NMSetting *nm_connection_get_setting_by_name (NMConnection *connection, const char *name); gboolean nm_connection_replace_settings (NMConnection *connection, - GHashTable *new_settings); + GHashTable *new_settings, + GError **error); /* Returns TRUE if the connections are the same */ gboolean nm_connection_compare (NMConnection *connection, diff --git a/src/nm-manager.c b/src/nm-manager.c index 5fc14ff7a3..bf0b40252b 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -970,7 +970,7 @@ connection_updated_cb (DBusGProxy *proxy, GHashTable *settings, gpointer user_da } g_object_unref (new_connection); - valid = nm_connection_replace_settings (old_connection, settings); + valid = nm_connection_replace_settings (old_connection, settings, NULL); if (valid) { g_signal_emit (manager, signals[CONNECTION_UPDATED], 0, old_connection, diff --git a/system-settings/plugins/ifcfg-suse/nm-suse-connection.c b/system-settings/plugins/ifcfg-suse/nm-suse-connection.c index 230da18ea7..a3a9fbf1f1 100644 --- a/system-settings/plugins/ifcfg-suse/nm-suse-connection.c +++ b/system-settings/plugins/ifcfg-suse/nm-suse-connection.c @@ -37,9 +37,20 @@ file_changed (GFileMonitor *monitor, case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: new_connection = parse_ifcfg (priv->iface, priv->dev_type); if (new_connection) { + GError *error = NULL; + new_settings = nm_connection_to_hash (new_connection); - nm_connection_replace_settings (nm_exported_connection_get_connection (exported), new_settings); - nm_exported_connection_signal_updated (exported, new_settings); + if (nm_connection_replace_settings (nm_exported_connection_get_connection (exported), new_settings, &error)) + nm_exported_connection_signal_updated (exported, new_settings); + else { + g_warning ("%s: '%s' / '%s' invalid: %d", + __func__, + error ? g_type_name (nm_connection_lookup_setting_type_by_quark (error->domain)) : "(none)", + (error && error->message) ? error->message : "(none)", + error ? error->code : -1); + g_clear_error (&error); + nm_exported_connection_signal_removed (exported); + } g_hash_table_destroy (new_settings); g_object_unref (new_connection); diff --git a/system-settings/plugins/keyfile/nm-keyfile-connection.c b/system-settings/plugins/keyfile/nm-keyfile-connection.c index 6bf3e395f8..3f15458b38 100644 --- a/system-settings/plugins/keyfile/nm-keyfile-connection.c +++ b/system-settings/plugins/keyfile/nm-keyfile-connection.c @@ -222,14 +222,16 @@ update (NMExportedConnection *exported, char *filename = NULL; connection = nm_exported_connection_get_connection (exported); - nm_connection_replace_settings (connection, new_settings); - success = write_connection (connection, &filename, error); - if (success && filename && strcmp (priv->filename, filename)) { - /* Update the filename if it changed */ - g_free (priv->filename); - priv->filename = filename; - } else - g_free (filename); + success = nm_connection_replace_settings (connection, new_settings, error); + if (success) { + success = write_connection (connection, &filename, error); + if (success && filename && strcmp (priv->filename, filename)) { + /* Update the filename if it changed */ + g_free (priv->filename); + priv->filename = filename; + } else + g_free (filename); + } } return success; diff --git a/system-settings/plugins/keyfile/plugin.c b/system-settings/plugins/keyfile/plugin.c index 5de0f4924c..a2d4918d14 100644 --- a/system-settings/plugins/keyfile/plugin.c +++ b/system-settings/plugins/keyfile/plugin.c @@ -133,11 +133,22 @@ update_connection_settings (NMExportedConnection *orig, { NMConnection *wrapped; GHashTable *new_settings; + GError *error = NULL; new_settings = nm_connection_to_hash (nm_exported_connection_get_connection (new)); wrapped = nm_exported_connection_get_connection (orig); - nm_connection_replace_settings (wrapped, new_settings); - nm_exported_connection_signal_updated (orig, new_settings); + if (nm_connection_replace_settings (wrapped, new_settings, &error)) + nm_exported_connection_signal_updated (orig, new_settings); + else { + g_warning ("%s: '%s' / '%s' invalid: %d", + __func__, + error ? g_type_name (nm_connection_lookup_setting_type_by_quark (error->domain)) : "(none)", + (error && error->message) ? error->message : "(none)", + error ? error->code : -1); + g_clear_error (&error); + nm_exported_connection_signal_removed (orig); + } + g_hash_table_destroy (new_settings); }