From 3c2d8253ec19ac1659c0b8f6981efd971315779c Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 19 Nov 2008 15:09:05 +0000 Subject: [PATCH] 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() git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4298 4912f4e0-d625-0410-9fb7-b9a5a253dbdc --- ChangeLog | 14 +++++++++ libnm-glib/nm-dbus-connection.c | 12 ++++++-- libnm-glib/nm-settings.c | 13 +++++++-- libnm-util/nm-connection.c | 29 ++++++++++--------- libnm-util/nm-connection.h | 3 +- src/nm-manager.c | 2 +- .../plugins/ifcfg-suse/nm-suse-connection.c | 15 ++++++++-- .../plugins/keyfile/nm-keyfile-connection.c | 18 +++++++----- system-settings/plugins/keyfile/plugin.c | 15 ++++++++-- 9 files changed, 89 insertions(+), 32 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8f5b535b4..9c063008d 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 f027b0a27..631ee3c87 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 ab860f9dd..34516b766 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 e44a144c6..c16f8a03a 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 27229356b..749340bee 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 5fc14ff7a..bf0b40252 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 230da18ea..a3a9fbf1f 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 6bf3e395f..3f15458b3 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 5de0f4924..a2d4918d1 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); }