+2008-11-19 Dan Williams <dcbw@redhat.com>
+
+ * 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 <dcbw@redhat.com>
* libnm-util/libnm-util.ver
{
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
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);
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;
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 {
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,
}
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,
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);
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;
{
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);
}