Commit 5262883e authored by Tambet Ingo's avatar Tambet Ingo

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
parent d73cdc33
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
......
......@@ -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;
......
......@@ -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 */
......
......@@ -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;
}
......
......@@ -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);
......
......@@ -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 \
......
......@@ -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;
}
}
/* -*- 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)
......
......@@ -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,
......
/* -*- 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;
}
/* -*- 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 */
......@@ -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;
}
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment