2008-05-11 Dan Williams <dcbw@redhat.com>
Update Fedora system-settings plugin to support latest API and use GFileMonitor rather than home-rolled inotify code. * system-settings/plugins/ifcfg-fedora/Makefile.am system-settings/plugins/ifcfg-fedora/common.h system-settings/plugins/ifcfg-fedora/plugin.c - Update to latest system settings plugin API; use GIO instead of custom inotify code; use NMIfcfgConnection objects instead of ConnectionData structures tacked onto NMConnection objects * system-settings/plugins/ifcfg-fedora/nm-ifcfg-connection.c system-settings/plugins/ifcfg-fedora/nm-ifcfg-connection.h - Implement an NMExportedConnection subclass mapping ifcfg files to connections * system-settings/plugins/ifcfg-fedora/reader.c system-settings/plugins/ifcfg-fedora/reader.h - Move ifcfg parsing bits here from parser.c * system-settings/plugins/ifcfg-fedora/parser.c system-settings/plugins/ifcfg-fedora/parser.h - Remove; most code moved to reader.c git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3656 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
25
ChangeLog
25
ChangeLog
@@ -1,3 +1,28 @@
|
|||||||
|
2008-05-11 Dan Williams <dcbw@redhat.com>
|
||||||
|
|
||||||
|
Update Fedora system-settings plugin to support latest API and use
|
||||||
|
GFileMonitor rather than home-rolled inotify code.
|
||||||
|
|
||||||
|
* system-settings/plugins/ifcfg-fedora/Makefile.am
|
||||||
|
system-settings/plugins/ifcfg-fedora/common.h
|
||||||
|
system-settings/plugins/ifcfg-fedora/plugin.c
|
||||||
|
- Update to latest system settings plugin API; use GIO instead of
|
||||||
|
custom inotify code; use NMIfcfgConnection objects instead of
|
||||||
|
ConnectionData structures tacked onto NMConnection objects
|
||||||
|
|
||||||
|
* system-settings/plugins/ifcfg-fedora/nm-ifcfg-connection.c
|
||||||
|
system-settings/plugins/ifcfg-fedora/nm-ifcfg-connection.h
|
||||||
|
- Implement an NMExportedConnection subclass mapping ifcfg files to
|
||||||
|
connections
|
||||||
|
|
||||||
|
* system-settings/plugins/ifcfg-fedora/reader.c
|
||||||
|
system-settings/plugins/ifcfg-fedora/reader.h
|
||||||
|
- Move ifcfg parsing bits here from parser.c
|
||||||
|
|
||||||
|
* system-settings/plugins/ifcfg-fedora/parser.c
|
||||||
|
system-settings/plugins/ifcfg-fedora/parser.h
|
||||||
|
- Remove; most code moved to reader.c
|
||||||
|
|
||||||
2008-05-11 Dan Williams <dcbw@redhat.com>
|
2008-05-11 Dan Williams <dcbw@redhat.com>
|
||||||
|
|
||||||
* configure.in
|
* configure.in
|
||||||
|
@@ -4,10 +4,13 @@ pkglib_LTLIBRARIES = libnm-settings-plugin-ifcfg-fedora.la
|
|||||||
libnm_settings_plugin_ifcfg_fedora_la_SOURCES = \
|
libnm_settings_plugin_ifcfg_fedora_la_SOURCES = \
|
||||||
shvar.c \
|
shvar.c \
|
||||||
shvar.h \
|
shvar.h \
|
||||||
parser.c \
|
|
||||||
parser.h \
|
|
||||||
plugin.c \
|
plugin.c \
|
||||||
plugin.h
|
plugin.h \
|
||||||
|
nm-ifcfg-connection.c \
|
||||||
|
nm-ifcfg-connection.h \
|
||||||
|
reader.c \
|
||||||
|
reader.h \
|
||||||
|
common.h
|
||||||
|
|
||||||
libnm_settings_plugin_ifcfg_fedora_la_CPPFLAGS = \
|
libnm_settings_plugin_ifcfg_fedora_la_CPPFLAGS = \
|
||||||
$(GLIB_CFLAGS) \
|
$(GLIB_CFLAGS) \
|
||||||
@@ -16,6 +19,7 @@ libnm_settings_plugin_ifcfg_fedora_la_CPPFLAGS = \
|
|||||||
-DG_DISABLE_DEPRECATED \
|
-DG_DISABLE_DEPRECATED \
|
||||||
-I${top_srcdir}/system-settings/src \
|
-I${top_srcdir}/system-settings/src \
|
||||||
-I$(top_srcdir)/include \
|
-I$(top_srcdir)/include \
|
||||||
|
-I$(top_srcdir)/libnm-glib \
|
||||||
-I$(top_srcdir)/libnm-util \
|
-I$(top_srcdir)/libnm-util \
|
||||||
-DSYSCONFDIR=\"$(sysconfdir)\"
|
-DSYSCONFDIR=\"$(sysconfdir)\"
|
||||||
|
|
||||||
@@ -23,5 +27,14 @@ libnm_settings_plugin_ifcfg_fedora_la_LDFLAGS = -module -avoid-version
|
|||||||
libnm_settings_plugin_ifcfg_fedora_la_LIBADD = \
|
libnm_settings_plugin_ifcfg_fedora_la_LIBADD = \
|
||||||
$(GLIB_LIBS) \
|
$(GLIB_LIBS) \
|
||||||
$(GMODULE_LIBS) \
|
$(GMODULE_LIBS) \
|
||||||
$(top_builddir)/libnm-util/libnm-util.la
|
$(top_builddir)/libnm-util/libnm-util.la \
|
||||||
|
$(top_builddir)/libnm-glib/libnm_glib.la
|
||||||
|
|
||||||
|
if NO_GIO
|
||||||
|
libnm_settings_plugin_ifcfg_fedora_la_LIBADD += \
|
||||||
|
$(top_builddir)/gfilemonitor/libgfilemonitor.la
|
||||||
|
else
|
||||||
|
libnm_settings_plugin_ifcfg_fedora_la_LIBADD += \
|
||||||
|
$(GIO_LIBS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||||
/* NetworkManager system settings service
|
/* NetworkManager system settings service
|
||||||
*
|
|
||||||
* Søren Sandmann <sandmann@daimi.au.dk>
|
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -16,15 +15,11 @@
|
|||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
*
|
*
|
||||||
* (C) Copyright 2007 Red Hat, Inc.
|
* (C) Copyright 2008 Red Hat, Inc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _PARSER_H_
|
#ifndef __COMMON_H__
|
||||||
#define _PARSER_H_
|
#define __COMMON_H__
|
||||||
|
|
||||||
#include <glib.h>
|
|
||||||
#include <nm-connection.h>
|
|
||||||
#include <nm-setting-ip4-config.h>
|
|
||||||
|
|
||||||
#define IFCFG_TAG "ifcfg-"
|
#define IFCFG_TAG "ifcfg-"
|
||||||
#define KEYS_TAG "keys-"
|
#define KEYS_TAG "keys-"
|
||||||
@@ -33,21 +28,10 @@
|
|||||||
#define ORIG_TAG ".orig"
|
#define ORIG_TAG ".orig"
|
||||||
#define REJ_TAG ".rej"
|
#define REJ_TAG ".rej"
|
||||||
|
|
||||||
typedef struct {
|
#include <glib.h>
|
||||||
char *ifcfg_path;
|
|
||||||
char *udi;
|
|
||||||
gboolean ignored;
|
|
||||||
gboolean exported;
|
|
||||||
|
|
||||||
GHashTable *wifi_secrets;
|
GQuark ifcfg_plugin_error_quark (void);
|
||||||
GHashTable *onex_secrets;
|
|
||||||
GHashTable *ppp_secrets;
|
|
||||||
} ConnectionData;
|
|
||||||
|
|
||||||
NMConnection * parser_parse_file (const char *file, GError **error);
|
|
||||||
|
|
||||||
ConnectionData *connection_data_get (NMConnection *connection);
|
#endif /* __COMMON_H__ */
|
||||||
ConnectionData *connection_data_add (NMConnection *connection, const char *ifcfg_path);
|
|
||||||
void connection_data_copy_secrets (ConnectionData *from, ConnectionData *to);
|
|
||||||
|
|
||||||
#endif /* _PARSER_H_ */
|
|
422
system-settings/plugins/ifcfg-fedora/nm-ifcfg-connection.c
Normal file
422
system-settings/plugins/ifcfg-fedora/nm-ifcfg-connection.c
Normal file
@@ -0,0 +1,422 @@
|
|||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||||
|
/* NetworkManager system settings service
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* (C) Copyright 2008 Red Hat, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <net/ethernet.h>
|
||||||
|
#include <netinet/ether.h>
|
||||||
|
|
||||||
|
#include <glib/gstdio.h>
|
||||||
|
|
||||||
|
#include <NetworkManager.h>
|
||||||
|
#include <nm-setting-connection.h>
|
||||||
|
#include <nm-setting-wired.h>
|
||||||
|
#include <nm-setting-wireless.h>
|
||||||
|
#include <nm-setting-gsm.h>
|
||||||
|
#include <nm-setting-cdma.h>
|
||||||
|
#include <nm-setting-pppoe.h>
|
||||||
|
#include <nm-setting-wireless-security.h>
|
||||||
|
#include <nm-setting-8021x.h>
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "nm-ifcfg-connection.h"
|
||||||
|
#include "nm-system-config-hal-manager.h"
|
||||||
|
#include "reader.h"
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (NMIfcfgConnection, nm_ifcfg_connection, NM_TYPE_EXPORTED_CONNECTION)
|
||||||
|
|
||||||
|
#define NM_IFCFG_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_IFCFG_CONNECTION, NMIfcfgConnectionPrivate))
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char *filename;
|
||||||
|
char *keyfile;
|
||||||
|
|
||||||
|
char *udi;
|
||||||
|
gboolean unmanaged;
|
||||||
|
|
||||||
|
NMSystemConfigHalManager *hal_mgr;
|
||||||
|
DBusGConnection *g_connection;
|
||||||
|
gulong daid;
|
||||||
|
} NMIfcfgConnectionPrivate;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PROP_0,
|
||||||
|
PROP_FILENAME,
|
||||||
|
PROP_UNMANAGED,
|
||||||
|
PROP_UDI,
|
||||||
|
|
||||||
|
LAST_PROP
|
||||||
|
};
|
||||||
|
|
||||||
|
static char *
|
||||||
|
get_ether_device_udi (DBusGConnection *g_connection, GByteArray *mac, GSList *devices)
|
||||||
|
{
|
||||||
|
GError *error = NULL;
|
||||||
|
GSList *iter;
|
||||||
|
char *udi = NULL;
|
||||||
|
|
||||||
|
if (!g_connection || !mac)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (iter = devices; !udi && iter; iter = g_slist_next (iter)) {
|
||||||
|
DBusGProxy *dev_proxy;
|
||||||
|
char *address = NULL;
|
||||||
|
|
||||||
|
dev_proxy = dbus_g_proxy_new_for_name (g_connection,
|
||||||
|
"org.freedesktop.Hal",
|
||||||
|
iter->data,
|
||||||
|
"org.freedesktop.Hal.Device");
|
||||||
|
if (!dev_proxy)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (dbus_g_proxy_call_with_timeout (dev_proxy,
|
||||||
|
"GetPropertyString", 10000, &error,
|
||||||
|
G_TYPE_STRING, "net.address", G_TYPE_INVALID,
|
||||||
|
G_TYPE_STRING, &address, G_TYPE_INVALID)) {
|
||||||
|
struct ether_addr *dev_mac;
|
||||||
|
|
||||||
|
if (address && strlen (address)) {
|
||||||
|
dev_mac = ether_aton (address);
|
||||||
|
if (!memcmp (dev_mac->ether_addr_octet, mac->data, ETH_ALEN))
|
||||||
|
udi = g_strdup (iter->data);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
g_error_free (error);
|
||||||
|
error = NULL;
|
||||||
|
}
|
||||||
|
g_free (address);
|
||||||
|
g_object_unref (dev_proxy);
|
||||||
|
}
|
||||||
|
|
||||||
|
return udi;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NMDeviceType
|
||||||
|
get_device_type_for_connection (NMConnection *connection)
|
||||||
|
{
|
||||||
|
NMDeviceType devtype = DEVICE_TYPE_UNKNOWN;
|
||||||
|
NMSettingConnection *s_con;
|
||||||
|
|
||||||
|
s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
|
||||||
|
if (!s_con)
|
||||||
|
return DEVICE_TYPE_UNKNOWN;
|
||||||
|
|
||||||
|
if ( !strcmp (s_con->type, NM_SETTING_WIRED_SETTING_NAME)
|
||||||
|
|| !strcmp (s_con->type, NM_SETTING_PPPOE_SETTING_NAME)) {
|
||||||
|
if (nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRED))
|
||||||
|
devtype = DEVICE_TYPE_802_3_ETHERNET;
|
||||||
|
} else if (!strcmp (s_con->type, NM_SETTING_WIRELESS_SETTING_NAME)) {
|
||||||
|
if (nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRELESS))
|
||||||
|
devtype = DEVICE_TYPE_802_11_WIRELESS;
|
||||||
|
} else if (!strcmp (s_con->type, NM_SETTING_GSM_SETTING_NAME)) {
|
||||||
|
if (nm_connection_get_setting (connection, NM_TYPE_SETTING_GSM))
|
||||||
|
devtype = DEVICE_TYPE_GSM;
|
||||||
|
} else if (!strcmp (s_con->type, NM_SETTING_CDMA_SETTING_NAME)) {
|
||||||
|
if (nm_connection_get_setting (connection, NM_TYPE_SETTING_CDMA))
|
||||||
|
devtype = DEVICE_TYPE_CDMA;
|
||||||
|
}
|
||||||
|
|
||||||
|
return devtype;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
get_udi_for_connection (NMConnection *connection,
|
||||||
|
DBusGConnection *g_connection,
|
||||||
|
NMSystemConfigHalManager *hal_mgr,
|
||||||
|
NMDeviceType devtype)
|
||||||
|
{
|
||||||
|
NMSettingWired *s_wired;
|
||||||
|
NMSettingWireless *s_wireless;
|
||||||
|
char *udi = NULL;
|
||||||
|
GSList *devices = NULL;
|
||||||
|
|
||||||
|
if (devtype == DEVICE_TYPE_UNKNOWN)
|
||||||
|
devtype = get_device_type_for_connection (connection);
|
||||||
|
|
||||||
|
switch (devtype) {
|
||||||
|
case DEVICE_TYPE_802_3_ETHERNET:
|
||||||
|
s_wired = (NMSettingWired *) nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRED);
|
||||||
|
if (s_wired) {
|
||||||
|
devices = nm_system_config_hal_manager_get_devices_of_type (hal_mgr, DEVICE_TYPE_802_3_ETHERNET);
|
||||||
|
udi = get_ether_device_udi (g_connection, s_wired->mac_address, devices);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DEVICE_TYPE_802_11_WIRELESS:
|
||||||
|
s_wireless = (NMSettingWireless *) nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRELESS);
|
||||||
|
if (s_wireless) {
|
||||||
|
devices = nm_system_config_hal_manager_get_devices_of_type (hal_mgr, DEVICE_TYPE_802_11_WIRELESS);
|
||||||
|
udi = get_ether_device_udi (g_connection, s_wireless->mac_address, devices);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_slist_foreach (devices, (GFunc) g_free, NULL);
|
||||||
|
g_slist_free (devices);
|
||||||
|
|
||||||
|
return udi;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
device_added_cb (NMSystemConfigHalManager *hal_mgr,
|
||||||
|
const char *udi,
|
||||||
|
NMDeviceType devtype,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
NMIfcfgConnection *connection = NM_IFCFG_CONNECTION (user_data);
|
||||||
|
NMIfcfgConnectionPrivate *priv = NM_IFCFG_CONNECTION_GET_PRIVATE (connection);
|
||||||
|
NMConnection *wrapped;
|
||||||
|
|
||||||
|
/* Should only be called when udi is NULL */
|
||||||
|
g_return_if_fail (priv->udi == NULL);
|
||||||
|
|
||||||
|
wrapped = nm_exported_connection_get_connection (NM_EXPORTED_CONNECTION (connection));
|
||||||
|
if (devtype != get_device_type_for_connection (wrapped))
|
||||||
|
return;
|
||||||
|
|
||||||
|
priv->udi = get_udi_for_connection (wrapped, priv->g_connection, priv->hal_mgr, devtype);
|
||||||
|
if (!priv->udi)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* If the connection is unmanaged we have to tell the plugin */
|
||||||
|
if (priv->unmanaged)
|
||||||
|
g_object_notify (G_OBJECT (connection), NM_IFCFG_CONNECTION_UNMANAGED);
|
||||||
|
|
||||||
|
g_signal_handler_disconnect (G_OBJECT (hal_mgr), priv->daid);
|
||||||
|
priv->daid = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
NMIfcfgConnection *
|
||||||
|
nm_ifcfg_connection_new (const char *filename,
|
||||||
|
DBusGConnection *g_connection,
|
||||||
|
NMSystemConfigHalManager *hal_mgr,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
GObject *object;
|
||||||
|
NMConnection *wrapped;
|
||||||
|
gboolean unmanaged = FALSE;
|
||||||
|
char *udi;
|
||||||
|
|
||||||
|
g_return_val_if_fail (filename != NULL, NULL);
|
||||||
|
|
||||||
|
wrapped = connection_from_file (filename, &unmanaged, error);
|
||||||
|
if (!wrapped)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
udi = get_udi_for_connection (wrapped, g_connection, hal_mgr, DEVICE_TYPE_UNKNOWN);
|
||||||
|
|
||||||
|
object = (GObject *) g_object_new (NM_TYPE_IFCFG_CONNECTION,
|
||||||
|
NM_IFCFG_CONNECTION_FILENAME, filename,
|
||||||
|
NM_IFCFG_CONNECTION_UNMANAGED, unmanaged,
|
||||||
|
NM_IFCFG_CONNECTION_UDI, udi,
|
||||||
|
NM_EXPORTED_CONNECTION_CONNECTION, wrapped,
|
||||||
|
NULL);
|
||||||
|
if (object && !udi) {
|
||||||
|
NMIfcfgConnectionPrivate *priv = NM_IFCFG_CONNECTION_GET_PRIVATE (object);
|
||||||
|
|
||||||
|
priv->hal_mgr = g_object_ref (hal_mgr);
|
||||||
|
priv->g_connection = dbus_g_connection_ref (g_connection);
|
||||||
|
priv->daid = g_signal_connect (priv->hal_mgr, "device-added", G_CALLBACK (device_added_cb), object);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_object_unref (wrapped);
|
||||||
|
g_free (udi);
|
||||||
|
return (NMIfcfgConnection *) object;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
nm_ifcfg_connection_get_filename (NMIfcfgConnection *self)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (NM_IS_IFCFG_CONNECTION (self), NULL);
|
||||||
|
|
||||||
|
return NM_IFCFG_CONNECTION_GET_PRIVATE (self)->filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
nm_ifcfg_connection_get_udi (NMIfcfgConnection *self)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (NM_IS_IFCFG_CONNECTION (self), NULL);
|
||||||
|
|
||||||
|
return NM_IFCFG_CONNECTION_GET_PRIVATE (self)->udi;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
nm_ifcfg_connection_get_unmanaged (NMIfcfgConnection *self)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (NM_IS_IFCFG_CONNECTION (self), FALSE);
|
||||||
|
|
||||||
|
return NM_IFCFG_CONNECTION_GET_PRIVATE (self)->unmanaged;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GHashTable *
|
||||||
|
get_settings (NMExportedConnection *exported)
|
||||||
|
{
|
||||||
|
return nm_connection_to_hash (nm_exported_connection_get_connection (exported));
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
get_id (NMExportedConnection *exported)
|
||||||
|
{
|
||||||
|
return NM_IFCFG_CONNECTION_GET_PRIVATE (exported)->filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
update (NMExportedConnection *exported, GHashTable *new_settings, GError **error)
|
||||||
|
{
|
||||||
|
// write_connection (NM_IFCFG_CONNECTION (exported));
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
delete (NMExportedConnection *exported, GError **error)
|
||||||
|
{
|
||||||
|
NMIfcfgConnectionPrivate *priv = NM_IFCFG_CONNECTION_GET_PRIVATE (exported);
|
||||||
|
|
||||||
|
g_unlink (priv->filename);
|
||||||
|
if (priv->keyfile)
|
||||||
|
g_unlink (priv->keyfile);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* GObject */
|
||||||
|
|
||||||
|
static void
|
||||||
|
nm_ifcfg_connection_init (NMIfcfgConnection *connection)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
finalize (GObject *object)
|
||||||
|
{
|
||||||
|
NMIfcfgConnectionPrivate *priv = NM_IFCFG_CONNECTION_GET_PRIVATE (object);
|
||||||
|
NMConnection *wrapped;
|
||||||
|
|
||||||
|
wrapped = nm_exported_connection_get_connection (NM_EXPORTED_CONNECTION (object));
|
||||||
|
if (wrapped)
|
||||||
|
nm_connection_clear_secrets (wrapped);
|
||||||
|
|
||||||
|
g_free (priv->filename);
|
||||||
|
g_free (priv->udi);
|
||||||
|
|
||||||
|
if (priv->hal_mgr) {
|
||||||
|
if (priv->daid)
|
||||||
|
g_signal_handler_disconnect (G_OBJECT (priv->hal_mgr), priv->daid);
|
||||||
|
|
||||||
|
g_object_unref (priv->hal_mgr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (priv->g_connection)
|
||||||
|
dbus_g_connection_unref (priv->g_connection);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (nm_ifcfg_connection_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_property (GObject *object, guint prop_id,
|
||||||
|
const GValue *value, GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
NMIfcfgConnectionPrivate *priv = NM_IFCFG_CONNECTION_GET_PRIVATE (object);
|
||||||
|
|
||||||
|
switch (prop_id) {
|
||||||
|
case PROP_FILENAME:
|
||||||
|
/* Construct only */
|
||||||
|
priv->filename = g_value_dup_string (value);
|
||||||
|
break;
|
||||||
|
case PROP_UNMANAGED:
|
||||||
|
priv->unmanaged = g_value_get_boolean (value);
|
||||||
|
break;
|
||||||
|
case PROP_UDI:
|
||||||
|
/* Construct only */
|
||||||
|
priv->udi = g_value_dup_string (value);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
get_property (GObject *object, guint prop_id,
|
||||||
|
GValue *value, GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
NMIfcfgConnectionPrivate *priv = NM_IFCFG_CONNECTION_GET_PRIVATE (object);
|
||||||
|
|
||||||
|
switch (prop_id) {
|
||||||
|
case PROP_FILENAME:
|
||||||
|
g_value_set_string (value, priv->filename);
|
||||||
|
break;
|
||||||
|
case PROP_UNMANAGED:
|
||||||
|
g_value_set_boolean (value, priv->unmanaged);
|
||||||
|
break;
|
||||||
|
case PROP_UDI:
|
||||||
|
g_value_set_string (value, priv->udi);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
nm_ifcfg_connection_class_init (NMIfcfgConnectionClass *ifcfg_connection_class)
|
||||||
|
{
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (ifcfg_connection_class);
|
||||||
|
NMExportedConnectionClass *connection_class = NM_EXPORTED_CONNECTION_CLASS (ifcfg_connection_class);
|
||||||
|
|
||||||
|
g_type_class_add_private (ifcfg_connection_class, sizeof (NMIfcfgConnectionPrivate));
|
||||||
|
|
||||||
|
/* Virtual methods */
|
||||||
|
object_class->set_property = set_property;
|
||||||
|
object_class->get_property = get_property;
|
||||||
|
object_class->finalize = finalize;
|
||||||
|
|
||||||
|
connection_class->get_settings = get_settings;
|
||||||
|
connection_class->get_id = get_id;
|
||||||
|
connection_class->update = update;
|
||||||
|
connection_class->delete = delete;
|
||||||
|
|
||||||
|
/* Properties */
|
||||||
|
g_object_class_install_property
|
||||||
|
(object_class, PROP_FILENAME,
|
||||||
|
g_param_spec_string (NM_IFCFG_CONNECTION_FILENAME,
|
||||||
|
"FileName",
|
||||||
|
"File name",
|
||||||
|
NULL,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
||||||
|
|
||||||
|
g_object_class_install_property
|
||||||
|
(object_class, PROP_UNMANAGED,
|
||||||
|
g_param_spec_boolean (NM_IFCFG_CONNECTION_UNMANAGED,
|
||||||
|
"Unmanaged",
|
||||||
|
"Unmanaged",
|
||||||
|
FALSE,
|
||||||
|
G_PARAM_READWRITE));
|
||||||
|
|
||||||
|
g_object_class_install_property
|
||||||
|
(object_class, PROP_UDI,
|
||||||
|
g_param_spec_string (NM_IFCFG_CONNECTION_UDI,
|
||||||
|
"UDI",
|
||||||
|
"UDI",
|
||||||
|
NULL,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
||||||
|
}
|
63
system-settings/plugins/ifcfg-fedora/nm-ifcfg-connection.h
Normal file
63
system-settings/plugins/ifcfg-fedora/nm-ifcfg-connection.h
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||||
|
/* NetworkManager system settings service
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* (C) Copyright 2008 Red Hat, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NM_IFCFG_CONNECTION_H
|
||||||
|
#define NM_IFCFG_CONNECTION_H
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#include <nm-settings.h>
|
||||||
|
#include "nm-system-config-hal-manager.h"
|
||||||
|
|
||||||
|
#define NM_TYPE_IFCFG_CONNECTION (nm_ifcfg_connection_get_type ())
|
||||||
|
#define NM_IFCFG_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_IFCFG_CONNECTION, NMIfcfgConnection))
|
||||||
|
#define NM_IFCFG_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_IFCFG_CONNECTION, NMIfcfgConnectionClass))
|
||||||
|
#define NM_IS_IFCFG_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_IFCFG_CONNECTION))
|
||||||
|
#define NM_IS_IFCFG_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), NM_TYPE_IFCFG_CONNECTION))
|
||||||
|
#define NM_IFCFG_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_IFCFG_CONNECTION, NMIfcfgConnectionClass))
|
||||||
|
|
||||||
|
#define NM_IFCFG_CONNECTION_FILENAME "filename"
|
||||||
|
#define NM_IFCFG_CONNECTION_UNMANAGED "unmanaged"
|
||||||
|
#define NM_IFCFG_CONNECTION_UDI "udi"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
NMExportedConnection parent;
|
||||||
|
} NMIfcfgConnection;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
NMExportedConnectionClass parent;
|
||||||
|
} NMIfcfgConnectionClass;
|
||||||
|
|
||||||
|
GType nm_ifcfg_connection_get_type (void);
|
||||||
|
|
||||||
|
NMIfcfgConnection *nm_ifcfg_connection_new (const char *filename,
|
||||||
|
DBusGConnection *g_connection,
|
||||||
|
NMSystemConfigHalManager *hal_mgr,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
|
const char *nm_ifcfg_connection_get_filename (NMIfcfgConnection *self);
|
||||||
|
|
||||||
|
const char *nm_ifcfg_connection_get_udi (NMIfcfgConnection *self);
|
||||||
|
|
||||||
|
gboolean nm_ifcfg_connection_get_unmanaged (NMIfcfgConnection *self);
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* NM_IFCFG_CONNECTION_H */
|
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,5 @@
|
|||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||||
/* NetworkManager system settings service
|
/* NetworkManager system settings service
|
||||||
*
|
|
||||||
* Søren Sandmann <sandmann@daimi.au.dk>
|
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -16,7 +15,7 @@
|
|||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
*
|
*
|
||||||
* (C) Copyright 2007 Red Hat, Inc.
|
* (C) Copyright 2008 Red Hat, Inc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -40,7 +39,6 @@
|
|||||||
#undef __user
|
#undef __user
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
#include <nm-connection.h>
|
#include <nm-connection.h>
|
||||||
#include <NetworkManager.h>
|
#include <NetworkManager.h>
|
||||||
#include <nm-setting-connection.h>
|
#include <nm-setting-connection.h>
|
||||||
@@ -49,91 +47,27 @@
|
|||||||
#include <nm-setting-wireless.h>
|
#include <nm-setting-wireless.h>
|
||||||
#include <nm-utils.h>
|
#include <nm-utils.h>
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
#include "shvar.h"
|
#include "shvar.h"
|
||||||
#include "parser.h"
|
|
||||||
#include "plugin.h"
|
|
||||||
|
|
||||||
#define CONNECTION_DATA_TAG "plugin-data"
|
#include "reader.h"
|
||||||
|
|
||||||
ConnectionData *
|
#define TYPE_ETHERNET "Ethernet"
|
||||||
connection_data_get (NMConnection *connection)
|
#define TYPE_WIRELESS "Wireless"
|
||||||
|
|
||||||
|
static char *
|
||||||
|
get_ifcfg_name (const char *file)
|
||||||
{
|
{
|
||||||
return (ConnectionData *) g_object_get_data (G_OBJECT (connection), CONNECTION_DATA_TAG);
|
char *ifcfg_name;
|
||||||
}
|
char *basename;
|
||||||
|
|
||||||
static void
|
basename = g_path_get_basename (file);
|
||||||
copy_one_cdata_secret (gpointer key, gpointer data, gpointer user_data)
|
if (!basename)
|
||||||
{
|
return NULL;
|
||||||
GHashTable *to = (GHashTable *) user_data;
|
|
||||||
|
|
||||||
g_hash_table_insert (to, key, g_strdup (data));
|
ifcfg_name = g_strdup (basename + strlen (IFCFG_TAG));
|
||||||
}
|
g_free (basename);
|
||||||
|
return ifcfg_name;
|
||||||
static void
|
|
||||||
clear_one_cdata_secret (gpointer key, gpointer data, gpointer user_data)
|
|
||||||
{
|
|
||||||
guint32 len = strlen (data);
|
|
||||||
memset (data, 0, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
connection_data_copy_secrets (ConnectionData *from, ConnectionData *to)
|
|
||||||
{
|
|
||||||
g_return_if_fail (from != NULL);
|
|
||||||
g_return_if_fail (to != NULL);
|
|
||||||
|
|
||||||
g_hash_table_foreach (to->wifi_secrets, clear_one_cdata_secret, NULL);
|
|
||||||
g_hash_table_remove_all (to->wifi_secrets);
|
|
||||||
g_hash_table_foreach (from->wifi_secrets, copy_one_cdata_secret, to->wifi_secrets);
|
|
||||||
|
|
||||||
g_hash_table_foreach (to->onex_secrets, clear_one_cdata_secret, NULL);
|
|
||||||
g_hash_table_remove_all (to->onex_secrets);
|
|
||||||
g_hash_table_foreach (from->onex_secrets, copy_one_cdata_secret, to->onex_secrets);
|
|
||||||
|
|
||||||
g_hash_table_foreach (to->ppp_secrets, clear_one_cdata_secret, NULL);
|
|
||||||
g_hash_table_remove_all (to->ppp_secrets);
|
|
||||||
g_hash_table_foreach (from->ppp_secrets, copy_one_cdata_secret, to->ppp_secrets);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
connection_data_free (gpointer userdata)
|
|
||||||
{
|
|
||||||
ConnectionData *cdata = (ConnectionData *) userdata;
|
|
||||||
|
|
||||||
g_return_if_fail (cdata != NULL);
|
|
||||||
|
|
||||||
g_hash_table_foreach (cdata->wifi_secrets, clear_one_cdata_secret, NULL);
|
|
||||||
g_hash_table_destroy (cdata->wifi_secrets);
|
|
||||||
|
|
||||||
g_hash_table_foreach (cdata->onex_secrets, clear_one_cdata_secret, NULL);
|
|
||||||
g_hash_table_destroy (cdata->onex_secrets);
|
|
||||||
|
|
||||||
g_hash_table_foreach (cdata->ppp_secrets, clear_one_cdata_secret, NULL);
|
|
||||||
g_hash_table_destroy (cdata->ppp_secrets);
|
|
||||||
|
|
||||||
g_free (cdata->ifcfg_path);
|
|
||||||
g_free (cdata->udi);
|
|
||||||
|
|
||||||
memset (cdata, 0, sizeof (ConnectionData));
|
|
||||||
g_free (cdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
ConnectionData *
|
|
||||||
connection_data_add (NMConnection *connection, const char *ifcfg_path)
|
|
||||||
{
|
|
||||||
ConnectionData *cdata;
|
|
||||||
|
|
||||||
cdata = g_malloc0 (sizeof (ConnectionData));
|
|
||||||
cdata->ifcfg_path = g_strdup (ifcfg_path);
|
|
||||||
|
|
||||||
cdata->wifi_secrets = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
|
|
||||||
cdata->onex_secrets = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
|
|
||||||
cdata->ppp_secrets = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
|
|
||||||
|
|
||||||
g_object_set_data_full (G_OBJECT (connection),
|
|
||||||
CONNECTION_DATA_TAG, cdata,
|
|
||||||
connection_data_free);
|
|
||||||
return cdata;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -148,56 +82,6 @@ get_int (const char *str, int *value)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
should_ignore_file (const char *basename, const char *tag)
|
|
||||||
{
|
|
||||||
int len, tag_len;
|
|
||||||
|
|
||||||
g_return_val_if_fail (basename != NULL, TRUE);
|
|
||||||
g_return_val_if_fail (tag != NULL, TRUE);
|
|
||||||
|
|
||||||
len = strlen (basename);
|
|
||||||
tag_len = strlen (tag);
|
|
||||||
if ((len > tag_len) && !strcasecmp (basename + len - tag_len, tag))
|
|
||||||
return TRUE;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *
|
|
||||||
get_ifcfg_name (const char *file)
|
|
||||||
{
|
|
||||||
char *ifcfg_name = NULL;
|
|
||||||
char *basename;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
basename = g_path_get_basename (file);
|
|
||||||
if (!basename)
|
|
||||||
goto error;
|
|
||||||
len = strlen (basename);
|
|
||||||
|
|
||||||
if (len < strlen (IFCFG_TAG) + 1)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (strncmp (basename, IFCFG_TAG, strlen (IFCFG_TAG)))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
/* ignore some files */
|
|
||||||
if (should_ignore_file (basename, BAK_TAG))
|
|
||||||
goto error;
|
|
||||||
if (should_ignore_file (basename, TILDE_TAG))
|
|
||||||
goto error;
|
|
||||||
if (should_ignore_file (basename, ORIG_TAG))
|
|
||||||
goto error;
|
|
||||||
if (should_ignore_file (basename, REJ_TAG))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
ifcfg_name = g_strdup (basename + strlen (IFCFG_TAG));
|
|
||||||
|
|
||||||
error:
|
|
||||||
g_free (basename);
|
|
||||||
return ifcfg_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
static NMSetting *
|
static NMSetting *
|
||||||
make_connection_setting (const char *file,
|
make_connection_setting (const char *file,
|
||||||
shvarFile *ifcfg,
|
shvarFile *ifcfg,
|
||||||
@@ -426,7 +310,7 @@ static gboolean
|
|||||||
add_one_wep_key (shvarFile *ifcfg,
|
add_one_wep_key (shvarFile *ifcfg,
|
||||||
const char *shvar_key,
|
const char *shvar_key,
|
||||||
guint8 key_idx,
|
guint8 key_idx,
|
||||||
GHashTable *secrets,
|
NMSettingWirelessSecurity *s_wsec,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
char *key = NULL;
|
char *key = NULL;
|
||||||
@@ -436,7 +320,7 @@ add_one_wep_key (shvarFile *ifcfg,
|
|||||||
g_return_val_if_fail (ifcfg != NULL, FALSE);
|
g_return_val_if_fail (ifcfg != NULL, FALSE);
|
||||||
g_return_val_if_fail (shvar_key != NULL, FALSE);
|
g_return_val_if_fail (shvar_key != NULL, FALSE);
|
||||||
g_return_val_if_fail (key_idx <= 3, FALSE);
|
g_return_val_if_fail (key_idx <= 3, FALSE);
|
||||||
g_return_val_if_fail (secrets != NULL, FALSE);
|
g_return_val_if_fail (s_wsec != NULL, FALSE);
|
||||||
|
|
||||||
value = svGetValue (ifcfg, shvar_key);
|
value = svGetValue (ifcfg, shvar_key);
|
||||||
if (!value || !strlen (value)) {
|
if (!value || !strlen (value)) {
|
||||||
@@ -478,13 +362,13 @@ add_one_wep_key (shvarFile *ifcfg,
|
|||||||
|
|
||||||
if (key) {
|
if (key) {
|
||||||
if (key_idx == 0)
|
if (key_idx == 0)
|
||||||
g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, key);
|
s_wsec->wep_key0 = key;
|
||||||
else if (key_idx == 1)
|
else if (key_idx == 1)
|
||||||
g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY1, key);
|
s_wsec->wep_key1 = key;
|
||||||
else if (key_idx == 2)
|
else if (key_idx == 2)
|
||||||
g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY2, key);
|
s_wsec->wep_key2 = key;
|
||||||
else if (key_idx == 3)
|
else if (key_idx == 3)
|
||||||
g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY3, key);
|
s_wsec->wep_key3 = key;
|
||||||
else
|
else
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
success = TRUE;
|
success = TRUE;
|
||||||
@@ -525,17 +409,20 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
read_wep_keys (shvarFile *ifcfg, guint8 def_idx, GHashTable *secrets, GError **error)
|
read_wep_keys (shvarFile *ifcfg,
|
||||||
|
guint8 def_idx,
|
||||||
|
NMSettingWirelessSecurity *s_wsec,
|
||||||
|
GError **error)
|
||||||
{
|
{
|
||||||
if (!add_one_wep_key (ifcfg, "KEY1", 0, secrets, error))
|
if (!add_one_wep_key (ifcfg, "KEY1", 0, s_wsec, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (!add_one_wep_key (ifcfg, "KEY2", 1, secrets, error))
|
if (!add_one_wep_key (ifcfg, "KEY2", 1, s_wsec, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (!add_one_wep_key (ifcfg, "KEY3", 2, secrets, error))
|
if (!add_one_wep_key (ifcfg, "KEY3", 2, s_wsec, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (!add_one_wep_key (ifcfg, "KEY4", 3, secrets, error))
|
if (!add_one_wep_key (ifcfg, "KEY4", 3, s_wsec, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (!add_one_wep_key (ifcfg, "KEY", def_idx, secrets, error))
|
if (!add_one_wep_key (ifcfg, "KEY", def_idx, s_wsec, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -544,7 +431,6 @@ read_wep_keys (shvarFile *ifcfg, guint8 def_idx, GHashTable *secrets, GError **e
|
|||||||
static NMSetting *
|
static NMSetting *
|
||||||
make_wireless_security_setting (shvarFile *ifcfg,
|
make_wireless_security_setting (shvarFile *ifcfg,
|
||||||
const char *file,
|
const char *file,
|
||||||
ConnectionData *cdata,
|
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
NMSettingWirelessSecurity *s_wireless_sec;
|
NMSettingWirelessSecurity *s_wireless_sec;
|
||||||
@@ -572,13 +458,13 @@ make_wireless_security_setting (shvarFile *ifcfg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Read keys in the ifcfg file */
|
/* Read keys in the ifcfg file */
|
||||||
if (!read_wep_keys (ifcfg, default_key_idx, cdata->wifi_secrets, error))
|
if (!read_wep_keys (ifcfg, default_key_idx, s_wireless_sec, error))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* Try to get keys from the "shadow" key file */
|
/* Try to get keys from the "shadow" key file */
|
||||||
keys_ifcfg = get_keys_ifcfg (file);
|
keys_ifcfg = get_keys_ifcfg (file);
|
||||||
if (keys_ifcfg) {
|
if (keys_ifcfg) {
|
||||||
if (!read_wep_keys (keys_ifcfg, default_key_idx, cdata->wifi_secrets, error)) {
|
if (!read_wep_keys (keys_ifcfg, default_key_idx, s_wireless_sec, error)) {
|
||||||
svCloseFile (keys_ifcfg);
|
svCloseFile (keys_ifcfg);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@@ -586,18 +472,15 @@ make_wireless_security_setting (shvarFile *ifcfg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* If there's a default key, ensure that key exists */
|
/* If there's a default key, ensure that key exists */
|
||||||
if ( (default_key_idx == 1)
|
if ((default_key_idx == 1) && !s_wireless_sec->wep_key1) {
|
||||||
&& !g_hash_table_lookup (cdata->wifi_secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY1)) {
|
|
||||||
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
||||||
"Default WEP key index was 2, but no valid KEY2 exists.");
|
"Default WEP key index was 2, but no valid KEY2 exists.");
|
||||||
goto error;
|
goto error;
|
||||||
} else if ( (default_key_idx == 2)
|
} else if ((default_key_idx == 2) && !s_wireless_sec->wep_key2) {
|
||||||
&& !g_hash_table_lookup (cdata->wifi_secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY2)) {
|
|
||||||
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
||||||
"Default WEP key index was 3, but no valid KEY3 exists.");
|
"Default WEP key index was 3, but no valid KEY3 exists.");
|
||||||
goto error;
|
goto error;
|
||||||
} else if ( (default_key_idx == 3)
|
} else if ((default_key_idx == 3) && !s_wireless_sec->wep_key3) {
|
||||||
&& !g_hash_table_lookup (cdata->wifi_secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY3)) {
|
|
||||||
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
||||||
"Default WEP key index was 4, but no valid KEY4 exists.");
|
"Default WEP key index was 4, but no valid KEY4 exists.");
|
||||||
goto error;
|
goto error;
|
||||||
@@ -624,10 +507,10 @@ make_wireless_security_setting (shvarFile *ifcfg,
|
|||||||
g_free (lcase);
|
g_free (lcase);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !g_hash_table_lookup (cdata->wifi_secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0)
|
if ( !s_wireless_sec->wep_key0
|
||||||
&& !g_hash_table_lookup (cdata->wifi_secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY1)
|
&& !s_wireless_sec->wep_key1
|
||||||
&& !g_hash_table_lookup (cdata->wifi_secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY2)
|
&& !s_wireless_sec->wep_key2
|
||||||
&& !g_hash_table_lookup (cdata->wifi_secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY3)
|
&& !s_wireless_sec->wep_key3
|
||||||
&& !s_wireless_sec->wep_tx_keyidx) {
|
&& !s_wireless_sec->wep_tx_keyidx) {
|
||||||
if (s_wireless_sec->auth_alg && !strcmp (s_wireless_sec->auth_alg, "shared")) {
|
if (s_wireless_sec->auth_alg && !strcmp (s_wireless_sec->auth_alg, "shared")) {
|
||||||
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
||||||
@@ -730,7 +613,6 @@ wireless_connection_from_ifcfg (const char *file, shvarFile *ifcfg, GError **err
|
|||||||
NMSettingWireless *tmp;
|
NMSettingWireless *tmp;
|
||||||
NMSetting *security_setting = NULL;
|
NMSetting *security_setting = NULL;
|
||||||
char *printable_ssid = NULL;
|
char *printable_ssid = NULL;
|
||||||
ConnectionData *cdata;
|
|
||||||
|
|
||||||
g_return_val_if_fail (file != NULL, NULL);
|
g_return_val_if_fail (file != NULL, NULL);
|
||||||
g_return_val_if_fail (ifcfg != NULL, NULL);
|
g_return_val_if_fail (ifcfg != NULL, NULL);
|
||||||
@@ -744,11 +626,8 @@ wireless_connection_from_ifcfg (const char *file, shvarFile *ifcfg, GError **err
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add plugin specific data to connection */
|
|
||||||
cdata = connection_data_add (connection, file);
|
|
||||||
|
|
||||||
/* Wireless security */
|
/* Wireless security */
|
||||||
security_setting = make_wireless_security_setting (ifcfg, file, cdata, error);
|
security_setting = make_wireless_security_setting (ifcfg, file, error);
|
||||||
if (*error)
|
if (*error)
|
||||||
goto error;
|
goto error;
|
||||||
if (security_setting)
|
if (security_setting)
|
||||||
@@ -830,7 +709,6 @@ wired_connection_from_ifcfg (const char *file, shvarFile *ifcfg, GError **error)
|
|||||||
NMConnection *connection = NULL;
|
NMConnection *connection = NULL;
|
||||||
NMSetting *con_setting = NULL;
|
NMSetting *con_setting = NULL;
|
||||||
NMSetting *wired_setting = NULL;
|
NMSetting *wired_setting = NULL;
|
||||||
ConnectionData *cdata;
|
|
||||||
|
|
||||||
g_return_val_if_fail (file != NULL, NULL);
|
g_return_val_if_fail (file != NULL, NULL);
|
||||||
g_return_val_if_fail (ifcfg != NULL, NULL);
|
g_return_val_if_fail (ifcfg != NULL, NULL);
|
||||||
@@ -850,9 +728,6 @@ wired_connection_from_ifcfg (const char *file, shvarFile *ifcfg, GError **error)
|
|||||||
}
|
}
|
||||||
nm_connection_add_setting (connection, con_setting);
|
nm_connection_add_setting (connection, con_setting);
|
||||||
|
|
||||||
/* Add plugin data to connection */
|
|
||||||
cdata = connection_data_add (connection, file);
|
|
||||||
|
|
||||||
wired_setting = make_wired_setting (ifcfg, error);
|
wired_setting = make_wired_setting (ifcfg, error);
|
||||||
if (!wired_setting)
|
if (!wired_setting)
|
||||||
goto error;
|
goto error;
|
||||||
@@ -913,11 +788,8 @@ out:
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define TYPE_ETHERNET "Ethernet"
|
|
||||||
#define TYPE_WIRELESS "Wireless"
|
|
||||||
|
|
||||||
NMConnection *
|
NMConnection *
|
||||||
parser_parse_file (const char *file, GError **error)
|
connection_from_file (const char *filename, gboolean *ignored, GError **error)
|
||||||
{
|
{
|
||||||
NMConnection *connection = NULL;
|
NMConnection *connection = NULL;
|
||||||
shvarFile *parsed;
|
shvarFile *parsed;
|
||||||
@@ -925,23 +797,22 @@ parser_parse_file (const char *file, GError **error)
|
|||||||
char *nmc = NULL;
|
char *nmc = NULL;
|
||||||
NMSetting *s_ip4;
|
NMSetting *s_ip4;
|
||||||
char *ifcfg_name = NULL;
|
char *ifcfg_name = NULL;
|
||||||
gboolean ignored = FALSE;
|
|
||||||
ConnectionData *cdata;
|
|
||||||
|
|
||||||
g_return_val_if_fail (file != NULL, NULL);
|
g_return_val_if_fail (filename != NULL, NULL);
|
||||||
|
g_return_val_if_fail (ignored != NULL, NULL);
|
||||||
|
|
||||||
ifcfg_name = get_ifcfg_name (file);
|
ifcfg_name = get_ifcfg_name (filename);
|
||||||
if (!ifcfg_name) {
|
if (!ifcfg_name) {
|
||||||
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
||||||
"Ignoring connection '%s' because it's not an ifcfg file.", file);
|
"Ignoring connection '%s' because it's not an ifcfg file.", filename);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
g_free (ifcfg_name);
|
g_free (ifcfg_name);
|
||||||
|
|
||||||
parsed = svNewFile (file);
|
parsed = svNewFile (filename);
|
||||||
if (!parsed) {
|
if (!parsed) {
|
||||||
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
||||||
"Couldn't parse file '%s'", file);
|
"Couldn't parse file '%s'", filename);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -956,7 +827,7 @@ parser_parse_file (const char *file, GError **error)
|
|||||||
device = svGetValue (parsed, "DEVICE");
|
device = svGetValue (parsed, "DEVICE");
|
||||||
if (!device) {
|
if (!device) {
|
||||||
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
||||||
"File '%s' had neither TYPE nor DEVICE keys.", file);
|
"File '%s' had neither TYPE nor DEVICE keys.", filename);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -971,7 +842,7 @@ parser_parse_file (const char *file, GError **error)
|
|||||||
if (!is_wireless_device (device, &is_wireless)) {
|
if (!is_wireless_device (device, &is_wireless)) {
|
||||||
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
||||||
"File '%s' specified device '%s', but the device's "
|
"File '%s' specified device '%s', but the device's "
|
||||||
"type could not be determined.", file, device);
|
"type could not be determined.", filename, device);
|
||||||
g_free (device);
|
g_free (device);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
@@ -992,14 +863,14 @@ parser_parse_file (const char *file, GError **error)
|
|||||||
g_free (nmc);
|
g_free (nmc);
|
||||||
|
|
||||||
if (!strcmp (lower, "no") || !strcmp (lower, "n") || !strcmp (lower, "false"))
|
if (!strcmp (lower, "no") || !strcmp (lower, "n") || !strcmp (lower, "false"))
|
||||||
ignored = TRUE;
|
*ignored = TRUE;
|
||||||
g_free (lower);
|
g_free (lower);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strcmp (type, TYPE_ETHERNET))
|
if (!strcmp (type, TYPE_ETHERNET))
|
||||||
connection = wired_connection_from_ifcfg (file, parsed, error);
|
connection = wired_connection_from_ifcfg (filename, parsed, error);
|
||||||
else if (!strcmp (type, TYPE_WIRELESS))
|
else if (!strcmp (type, TYPE_WIRELESS))
|
||||||
connection = wireless_connection_from_ifcfg (file, parsed, error);
|
connection = wireless_connection_from_ifcfg (filename, parsed, error);
|
||||||
else {
|
else {
|
||||||
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
g_set_error (error, ifcfg_plugin_error_quark (), 0,
|
||||||
"Unknown connection type '%s'", type);
|
"Unknown connection type '%s'", type);
|
||||||
@@ -1019,10 +890,6 @@ parser_parse_file (const char *file, GError **error)
|
|||||||
nm_connection_add_setting (connection, s_ip4);
|
nm_connection_add_setting (connection, s_ip4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the ignored tag */
|
|
||||||
cdata = connection_data_get (connection);
|
|
||||||
cdata->ignored = ignored;
|
|
||||||
|
|
||||||
if (!nm_connection_verify (connection)) {
|
if (!nm_connection_verify (connection)) {
|
||||||
g_object_unref (connection);
|
g_object_unref (connection);
|
||||||
connection = NULL;
|
connection = NULL;
|
||||||
@@ -1035,3 +902,4 @@ done:
|
|||||||
return connection;
|
return connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
29
system-settings/plugins/ifcfg-fedora/reader.h
Normal file
29
system-settings/plugins/ifcfg-fedora/reader.h
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||||
|
/* NetworkManager system settings service
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* (C) Copyright 2008 Red Hat, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __READER_H__
|
||||||
|
#define __READER_H__
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
#include <nm-connection.h>
|
||||||
|
|
||||||
|
NMConnection *connection_from_file (const char *filename, gboolean *ignored, GError **error);
|
||||||
|
|
||||||
|
#endif /* __READER_H__ */
|
@@ -69,6 +69,38 @@ enum {
|
|||||||
LAST_PROP
|
LAST_PROP
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
load_connections (NMSysconfigSettings *self)
|
||||||
|
{
|
||||||
|
NMSysconfigSettingsPrivate *priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (self);
|
||||||
|
GSList *iter;
|
||||||
|
|
||||||
|
if (priv->connections_loaded)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (iter = priv->plugins; iter; iter = g_slist_next (iter)) {
|
||||||
|
NMSystemConfigInterface *plugin = NM_SYSTEM_CONFIG_INTERFACE (iter->data);
|
||||||
|
GSList *plugin_connections;
|
||||||
|
GSList *elt;
|
||||||
|
|
||||||
|
plugin_connections = nm_system_config_interface_get_connections (plugin);
|
||||||
|
|
||||||
|
// FIXME: ensure connections from plugins loaded with a lower priority
|
||||||
|
// get rejected when they conflict with connections from a higher
|
||||||
|
// priority plugin.
|
||||||
|
|
||||||
|
for (elt = plugin_connections; elt; elt = g_slist_next (elt))
|
||||||
|
nm_sysconfig_settings_add_connection (self, NM_EXPORTED_CONNECTION (elt->data));
|
||||||
|
|
||||||
|
g_slist_free (plugin_connections);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: Bad hack */
|
||||||
|
unmanaged_devices_changed (NULL, self);
|
||||||
|
|
||||||
|
priv->connections_loaded = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
hash_keys_to_slist (gpointer key, gpointer val, gpointer user_data)
|
hash_keys_to_slist (gpointer key, gpointer val, gpointer user_data)
|
||||||
{
|
{
|
||||||
@@ -84,31 +116,7 @@ list_connections (NMSettings *settings)
|
|||||||
NMSysconfigSettingsPrivate *priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (self);
|
NMSysconfigSettingsPrivate *priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (self);
|
||||||
GSList *list = NULL;
|
GSList *list = NULL;
|
||||||
|
|
||||||
if (!priv->connections_loaded) {
|
load_connections (self);
|
||||||
GSList *iter;
|
|
||||||
|
|
||||||
for (iter = priv->plugins; iter; iter = g_slist_next (iter)) {
|
|
||||||
NMSystemConfigInterface *plugin = NM_SYSTEM_CONFIG_INTERFACE (iter->data);
|
|
||||||
GSList *plugin_connections;
|
|
||||||
GSList *elt;
|
|
||||||
|
|
||||||
plugin_connections = nm_system_config_interface_get_connections (plugin);
|
|
||||||
|
|
||||||
// FIXME: ensure connections from plugins loaded with a lower priority
|
|
||||||
// get rejected when they conflict with connections from a higher
|
|
||||||
// priority plugin.
|
|
||||||
|
|
||||||
for (elt = plugin_connections; elt; elt = g_slist_next (elt))
|
|
||||||
nm_sysconfig_settings_add_connection (self, NM_EXPORTED_CONNECTION (elt->data));
|
|
||||||
|
|
||||||
g_slist_free (plugin_connections);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FIXME: Bad hack */
|
|
||||||
unmanaged_devices_changed (NULL, self);
|
|
||||||
|
|
||||||
priv->connections_loaded = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_hash_table_foreach (priv->connections, hash_keys_to_slist, &list);
|
g_hash_table_foreach (priv->connections, hash_keys_to_slist, &list);
|
||||||
|
|
||||||
@@ -195,6 +203,8 @@ get_unmanaged_devices (NMSysconfigSettings *self)
|
|||||||
NMSysconfigSettingsPrivate *priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (self);
|
NMSysconfigSettingsPrivate *priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (self);
|
||||||
GPtrArray *devices;
|
GPtrArray *devices;
|
||||||
|
|
||||||
|
load_connections (self);
|
||||||
|
|
||||||
devices = g_ptr_array_sized_new (3);
|
devices = g_ptr_array_sized_new (3);
|
||||||
g_hash_table_foreach (priv->unmanaged_devices, (GHFunc) add_one_unmanaged_device, devices);
|
g_hash_table_foreach (priv->unmanaged_devices, (GHFunc) add_one_unmanaged_device, devices);
|
||||||
return devices;
|
return devices;
|
||||||
@@ -406,6 +416,9 @@ nm_sysconfig_settings_is_device_managed (NMSysconfigSettings *self,
|
|||||||
g_return_val_if_fail (NM_IS_SYSCONFIG_SETTINGS (self), FALSE);
|
g_return_val_if_fail (NM_IS_SYSCONFIG_SETTINGS (self), FALSE);
|
||||||
|
|
||||||
priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (self);
|
priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (self);
|
||||||
|
|
||||||
|
load_connections (self);
|
||||||
|
|
||||||
if (g_hash_table_lookup (priv->unmanaged_devices, udi))
|
if (g_hash_table_lookup (priv->unmanaged_devices, udi))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
Reference in New Issue
Block a user