2008-07-16 Tambet Ingo <tambet@gmail.com>

* system-settings/src/nm-system-config-interface.c
	(nm_system_config_interface_supports_add): Implement.
	(nm_system_config_interface_add_connection): Return a boolean to notify
	of errors.

	* system-settings/src/nm-polkit-helpers.c:
	* system-settings/src/nm-polkit-helpers.h: Move error declarations to
	a separate file.

	* system-settings/src/dbus-settings.c (impl_settings_add_connection):
	Return an error when none of the plugins support add or if addition
	failed for some reason.

	* system-settings/src/nm-system-config-error.h:
	* system-settings/src/nm-system-config-error.c: New files, mostly moved
	here from nm-polkit-helpers.[ch].

	* system-settings/src/Makefile.am: Build new files.

	* system-settings/plugins/keyfile/reader.c
	(read_array_of_array_of_uint): Make it more general so that it would
	work for routes as well.

	* system-settings/plugins/keyfile/writer.c
	(write_array_of_array_of_uint): Ditto.
	Fix the netmask/prefix writing.

	* system-settings/plugins/keyfile/plugin.c (add_connection): Return
	boolean to notify errors.

	* system-settings/plugins/ifcfg-suse/nm-suse-connection.c (update):
	Return more specific error.
	(delete): Ditto.


git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3821 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
Tambet Ingo 2008-07-16 07:37:10 +00:00
parent d73cdc331a
commit 5262883e96
13 changed files with 211 additions and 98 deletions

View file

@ -1,3 +1,39 @@
2008-07-16 Tambet Ingo <tambet@gmail.com>
* system-settings/src/nm-system-config-interface.c
(nm_system_config_interface_supports_add): Implement.
(nm_system_config_interface_add_connection): Return a boolean to notify
of errors.
* system-settings/src/nm-polkit-helpers.c:
* system-settings/src/nm-polkit-helpers.h: Move error declarations to
a separate file.
* system-settings/src/dbus-settings.c (impl_settings_add_connection):
Return an error when none of the plugins support add or if addition
failed for some reason.
* system-settings/src/nm-system-config-error.h:
* system-settings/src/nm-system-config-error.c: New files, mostly moved
here from nm-polkit-helpers.[ch].
* system-settings/src/Makefile.am: Build new files.
* system-settings/plugins/keyfile/reader.c
(read_array_of_array_of_uint): Make it more general so that it would
work for routes as well.
* system-settings/plugins/keyfile/writer.c
(write_array_of_array_of_uint): Ditto.
Fix the netmask/prefix writing.
* system-settings/plugins/keyfile/plugin.c (add_connection): Return
boolean to notify errors.
* system-settings/plugins/ifcfg-suse/nm-suse-connection.c (update):
Return more specific error.
(delete): Ditto.
2008-07-11 Dan Williams <dcbw@redhat.com>
Modify the NMDevice::state-changed signal to include the previous state

View file

@ -6,7 +6,7 @@
#include <NetworkManager.h>
#include "nm-suse-connection.h"
#include "parser.h"
#include "nm-polkit-helpers.h"
#include "nm-system-config-error.h"
G_DEFINE_TYPE (NMSuseConnection, nm_suse_connection, NM_TYPE_SYSCONFIG_CONNECTION)
@ -111,7 +111,8 @@ update (NMExportedConnection *exported,
GHashTable *new_settings,
GError **err)
{
g_set_error (err, NM_SYSCONFIG_SETTINGS_ERROR, NM_SYSCONFIG_SETTINGS_ERROR_GENERAL,
g_set_error (err, NM_SYSCONFIG_SETTINGS_ERROR,
NM_SYSCONFIG_SETTINGS_ERROR_UPDATE_NOT_SUPPORTED,
"%s", "Please use YaST to change this connection.");
return FALSE;
@ -120,7 +121,8 @@ update (NMExportedConnection *exported,
static gboolean
delete (NMExportedConnection *exported, GError **err)
{
g_set_error (err, NM_SYSCONFIG_SETTINGS_ERROR, NM_SYSCONFIG_SETTINGS_ERROR_GENERAL,
g_set_error (err, NM_SYSCONFIG_SETTINGS_ERROR,
NM_SYSCONFIG_SETTINGS_ERROR_DELETE_NOT_SUPPORTED,
"%s", "Please use YaST to remove this connection.");
return FALSE;

View file

@ -181,10 +181,10 @@ get_connections (NMSystemConfigInterface *config)
return connections;
}
static void
static gboolean
add_connection (NMSystemConfigInterface *config, NMConnection *connection)
{
write_connection (connection);
return write_connection (connection);
}
/* GObject */

View file

@ -67,19 +67,14 @@ free_one_address (gpointer data, gpointer user_data)
g_array_free ((GArray *) data, TRUE);
}
static gboolean
read_array_of_array_of_uint (GKeyFile *file,
NMSetting *setting,
const char *key)
static GPtrArray *
read_addresses (GKeyFile *file,
const char *setting_name,
const char *key)
{
GPtrArray *addresses;
int i = 0;
/* Only handle IPv4 addresses for now */
if ( !NM_IS_SETTING_IP4_CONFIG (setting)
|| strcmp (key, NM_SETTING_IP4_CONFIG_ADDRESSES))
return FALSE;
addresses = g_ptr_array_sized_new (3);
/* Look for individual addresses */
@ -92,8 +87,8 @@ read_array_of_array_of_uint (GKeyFile *file,
guint32 empty = 0;
int j;
key_name = g_strdup_printf ("address%d", i);
tmp = g_key_file_get_string_list (file, setting->name, key_name, &length, NULL);
key_name = g_strdup_printf ("%s%d", key, i);
tmp = g_key_file_get_string_list (file, setting_name, key_name, &length, NULL);
g_free (key_name);
if (!tmp || !length)
@ -145,10 +140,39 @@ next:
g_strfreev (tmp);
}
g_object_set (setting, key, addresses, NULL);
if (addresses->len < 1) {
g_ptr_array_free (addresses, TRUE);
addresses = NULL;
}
return addresses;
}
static gboolean
read_array_of_array_of_uint (GKeyFile *file,
NMSetting *setting,
const char *key)
{
GPtrArray *addresses;
/* Only handle IPv4 addresses and routes for now */
if ( !NM_IS_SETTING_IP4_CONFIG (setting) ||
(strcmp (key, NM_SETTING_IP4_CONFIG_ADDRESSES) &&
strcmp (key, NM_SETTING_IP4_CONFIG_ROUTES)))
return FALSE;
addresses = read_addresses (file, setting->name, key);
/* Work around for previous syntax */
if (!addresses && !strcmp (key, NM_SETTING_IP4_CONFIG_ADDRESSES))
addresses = read_addresses (file, setting->name, "address");
if (addresses) {
g_object_set (setting, key, addresses, NULL);
g_ptr_array_foreach (addresses, free_one_address, NULL);
g_ptr_array_free (addresses, TRUE);
}
g_ptr_array_foreach (addresses, free_one_address, NULL);
g_ptr_array_free (addresses, TRUE);
return TRUE;
}

View file

@ -71,9 +71,10 @@ write_array_of_array_of_uint (GKeyFile *file,
GPtrArray *array;
int i, j;
/* Only handle IPv4 addresses for now */
if ( !NM_IS_SETTING_IP4_CONFIG (setting)
|| strcmp (key, NM_SETTING_IP4_CONFIG_ADDRESSES))
/* Only handle IPv4 addresses and routes for now */
if ( !NM_IS_SETTING_IP4_CONFIG (setting) ||
(strcmp (key, NM_SETTING_IP4_CONFIG_ADDRESSES) &&
strcmp (key, NM_SETTING_IP4_CONFIG_ROUTES)))
return FALSE;
array = (GPtrArray *) g_value_get_boxed (value);
@ -87,6 +88,7 @@ write_array_of_array_of_uint (GKeyFile *file,
char *list[3] = { NULL, NULL, NULL };
char *key_name;
/* Address */
addr.s_addr = g_array_index (tuple, guint32, 0);
if (!inet_ntop (AF_INET, &addr, buf, sizeof (buf))) {
nm_warning ("%s: error converting IP4 address 0x%X",
@ -96,15 +98,10 @@ write_array_of_array_of_uint (GKeyFile *file,
list[0] = g_strdup (buf);
}
addr.s_addr = g_array_index (tuple, guint32, 1);
if (!inet_ntop (AF_INET, &addr, buf, sizeof (buf))) {
nm_warning ("%s: error converting IP4 address 0x%X",
__func__, ntohl (addr.s_addr));
list[1] = NULL;
} else {
list[1] = g_strdup (buf);
}
/* Prefix */
list[1] = g_strdup_printf ("%d", g_array_index (tuple, guint32, 1));
/* Gateway */
addr.s_addr = g_array_index (tuple, guint32, 2);
if (addr.s_addr) {
if (!inet_ntop (AF_INET, &addr, buf, sizeof (buf))) {
@ -116,7 +113,7 @@ write_array_of_array_of_uint (GKeyFile *file,
}
}
key_name = g_strdup_printf ("address%d", j + 1);
key_name = g_strdup_printf ("%s%d", key, j + 1);
g_key_file_set_string_list (file, setting->name, key_name, (const char **) list, list[2] ? 3 : 2);
g_free (key_name);

View file

@ -15,6 +15,8 @@ nm_system_settings_SOURCES = \
main.c \
nm-polkit-helpers.c \
nm-polkit-helpers.h \
nm-system-config-error.c \
nm-system-config-error.h \
nm-system-config-interface.c \
nm-system-config-interface.h \
nm-system-config-hal-manager.c \

View file

@ -30,6 +30,7 @@
#include "nm-dbus-glib-types.h"
#include "dbus-settings.h"
#include "nm-polkit-helpers.h"
#include "nm-system-config-error.h"
#include "nm-utils.h"
static gboolean
@ -431,36 +432,45 @@ impl_settings_add_connection (NMSysconfigSettings *self,
{
NMSysconfigSettingsPrivate *priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (self);
NMConnection *connection;
GSList *iter;
GError *err = NULL, *cnfh_error = NULL;
gboolean success;
if (!check_polkit_privileges (priv->g_connection, priv->pol_ctx, context, &err)) {
dbus_g_method_return_error (context, err);
g_error_free (err);
return FALSE;
/* Does any of the plugins support adding? */
success = FALSE;
for (iter = priv->plugins; iter && success == FALSE; iter = iter->next)
success = nm_system_config_interface_supports_add (NM_SYSTEM_CONFIG_INTERFACE (iter->data));
if (!success) {
err = g_error_new (NM_SYSCONFIG_SETTINGS_ERROR,
NM_SYSCONFIG_SETTINGS_ERROR_ADD_NOT_SUPPORTED,
"%s", "None of the registered plugins support add.");
goto out;
}
if (!check_polkit_privileges (priv->g_connection, priv->pol_ctx, context, &err))
goto out;
connection = nm_connection_new_from_hash (hash, &cnfh_error);
if (connection) {
GSList *iter;
/* Here's how it works:
1) plugin writes a connection.
2) plugin notices that a new connection is available for reading.
3) plugin reads the new connection (the one it wrote in 1) and emits 'connection-added' signal.
4) NMSysconfigSettings receives the signal and adds it to it's connection list.
This does not work if none of the plugins is able to write, but that is sort of by design -
if the connection is not saved, it won't be available after reboot and that would be very
inconsistent. Perhaps we should fail this call here as well, but with multiple plugins,
it's not very clear which failures we can ignore and which ones we can't.
*/
for (iter = priv->plugins; iter; iter = iter->next)
nm_system_config_interface_add_connection (NM_SYSTEM_CONFIG_INTERFACE (iter->data), connection);
success = FALSE;
for (iter = priv->plugins; iter && success == FALSE; iter = iter->next)
success = nm_system_config_interface_add_connection (NM_SYSTEM_CONFIG_INTERFACE (iter->data),
connection);
g_object_unref (connection);
dbus_g_method_return (context);
return TRUE;
if (!success)
err = g_error_new (NM_SYSCONFIG_SETTINGS_ERROR,
NM_SYSCONFIG_SETTINGS_ERROR_ADD_FAILED,
"%s", "Saving connection failed.");
} else {
/* Invalid connection hash */
err = g_error_new (NM_SYSCONFIG_SETTINGS_ERROR,
@ -469,8 +479,15 @@ impl_settings_add_connection (NMSysconfigSettings *self,
g_type_name (nm_connection_lookup_setting_type_by_quark (cnfh_error->domain)),
cnfh_error->message, cnfh_error->code);
g_error_free (cnfh_error);
}
out:
if (err) {
dbus_g_method_return_error (context, err);
g_error_free (err);
return FALSE;
} else {
dbus_g_method_return (context);
return TRUE;
}
}

View file

@ -1,39 +1,8 @@
/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
#include "nm-polkit-helpers.h"
#include <nm-dbus-settings.h>
GQuark
nm_sysconfig_settings_error_quark (void)
{
static GQuark ret = 0;
if (ret == 0)
ret = g_quark_from_static_string ("nm_sysconfig_settings_error");
return ret;
}
#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
GType
nm_sysconfig_settings_error_get_type (void)
{
static GType etype = 0;
if (etype == 0) {
static const GEnumValue values[] = {
ENUM_ENTRY (NM_SYSCONFIG_SETTINGS_ERROR_GENERAL, "GeneralError"),
ENUM_ENTRY (NM_SYSCONFIG_SETTINGS_ERROR_NOT_PRIVILEGED, "NotPrivileged"),
ENUM_ENTRY (NM_SYSCONFIG_SETTINGS_ERROR_INVALID_CONNECTION, "InvalidConnection"),
{ 0, 0, 0 }
};
etype = g_enum_register_static ("NMSysconfigSettingsError", values);
}
return etype;
}
#include "nm-polkit-helpers.h"
#include "nm-system-config-error.h"
static gboolean
pk_io_watch_have_data (GIOChannel *channel, GIOCondition condition, gpointer user_data)

View file

@ -9,18 +9,6 @@
#define NM_SYSCONFIG_POLICY_ACTION "org.freedesktop.network-manager-settings.system.modify"
enum {
NM_SYSCONFIG_SETTINGS_ERROR_GENERAL = 0,
NM_SYSCONFIG_SETTINGS_ERROR_NOT_PRIVILEGED,
NM_SYSCONFIG_SETTINGS_ERROR_INVALID_CONNECTION
};
#define NM_SYSCONFIG_SETTINGS_ERROR (nm_sysconfig_settings_error_quark ())
#define NM_TYPE_SYSCONFIG_SETTINGS_ERROR (nm_sysconfig_settings_error_get_type ())
GQuark nm_sysconfig_settings_error_quark (void);
GType nm_sysconfig_settings_error_get_type (void);
PolKitContext *create_polkit_context (void);
gboolean check_polkit_privileges (DBusGConnection *dbus_connection,
PolKitContext *pol_ctx,

View file

@ -0,0 +1,39 @@
/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
#include "nm-system-config-error.h"
GQuark
nm_sysconfig_settings_error_quark (void)
{
static GQuark ret = 0;
if (ret == 0)
ret = g_quark_from_static_string ("nm_sysconfig_settings_error");
return ret;
}
#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
GType
nm_sysconfig_settings_error_get_type (void)
{
static GType etype = 0;
if (etype == 0) {
static const GEnumValue values[] = {
ENUM_ENTRY (NM_SYSCONFIG_SETTINGS_ERROR_GENERAL, "GeneralError"),
ENUM_ENTRY (NM_SYSCONFIG_SETTINGS_ERROR_NOT_PRIVILEGED, "NotPrivileged"),
ENUM_ENTRY (NM_SYSCONFIG_SETTINGS_ERROR_INVALID_CONNECTION, "InvalidConnection"),
ENUM_ENTRY (NM_SYSCONFIG_SETTINGS_ERROR_ADD_NOT_SUPPORTED, "AddNotSupported"),
ENUM_ENTRY (NM_SYSCONFIG_SETTINGS_ERROR_UPDATE_NOT_SUPPORTED, "UpdateNotSupported"),
ENUM_ENTRY (NM_SYSCONFIG_SETTINGS_ERROR_DELETE_NOT_SUPPORTED, "DeleteNotSupported"),
ENUM_ENTRY (NM_SYSCONFIG_SETTINGS_ERROR_ADD_FAILED, "AddFailed"),
{ 0, 0, 0 }
};
etype = g_enum_register_static ("NMSysconfigSettingsError", values);
}
return etype;
}

View file

@ -0,0 +1,25 @@
/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
#ifndef NM_SYSTEM_CONFIG_ERROR_H
#define NM_SYSTEM_CONFIG_ERROR_H
#include <glib/gtypes.h>
#include <glib-object.h>
enum {
NM_SYSCONFIG_SETTINGS_ERROR_GENERAL = 0,
NM_SYSCONFIG_SETTINGS_ERROR_NOT_PRIVILEGED,
NM_SYSCONFIG_SETTINGS_ERROR_INVALID_CONNECTION,
NM_SYSCONFIG_SETTINGS_ERROR_ADD_NOT_SUPPORTED,
NM_SYSCONFIG_SETTINGS_ERROR_UPDATE_NOT_SUPPORTED,
NM_SYSCONFIG_SETTINGS_ERROR_DELETE_NOT_SUPPORTED,
NM_SYSCONFIG_SETTINGS_ERROR_ADD_FAILED
};
#define NM_SYSCONFIG_SETTINGS_ERROR (nm_sysconfig_settings_error_quark ())
#define NM_TYPE_SYSCONFIG_SETTINGS_ERROR (nm_sysconfig_settings_error_get_type ())
GQuark nm_sysconfig_settings_error_quark (void);
GType nm_sysconfig_settings_error_get_type (void);
#endif /* NM_SYSTEM_CONFIG_ERROR_H */

View file

@ -129,13 +129,25 @@ nm_system_config_interface_get_unmanaged_devices (NMSystemConfigInterface *confi
return NULL;
}
void
gboolean
nm_system_config_interface_supports_add (NMSystemConfigInterface *config)
{
g_return_val_if_fail (config != NULL, FALSE);
return NM_SYSTEM_CONFIG_INTERFACE_GET_INTERFACE (config)->add_connection != NULL;
}
gboolean
nm_system_config_interface_add_connection (NMSystemConfigInterface *config,
NMConnection *connection)
{
g_return_if_fail (config != NULL);
g_return_if_fail (NM_IS_CONNECTION (connection));
gboolean success = FALSE;
g_return_val_if_fail (config != NULL, FALSE);
g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE);
if (NM_SYSTEM_CONFIG_INTERFACE_GET_INTERFACE (config)->add_connection)
NM_SYSTEM_CONFIG_INTERFACE_GET_INTERFACE (config)->add_connection (config, connection);
success = NM_SYSTEM_CONFIG_INTERFACE_GET_INTERFACE (config)->add_connection (config, connection);
return success;
}

View file

@ -92,7 +92,7 @@ struct _NMSystemConfigInterface {
/*
* Add a new connection.
*/
void (*add_connection) (NMSystemConfigInterface *config, NMConnection *connection);
gboolean (*add_connection) (NMSystemConfigInterface *config, NMConnection *connection);
/* Signals */
@ -112,8 +112,10 @@ GSList * nm_system_config_interface_get_connections (NMSystemConfigInterface *co
GSList *nm_system_config_interface_get_unmanaged_devices (NMSystemConfigInterface *config);
void nm_system_config_interface_add_connection (NMSystemConfigInterface *config,
NMConnection *connection);
gboolean nm_system_config_interface_supports_add (NMSystemConfigInterface *config);
gboolean nm_system_config_interface_add_connection (NMSystemConfigInterface *config,
NMConnection *connection);
G_END_DECLS