2008-11-03 04:13:42 +00:00
|
|
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
|
|
|
|
/* NetworkManager -- Network link manager
|
|
|
|
|
*
|
|
|
|
|
* 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.,
|
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
|
*
|
2009-05-20 12:02:18 -04:00
|
|
|
* Copyright (C) 2007 - 2009 Novell, Inc.
|
2010-04-06 16:20:11 -07:00
|
|
|
* Copyright (C) 2007 - 2010 Red Hat, Inc.
|
2008-11-03 04:13:42 +00:00
|
|
|
*/
|
2007-08-15 07:52:25 +00:00
|
|
|
|
2010-08-13 13:18:58 -05:00
|
|
|
#include <config.h>
|
|
|
|
|
|
2007-10-09 08:57:35 +00:00
|
|
|
#include <netinet/ether.h>
|
2007-02-08 15:34:26 +00:00
|
|
|
#include <string.h>
|
2008-11-21 18:11:15 +00:00
|
|
|
#include <dbus/dbus-glib-lowlevel.h>
|
|
|
|
|
#include <dbus/dbus-glib.h>
|
2007-02-08 15:34:26 +00:00
|
|
|
|
2008-12-31 18:57:36 -05:00
|
|
|
#include "nm-glib-compat.h"
|
2007-02-08 15:34:26 +00:00
|
|
|
#include "nm-manager.h"
|
2010-04-06 16:20:11 -07:00
|
|
|
#include "nm-logging.h"
|
2007-02-08 15:34:26 +00:00
|
|
|
#include "nm-dbus-manager.h"
|
2008-03-26 13:43:01 +00:00
|
|
|
#include "nm-vpn-manager.h"
|
2009-01-19 11:01:00 +02:00
|
|
|
#include "nm-modem-manager.h"
|
2009-05-14 13:59:03 -04:00
|
|
|
#include "nm-device-bt.h"
|
2007-02-09 08:50:35 +00:00
|
|
|
#include "nm-device-interface.h"
|
2008-04-07 Dan Williams <dcbw@redhat.com>
* include/NetworkManager.h
- Remove the DOWN and CANCELLED device states
- Add UNMANAGED and UNAVAILABLE device states
- Document the device states
* introspection/nm-device.xml
src/nm-device-interface.c
src/nm-device-interface.h
- Add the 'managed' property
* test/nm-tool.c
- (detail_device): print out device state
* src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerMandriva.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerSuSE.c
- (nm_system_device_get_system_config, nm_system_device_get_disabled
nm_system_device_free_system_config): remove; they were unused and
their functionality should be re-implemented in each distro's
system settings service plugin
* src/nm-gsm-device.c
src/nm-gsm-device.h
src/nm-cdma-device.c
src/nm-cdma-device.h
- (*_new): take the 'managed' argument
* src/nm-device.c
- (nm_device_set_address): remove, fold into nm_device_bring_up()
- (nm_device_init): start in unmanaged state, not disconnected
- (constructor): don't start device until the system settings service
has had a chance to figure out if the device is managed or not
- (nm_device_deactivate, nm_device_bring_up, nm_device_bring_down):
don't set device state here, let callers handle that as appropriate
- (nm_device_dispose): don't touch the device if it's not managed
- (set_property, get_property, nm_device_class_init): implement the
'managed' property
- (nm_device_state_changed): bring the device up if its now managed,
and deactivate it if it used to be active
- (nm_device_get_managed, nm_device_set_managed): do the right thing
with the managed state
* src/nm-hal-manager.c
- (wired_device_creator, wireless_device_creator, modem_device_creator):
take initial managed state and pass it along to device constructors
- (create_device_and_add_to_list): get managed state and pass to
type creators
* src/nm-device-802-11-wireless.c
- (real_can_activate): fold in most of
nm_device_802_11_wireless_can_activate()
- (can_scan): can't scan in UNAVAILABLE or UNMANAGED
- (link_timeout_cb): instead of deactivating, change device state and
let the device state handler to it
- (real_update_hw_address): clean up
- (state_changed_cb): when entering UNAVAILABLE state, schedule an idle
handler to transition to DISCONNECTED if the device isn't rfkilled
* src/nm-device-802-3-ethernet.c
- (set_carrier): move above callers and get rid of prototype
- (device_state_changed): when entering UNAVAILABLE state, schedule an
idle handler to transition to DISCONNECTED if the device has a
carrier
- (real_update_hw_address): clean up
- (link_timeout_cb, ppp_state_changed): change state instead of calling
deactivation directly as deactivation doesn't change state anymore
* src/NetworkManagerPolicy.c
- (schedule_activate_check): yay, remove wireless_enabled hack since
the NMManager and wireless devices work that out themselves now
- (device_state_changed): change to a switch and update for new device
states
- (device_carrier_changed): remove; device handles this now through
state changes
- (device_added): don't care about carrier any more; the initial
activation check will happen when the device transitions to
DISCONNECTED
* src/nm-manager.c
- (dispose): clear unmanaged devices
- (handle_unmanaged_devices): update unmanaged device list and toggle
the managed property on each device when needed
- (system_settings_properties_changed_cb): handle signals from the
system settings service
- (system_settings_get_unmanaged_devices_cb): handle callback from
getting the unmanaged device list method call
- (query_unmanaged_devices): ask the system settings service for its
list of unmanaged devices
- (nm_manager_name_owner_changed, initial_get_connections): get unmanaged
devices
- (manager_set_wireless_enabled): push rfkill state down to wireless
devices directly and let them handle the necessary state transitions
- (manager_device_state_changed): update for new device states
- (nm_manager_add_device): set initial rfkill state on wireless devices
- (nm_manager_remove_device): don't touch the device if it's unmanaged
- (nm_manager_activate_connection): return error if the device is
unmanaged
- (nm_manager_sleep): handle new device states correctly; don't change
the state of unavailable/unmanaged devices
* libnm-glib/nm-device-802-11-wireless.c
- (state_changed_cb): update for new device states
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3540 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-08 02:58:02 +00:00
|
|
|
#include "nm-device-private.h"
|
2009-02-16 18:47:03 -05:00
|
|
|
#include "nm-device-ethernet.h"
|
2008-06-10 16:32:39 +00:00
|
|
|
#include "nm-device-wifi.h"
|
2009-08-05 16:34:02 -04:00
|
|
|
#include "nm-device-olpc-mesh.h"
|
2009-10-04 23:35:20 -07:00
|
|
|
#include "nm-device-cdma.h"
|
2009-10-05 00:42:53 -07:00
|
|
|
#include "nm-device-gsm.h"
|
2010-03-02 15:06:14 -08:00
|
|
|
#include "nm-system.h"
|
2007-10-15 14:46:37 +00:00
|
|
|
#include "nm-properties-changed-signal.h"
|
2009-05-14 13:59:03 -04:00
|
|
|
#include "nm-setting-bluetooth.h"
|
2007-11-07 16:06:43 +00:00
|
|
|
#include "nm-setting-connection.h"
|
|
|
|
|
#include "nm-setting-wireless.h"
|
2008-03-26 13:43:01 +00:00
|
|
|
#include "nm-setting-vpn.h"
|
2007-10-01 15:38:39 +00:00
|
|
|
#include "nm-marshal.h"
|
2008-03-29 21:35:41 +00:00
|
|
|
#include "nm-dbus-glib-types.h"
|
2009-06-05 01:55:02 -04:00
|
|
|
#include "nm-udev-manager.h"
|
2009-03-16 14:31:28 +02:00
|
|
|
#include "nm-hostname-provider.h"
|
2009-05-13 21:32:56 -04:00
|
|
|
#include "nm-bluez-manager.h"
|
|
|
|
|
#include "nm-bluez-common.h"
|
2010-10-27 20:05:23 -05:00
|
|
|
#include "nm-settings.h"
|
2010-08-03 13:23:30 -04:00
|
|
|
#include "nm-sysconfig-connection.h"
|
2010-05-28 18:23:00 -07:00
|
|
|
#include "nm-manager-auth.h"
|
2010-12-13 13:11:51 -06:00
|
|
|
#include "nm-agent-manager.h"
|
2007-02-08 15:34:26 +00:00
|
|
|
|
2008-07-09 14:05:49 +00:00
|
|
|
#define NM_AUTOIP_DBUS_SERVICE "org.freedesktop.nm_avahi_autoipd"
|
|
|
|
|
#define NM_AUTOIP_DBUS_IFACE "org.freedesktop.nm_avahi_autoipd"
|
|
|
|
|
|
2010-08-31 15:45:55 -05:00
|
|
|
#define UPOWER_DBUS_SERVICE "org.freedesktop.UPower"
|
|
|
|
|
|
2007-02-12 09:23:43 +00:00
|
|
|
static gboolean impl_manager_get_devices (NMManager *manager, GPtrArray **devices, GError **err);
|
2008-03-19 20:58:21 +00:00
|
|
|
static void impl_manager_activate_connection (NMManager *manager,
|
2010-06-03 23:20:11 -07:00
|
|
|
const char *connection_path,
|
|
|
|
|
const char *device_path,
|
|
|
|
|
const char *specific_object_path,
|
|
|
|
|
DBusGMethodInvocation *context);
|
2007-10-01 15:38:39 +00:00
|
|
|
|
2010-06-04 00:42:10 -07:00
|
|
|
static void impl_manager_deactivate_connection (NMManager *manager,
|
|
|
|
|
const char *connection_path,
|
|
|
|
|
DBusGMethodInvocation *context);
|
2007-10-03 14:48:25 +00:00
|
|
|
|
2010-05-29 23:11:45 -07:00
|
|
|
static void impl_manager_sleep (NMManager *manager,
|
|
|
|
|
gboolean do_sleep,
|
|
|
|
|
DBusGMethodInvocation *context);
|
2007-02-12 09:23:43 +00:00
|
|
|
|
2010-05-29 23:00:46 -07:00
|
|
|
static void impl_manager_enable (NMManager *manager,
|
|
|
|
|
gboolean enable,
|
|
|
|
|
DBusGMethodInvocation *context);
|
2010-05-22 08:55:30 -07:00
|
|
|
|
2010-05-28 18:23:00 -07:00
|
|
|
static void impl_manager_get_permissions (NMManager *manager,
|
|
|
|
|
DBusGMethodInvocation *context);
|
|
|
|
|
|
2010-04-08 08:56:17 -07:00
|
|
|
static gboolean impl_manager_set_logging (NMManager *manager,
|
|
|
|
|
const char *level,
|
|
|
|
|
const char *domains,
|
|
|
|
|
GError **error);
|
|
|
|
|
|
2007-08-15 07:52:25 +00:00
|
|
|
/* Legacy 0.6 compatibility interface */
|
|
|
|
|
|
2010-05-29 23:11:45 -07:00
|
|
|
static void impl_manager_legacy_sleep (NMManager *manager, DBusGMethodInvocation *context);
|
|
|
|
|
static void impl_manager_legacy_wake (NMManager *manager, DBusGMethodInvocation *context);
|
2007-09-24 21:26:56 +00:00
|
|
|
static gboolean impl_manager_legacy_state (NMManager *manager, guint32 *state, GError **err);
|
2007-08-15 07:52:25 +00:00
|
|
|
|
2007-02-12 09:23:43 +00:00
|
|
|
#include "nm-manager-glue.h"
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
static void udev_device_added_cb (NMUdevManager *udev_mgr,
|
|
|
|
|
GUdevDevice *device,
|
|
|
|
|
NMDeviceCreatorFn creator_fn,
|
|
|
|
|
gpointer user_data);
|
2008-04-29 Dan Williams <dcbw@redhat.com>
Handle HAL dropouts better; allow NM to start up even if HAL isn't up yet.
* marshallers/nm-marshal.list
- Add marshaller
* src/NetworkManager.c
- (main): let the NMManager handle the NMHalManager
* src/nm-hal-manager.c
src/nm-hal-manager.h
- convert to a GObject, and emit singals when stuff changes. Let the
NMManager handle the signals, instead of the NMHalManager calling
into the NMManager.
* src/nm-manager.c
src/nm-manager.h
- (remove_one_device): consolidate device removals here
- (dispose): use remove_one_device()
- (nm_manager_get_device_by_udi): make static
- (deferred_hal_manager_query_devices): idle handler to query the HAL
manager for devices at startup or wakeup time
- (nm_manager_new): create and monitor the HAL manager
- (hal_manager_udi_added_cb): new function; do what
nm_manager_add_device() used to do when signalled by the hal manager
- (hal_manager_udi_removed_cb): new function; do what
nm_manager_remove_device() used to do when signalled by the hal
manager
- (hal_manager_rfkill_changed_cb): handle rfkill changes from the
hal manager
- (hal_manager_hal_reappeared_cb): when HAL comes back, remove devices
in our device list that aren't known to HAL
- (impl_manager_sleep): on wakeup, re-add devices from an idle handler;
see comments on nm-hal-manager.c::nm_manager_state_changed() a few
commits ago
- (nm_manager_get_device_by_path, nm_manager_is_udi_managed,
nm_manager_activation_pending, nm_manager_wireless_enabled,
nm_manager_wireless_hardware_enabled,
nm_manager_set_wireless_hardware_enabled): remove, unused
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3619 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-29 23:03:00 +00:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
static void udev_device_removed_cb (NMUdevManager *udev_mgr,
|
|
|
|
|
GUdevDevice *device,
|
|
|
|
|
gpointer user_data);
|
2008-04-29 Dan Williams <dcbw@redhat.com>
Handle HAL dropouts better; allow NM to start up even if HAL isn't up yet.
* marshallers/nm-marshal.list
- Add marshaller
* src/NetworkManager.c
- (main): let the NMManager handle the NMHalManager
* src/nm-hal-manager.c
src/nm-hal-manager.h
- convert to a GObject, and emit singals when stuff changes. Let the
NMManager handle the signals, instead of the NMHalManager calling
into the NMManager.
* src/nm-manager.c
src/nm-manager.h
- (remove_one_device): consolidate device removals here
- (dispose): use remove_one_device()
- (nm_manager_get_device_by_udi): make static
- (deferred_hal_manager_query_devices): idle handler to query the HAL
manager for devices at startup or wakeup time
- (nm_manager_new): create and monitor the HAL manager
- (hal_manager_udi_added_cb): new function; do what
nm_manager_add_device() used to do when signalled by the hal manager
- (hal_manager_udi_removed_cb): new function; do what
nm_manager_remove_device() used to do when signalled by the hal
manager
- (hal_manager_rfkill_changed_cb): handle rfkill changes from the
hal manager
- (hal_manager_hal_reappeared_cb): when HAL comes back, remove devices
in our device list that aren't known to HAL
- (impl_manager_sleep): on wakeup, re-add devices from an idle handler;
see comments on nm-hal-manager.c::nm_manager_state_changed() a few
commits ago
- (nm_manager_get_device_by_path, nm_manager_is_udi_managed,
nm_manager_activation_pending, nm_manager_wireless_enabled,
nm_manager_wireless_hardware_enabled,
nm_manager_set_wireless_hardware_enabled): remove, unused
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3619 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-29 23:03:00 +00:00
|
|
|
|
2009-05-13 21:32:56 -04:00
|
|
|
static void bluez_manager_bdaddr_added_cb (NMBluezManager *bluez_mgr,
|
|
|
|
|
const char *bdaddr,
|
2009-05-14 13:59:03 -04:00
|
|
|
const char *name,
|
|
|
|
|
const char *object_path,
|
|
|
|
|
guint32 uuids,
|
|
|
|
|
NMManager *manager);
|
2009-05-13 21:32:56 -04:00
|
|
|
|
|
|
|
|
static void bluez_manager_bdaddr_removed_cb (NMBluezManager *bluez_mgr,
|
|
|
|
|
const char *bdaddr,
|
2009-05-14 13:59:03 -04:00
|
|
|
const char *object_path,
|
2009-05-13 21:32:56 -04:00
|
|
|
gpointer user_data);
|
|
|
|
|
|
2009-05-20 12:02:18 -04:00
|
|
|
static void bluez_manager_resync_devices (NMManager *self);
|
|
|
|
|
|
2009-02-16 18:47:03 -05:00
|
|
|
static void add_device (NMManager *self, NMDevice *device);
|
2009-01-19 11:01:00 +02:00
|
|
|
|
2009-03-16 14:31:28 +02:00
|
|
|
static void hostname_provider_init (NMHostnameProvider *provider_class);
|
|
|
|
|
|
2009-08-05 18:03:09 -04:00
|
|
|
static const char *internal_activate_device (NMManager *manager,
|
|
|
|
|
NMDevice *device,
|
|
|
|
|
NMConnection *connection,
|
|
|
|
|
const char *specific_object,
|
|
|
|
|
gboolean user_requested,
|
|
|
|
|
gboolean assumed,
|
|
|
|
|
GError **error);
|
|
|
|
|
|
2009-10-04 23:59:20 -07:00
|
|
|
static NMDevice *find_device_by_iface (NMManager *self, const gchar *iface);
|
2009-09-04 16:55:48 +02:00
|
|
|
|
2009-10-04 23:59:20 -07:00
|
|
|
static GSList * remove_one_device (NMManager *manager,
|
|
|
|
|
GSList *list,
|
|
|
|
|
NMDevice *device,
|
2010-08-11 17:26:33 -05:00
|
|
|
gboolean quitting);
|
2009-09-04 16:55:48 +02:00
|
|
|
|
2009-10-04 23:35:20 -07:00
|
|
|
static NMDevice *nm_manager_get_device_by_udi (NMManager *manager, const char *udi);
|
|
|
|
|
|
2010-08-17 09:35:41 -05:00
|
|
|
/* Fix for polkit 0.97 and later */
|
|
|
|
|
#if !HAVE_POLKIT_AUTHORITY_GET_SYNC
|
|
|
|
|
static inline PolkitAuthority *
|
|
|
|
|
polkit_authority_get_sync (GCancellable *cancellable, GError **error)
|
|
|
|
|
{
|
|
|
|
|
PolkitAuthority *authority;
|
|
|
|
|
|
|
|
|
|
authority = polkit_authority_get ();
|
|
|
|
|
if (!authority)
|
|
|
|
|
g_set_error (error, 0, 0, "failed to get the PolicyKit authority");
|
|
|
|
|
return authority;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
2008-12-31 18:57:36 -05:00
|
|
|
#define SSD_POKE_INTERVAL 120
|
2009-02-16 18:47:03 -05:00
|
|
|
#define ORIGDEV_TAG "originating-device"
|
2007-10-01 15:38:39 +00:00
|
|
|
|
2010-06-03 23:20:11 -07:00
|
|
|
typedef struct PendingActivation PendingActivation;
|
|
|
|
|
typedef void (*PendingActivationFunc) (PendingActivation *pending,
|
|
|
|
|
GError *error);
|
|
|
|
|
|
|
|
|
|
struct PendingActivation {
|
2010-06-01 00:36:46 -07:00
|
|
|
NMManager *manager;
|
|
|
|
|
|
2010-06-03 23:20:11 -07:00
|
|
|
DBusGMethodInvocation *context;
|
|
|
|
|
PolkitAuthority *authority;
|
|
|
|
|
PendingActivationFunc callback;
|
|
|
|
|
NMAuthChain *chain;
|
|
|
|
|
|
|
|
|
|
gboolean authorized;
|
2010-06-01 00:36:46 -07:00
|
|
|
|
2007-10-01 15:38:39 +00:00
|
|
|
char *connection_path;
|
|
|
|
|
char *specific_object_path;
|
2008-03-26 13:43:01 +00:00
|
|
|
char *device_path;
|
2010-06-03 23:20:11 -07:00
|
|
|
};
|
2007-10-01 15:38:39 +00:00
|
|
|
|
2009-12-23 00:03:45 -08:00
|
|
|
typedef struct {
|
2010-09-01 17:08:10 -05:00
|
|
|
gboolean user_enabled;
|
|
|
|
|
gboolean sw_enabled;
|
2009-12-23 00:03:45 -08:00
|
|
|
gboolean hw_enabled;
|
2010-03-25 11:36:19 -07:00
|
|
|
RfKillType rtype;
|
2009-12-23 00:03:45 -08:00
|
|
|
const char *desc;
|
|
|
|
|
const char *key;
|
|
|
|
|
const char *prop;
|
|
|
|
|
const char *hw_prop;
|
|
|
|
|
RfKillState (*other_enabled_func) (NMManager *);
|
|
|
|
|
} RadioState;
|
|
|
|
|
|
2007-02-08 15:34:26 +00:00
|
|
|
typedef struct {
|
2009-07-09 11:06:31 -04:00
|
|
|
char *config_file;
|
2009-11-02 17:29:53 -08:00
|
|
|
char *state_file;
|
2009-07-09 11:06:31 -04:00
|
|
|
|
2007-02-08 15:34:26 +00:00
|
|
|
GSList *devices;
|
2007-09-25 16:47:53 +00:00
|
|
|
NMState state;
|
2007-09-09 22:18:42 +00:00
|
|
|
|
2008-01-02 13:42:52 +00:00
|
|
|
NMDBusManager *dbus_mgr;
|
2009-06-05 01:55:02 -04:00
|
|
|
NMUdevManager *udev_mgr;
|
2009-05-13 21:32:56 -04:00
|
|
|
NMBluezManager *bluez_mgr;
|
2008-01-02 13:42:52 +00:00
|
|
|
|
2010-10-27 20:05:23 -05:00
|
|
|
NMSettings *settings;
|
2008-09-18 Dan Williams <dcbw@redhat.com>
Implement support for honoring configured and automatic hostnames, and for
setting the configured hostname.
* introspection/nm-ip4-config.xml
src/nm-ip4-config.c
src/nm-ip4-config.h
src/dhcp-manager/nm-dhcp-manager.c
- Remove useless hostname property; it's not really part of the IPv4
config
* introspection/nm-settings-system.xml
libnm-glib/nm-dbus-settings-system.c
libnm-glib/nm-dbus-settings-system.h
- Add SetHostname() call to system settings D-Bus interface
- Add Hostname property to system settings D-Bus interface
- (nm_dbus_settings_system_save_hostname,
nm_dbus_settings_system_get_hostname): implement
* src/nm-device.c
src/nm-device.h
- (nm_device_get_dhcp4_config): implement
* src/nm-manager.c
src/nm-manager.h
- Fetch and track system settings service hostname changes, and proxy
the changes via a GObject property of the manager
* system-settings/src/nm-system-config-interface.c
system-settings/src/nm-system-config-interface.h
- Replace nm_system_config_interface_supports_add() with a capabilities
bitfield
* system-settings/src/nm-system-config-error.c
system-settings/src/nm-system-config-error.h
- Add additional errors
* system-settings/src/dbus-settings.c
system-settings/src/dbus-settings.h
- (get_property, nm_sysconfig_settings_class_init): add hostname
property; first plugin returning a hostname wins
- (impl_settings_add_connection): use plugin capabilities instead of
nm_system_config_interface_supports_add()
- (impl_settings_save_hostname): implement hostname saving
* src/NetworkManagerPolicy.c
- (lookup_thread_run_cb, lookup_thread_worker, lookup_thread_new,
lookup_thread_die): implement an asynchronous hostname lookup thread
which given an IPv4 address tries to look up the hostname for that
address with reverse DNS
- (get_best_device): split out best device code from
update_routing_and_dns()
- (update_etc_hosts): update /etc/hosts with the machine's new hostname
to preserve the 127.0.0.1 reverse mapping that so many things require
- (set_system_hostname): set a given hostname
- (update_system_hostname): implement hostname policy; a configured
hostname (from the system settings service) is used if available,
otherwise an automatically determined hostname from DHCP, VPN, etc.
If there was no automatically determined hostname, reverse DNS of
the best device's IP address will be used, and as a last resort the
hostname 'localhost.localdomain' is set.
- (update_routing_and_dns): use get_best_device(); update the system
hostname when the network config changes
- (hostname_changed): update system hostname if the system settings
service signals a hostname change
- (nm_policy_new): list for system settings service hostname changes
- (nm_policy_destroy): ensure that an in-progress hostname lookup thread
gets told to die
* system-settings/plugins/keyfile/plugin.c
system-settings/plugins/ifcfg-suse/plugin.c
- (get_property, sc_plugin_ifcfg_class_init): implement hostname and
capabilities properties
* system-settings/plugins/ifcfg-fedora/shvar.c
- (svOpenFile): re-enable R/W access of ifcfg files since the plugin
writes out /etc/sysconfig/network now
* system-settings/plugins/ifcfg-fedora/plugin.c
- (plugin_get_hostname): get hostname from /etc/sysconfig/network
- (plugin_set_hostname): save hostname to /etc/sysconfig/network
- (sc_network_changed_cb): handle changes to /etc/sysconfig/network
- (sc_plugin_ifcfg_init): monitor /etc/sysconfig/network for changes
- (get_property, set_property, sc_plugin_ifcfg_class_init): implement
hostname get/set and capabilities get
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4077 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-09-18 15:16:44 +00:00
|
|
|
char *hostname;
|
2010-12-13 13:11:51 -06:00
|
|
|
NMAgentManager *agent_mgr;
|
2009-06-11 00:39:12 -04:00
|
|
|
|
2009-12-23 00:03:45 -08:00
|
|
|
RadioState radio_states[RFKILL_TYPE_MAX];
|
2007-02-08 15:34:26 +00:00
|
|
|
gboolean sleeping;
|
2010-05-22 08:55:30 -07:00
|
|
|
gboolean net_enabled;
|
2008-02-06 16:50:43 +00:00
|
|
|
|
2008-03-26 13:43:01 +00:00
|
|
|
NMVPNManager *vpn_manager;
|
|
|
|
|
guint vpn_manager_id;
|
|
|
|
|
|
2009-01-19 11:01:00 +02:00
|
|
|
NMModemManager *modem_manager;
|
|
|
|
|
guint modem_added_id;
|
|
|
|
|
guint modem_removed_id;
|
|
|
|
|
|
2008-07-09 14:05:49 +00:00
|
|
|
DBusGProxy *aipd_proxy;
|
2010-08-31 15:45:55 -05:00
|
|
|
DBusGProxy *upower_proxy;
|
2008-07-09 14:05:49 +00:00
|
|
|
|
2010-05-28 18:23:00 -07:00
|
|
|
PolkitAuthority *authority;
|
|
|
|
|
guint auth_changed_id;
|
|
|
|
|
GSList *auth_chains;
|
|
|
|
|
|
2010-07-01 10:32:11 -07:00
|
|
|
/* Firmware dir monitor */
|
|
|
|
|
GFileMonitor *fw_monitor;
|
|
|
|
|
guint fw_monitor_id;
|
|
|
|
|
guint fw_changed_id;
|
|
|
|
|
|
2010-10-19 11:10:17 +02:00
|
|
|
guint timestamp_update_id;
|
|
|
|
|
|
2008-03-26 13:43:01 +00:00
|
|
|
gboolean disposed;
|
2007-02-08 15:34:26 +00:00
|
|
|
} NMManagerPrivate;
|
|
|
|
|
|
|
|
|
|
#define NM_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_MANAGER, NMManagerPrivate))
|
|
|
|
|
|
2009-03-16 14:31:28 +02:00
|
|
|
G_DEFINE_TYPE_EXTENDED (NMManager, nm_manager, G_TYPE_OBJECT, 0,
|
|
|
|
|
G_IMPLEMENT_INTERFACE (NM_TYPE_HOSTNAME_PROVIDER,
|
|
|
|
|
hostname_provider_init))
|
2007-02-08 15:34:26 +00:00
|
|
|
|
|
|
|
|
enum {
|
|
|
|
|
DEVICE_ADDED,
|
|
|
|
|
DEVICE_REMOVED,
|
2008-03-07 23:17:48 +00:00
|
|
|
STATE_CHANGED,
|
|
|
|
|
STATE_CHANGE, /* DEPRECATED */
|
2007-10-15 14:46:37 +00:00
|
|
|
PROPERTIES_CHANGED,
|
2010-05-28 18:23:00 -07:00
|
|
|
CHECK_PERMISSIONS,
|
2010-06-04 13:05:27 -07:00
|
|
|
USER_PERMISSIONS_CHANGED,
|
2007-02-08 15:34:26 +00:00
|
|
|
|
|
|
|
|
LAST_SIGNAL
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static guint signals[LAST_SIGNAL] = { 0 };
|
|
|
|
|
|
|
|
|
|
enum {
|
|
|
|
|
PROP_0,
|
2010-09-27 10:34:56 +02:00
|
|
|
PROP_VERSION,
|
2007-02-08 15:34:26 +00:00
|
|
|
PROP_STATE,
|
2010-05-22 08:55:30 -07:00
|
|
|
PROP_NETWORKING_ENABLED,
|
2007-02-08 15:34:26 +00:00
|
|
|
PROP_WIRELESS_ENABLED,
|
2007-10-15 14:46:37 +00:00
|
|
|
PROP_WIRELESS_HARDWARE_ENABLED,
|
2009-12-23 00:18:18 -08:00
|
|
|
PROP_WWAN_ENABLED,
|
|
|
|
|
PROP_WWAN_HARDWARE_ENABLED,
|
2008-03-20 19:56:12 +00:00
|
|
|
PROP_ACTIVE_CONNECTIONS,
|
2007-02-08 15:34:26 +00:00
|
|
|
|
2008-09-18 Dan Williams <dcbw@redhat.com>
Implement support for honoring configured and automatic hostnames, and for
setting the configured hostname.
* introspection/nm-ip4-config.xml
src/nm-ip4-config.c
src/nm-ip4-config.h
src/dhcp-manager/nm-dhcp-manager.c
- Remove useless hostname property; it's not really part of the IPv4
config
* introspection/nm-settings-system.xml
libnm-glib/nm-dbus-settings-system.c
libnm-glib/nm-dbus-settings-system.h
- Add SetHostname() call to system settings D-Bus interface
- Add Hostname property to system settings D-Bus interface
- (nm_dbus_settings_system_save_hostname,
nm_dbus_settings_system_get_hostname): implement
* src/nm-device.c
src/nm-device.h
- (nm_device_get_dhcp4_config): implement
* src/nm-manager.c
src/nm-manager.h
- Fetch and track system settings service hostname changes, and proxy
the changes via a GObject property of the manager
* system-settings/src/nm-system-config-interface.c
system-settings/src/nm-system-config-interface.h
- Replace nm_system_config_interface_supports_add() with a capabilities
bitfield
* system-settings/src/nm-system-config-error.c
system-settings/src/nm-system-config-error.h
- Add additional errors
* system-settings/src/dbus-settings.c
system-settings/src/dbus-settings.h
- (get_property, nm_sysconfig_settings_class_init): add hostname
property; first plugin returning a hostname wins
- (impl_settings_add_connection): use plugin capabilities instead of
nm_system_config_interface_supports_add()
- (impl_settings_save_hostname): implement hostname saving
* src/NetworkManagerPolicy.c
- (lookup_thread_run_cb, lookup_thread_worker, lookup_thread_new,
lookup_thread_die): implement an asynchronous hostname lookup thread
which given an IPv4 address tries to look up the hostname for that
address with reverse DNS
- (get_best_device): split out best device code from
update_routing_and_dns()
- (update_etc_hosts): update /etc/hosts with the machine's new hostname
to preserve the 127.0.0.1 reverse mapping that so many things require
- (set_system_hostname): set a given hostname
- (update_system_hostname): implement hostname policy; a configured
hostname (from the system settings service) is used if available,
otherwise an automatically determined hostname from DHCP, VPN, etc.
If there was no automatically determined hostname, reverse DNS of
the best device's IP address will be used, and as a last resort the
hostname 'localhost.localdomain' is set.
- (update_routing_and_dns): use get_best_device(); update the system
hostname when the network config changes
- (hostname_changed): update system hostname if the system settings
service signals a hostname change
- (nm_policy_new): list for system settings service hostname changes
- (nm_policy_destroy): ensure that an in-progress hostname lookup thread
gets told to die
* system-settings/plugins/keyfile/plugin.c
system-settings/plugins/ifcfg-suse/plugin.c
- (get_property, sc_plugin_ifcfg_class_init): implement hostname and
capabilities properties
* system-settings/plugins/ifcfg-fedora/shvar.c
- (svOpenFile): re-enable R/W access of ifcfg files since the plugin
writes out /etc/sysconfig/network now
* system-settings/plugins/ifcfg-fedora/plugin.c
- (plugin_get_hostname): get hostname from /etc/sysconfig/network
- (plugin_set_hostname): save hostname to /etc/sysconfig/network
- (sc_network_changed_cb): handle changes to /etc/sysconfig/network
- (sc_plugin_ifcfg_init): monitor /etc/sysconfig/network for changes
- (get_property, set_property, sc_plugin_ifcfg_class_init): implement
hostname get/set and capabilities get
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4077 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-09-18 15:16:44 +00:00
|
|
|
/* Not exported */
|
|
|
|
|
PROP_HOSTNAME,
|
2009-10-20 15:25:04 -07:00
|
|
|
PROP_SLEEPING,
|
2008-09-18 Dan Williams <dcbw@redhat.com>
Implement support for honoring configured and automatic hostnames, and for
setting the configured hostname.
* introspection/nm-ip4-config.xml
src/nm-ip4-config.c
src/nm-ip4-config.h
src/dhcp-manager/nm-dhcp-manager.c
- Remove useless hostname property; it's not really part of the IPv4
config
* introspection/nm-settings-system.xml
libnm-glib/nm-dbus-settings-system.c
libnm-glib/nm-dbus-settings-system.h
- Add SetHostname() call to system settings D-Bus interface
- Add Hostname property to system settings D-Bus interface
- (nm_dbus_settings_system_save_hostname,
nm_dbus_settings_system_get_hostname): implement
* src/nm-device.c
src/nm-device.h
- (nm_device_get_dhcp4_config): implement
* src/nm-manager.c
src/nm-manager.h
- Fetch and track system settings service hostname changes, and proxy
the changes via a GObject property of the manager
* system-settings/src/nm-system-config-interface.c
system-settings/src/nm-system-config-interface.h
- Replace nm_system_config_interface_supports_add() with a capabilities
bitfield
* system-settings/src/nm-system-config-error.c
system-settings/src/nm-system-config-error.h
- Add additional errors
* system-settings/src/dbus-settings.c
system-settings/src/dbus-settings.h
- (get_property, nm_sysconfig_settings_class_init): add hostname
property; first plugin returning a hostname wins
- (impl_settings_add_connection): use plugin capabilities instead of
nm_system_config_interface_supports_add()
- (impl_settings_save_hostname): implement hostname saving
* src/NetworkManagerPolicy.c
- (lookup_thread_run_cb, lookup_thread_worker, lookup_thread_new,
lookup_thread_die): implement an asynchronous hostname lookup thread
which given an IPv4 address tries to look up the hostname for that
address with reverse DNS
- (get_best_device): split out best device code from
update_routing_and_dns()
- (update_etc_hosts): update /etc/hosts with the machine's new hostname
to preserve the 127.0.0.1 reverse mapping that so many things require
- (set_system_hostname): set a given hostname
- (update_system_hostname): implement hostname policy; a configured
hostname (from the system settings service) is used if available,
otherwise an automatically determined hostname from DHCP, VPN, etc.
If there was no automatically determined hostname, reverse DNS of
the best device's IP address will be used, and as a last resort the
hostname 'localhost.localdomain' is set.
- (update_routing_and_dns): use get_best_device(); update the system
hostname when the network config changes
- (hostname_changed): update system hostname if the system settings
service signals a hostname change
- (nm_policy_new): list for system settings service hostname changes
- (nm_policy_destroy): ensure that an in-progress hostname lookup thread
gets told to die
* system-settings/plugins/keyfile/plugin.c
system-settings/plugins/ifcfg-suse/plugin.c
- (get_property, sc_plugin_ifcfg_class_init): implement hostname and
capabilities properties
* system-settings/plugins/ifcfg-fedora/shvar.c
- (svOpenFile): re-enable R/W access of ifcfg files since the plugin
writes out /etc/sysconfig/network now
* system-settings/plugins/ifcfg-fedora/plugin.c
- (plugin_get_hostname): get hostname from /etc/sysconfig/network
- (plugin_set_hostname): save hostname to /etc/sysconfig/network
- (sc_network_changed_cb): handle changes to /etc/sysconfig/network
- (sc_plugin_ifcfg_init): monitor /etc/sysconfig/network for changes
- (get_property, set_property, sc_plugin_ifcfg_class_init): implement
hostname get/set and capabilities get
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4077 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-09-18 15:16:44 +00:00
|
|
|
|
2007-02-08 15:34:26 +00:00
|
|
|
LAST_PROP
|
|
|
|
|
};
|
|
|
|
|
|
2007-12-27 08:06:27 +00:00
|
|
|
typedef enum
|
|
|
|
|
{
|
|
|
|
|
NM_MANAGER_ERROR_UNKNOWN_CONNECTION = 0,
|
|
|
|
|
NM_MANAGER_ERROR_UNKNOWN_DEVICE,
|
2008-04-07 Dan Williams <dcbw@redhat.com>
* include/NetworkManager.h
- Remove the DOWN and CANCELLED device states
- Add UNMANAGED and UNAVAILABLE device states
- Document the device states
* introspection/nm-device.xml
src/nm-device-interface.c
src/nm-device-interface.h
- Add the 'managed' property
* test/nm-tool.c
- (detail_device): print out device state
* src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerMandriva.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerSuSE.c
- (nm_system_device_get_system_config, nm_system_device_get_disabled
nm_system_device_free_system_config): remove; they were unused and
their functionality should be re-implemented in each distro's
system settings service plugin
* src/nm-gsm-device.c
src/nm-gsm-device.h
src/nm-cdma-device.c
src/nm-cdma-device.h
- (*_new): take the 'managed' argument
* src/nm-device.c
- (nm_device_set_address): remove, fold into nm_device_bring_up()
- (nm_device_init): start in unmanaged state, not disconnected
- (constructor): don't start device until the system settings service
has had a chance to figure out if the device is managed or not
- (nm_device_deactivate, nm_device_bring_up, nm_device_bring_down):
don't set device state here, let callers handle that as appropriate
- (nm_device_dispose): don't touch the device if it's not managed
- (set_property, get_property, nm_device_class_init): implement the
'managed' property
- (nm_device_state_changed): bring the device up if its now managed,
and deactivate it if it used to be active
- (nm_device_get_managed, nm_device_set_managed): do the right thing
with the managed state
* src/nm-hal-manager.c
- (wired_device_creator, wireless_device_creator, modem_device_creator):
take initial managed state and pass it along to device constructors
- (create_device_and_add_to_list): get managed state and pass to
type creators
* src/nm-device-802-11-wireless.c
- (real_can_activate): fold in most of
nm_device_802_11_wireless_can_activate()
- (can_scan): can't scan in UNAVAILABLE or UNMANAGED
- (link_timeout_cb): instead of deactivating, change device state and
let the device state handler to it
- (real_update_hw_address): clean up
- (state_changed_cb): when entering UNAVAILABLE state, schedule an idle
handler to transition to DISCONNECTED if the device isn't rfkilled
* src/nm-device-802-3-ethernet.c
- (set_carrier): move above callers and get rid of prototype
- (device_state_changed): when entering UNAVAILABLE state, schedule an
idle handler to transition to DISCONNECTED if the device has a
carrier
- (real_update_hw_address): clean up
- (link_timeout_cb, ppp_state_changed): change state instead of calling
deactivation directly as deactivation doesn't change state anymore
* src/NetworkManagerPolicy.c
- (schedule_activate_check): yay, remove wireless_enabled hack since
the NMManager and wireless devices work that out themselves now
- (device_state_changed): change to a switch and update for new device
states
- (device_carrier_changed): remove; device handles this now through
state changes
- (device_added): don't care about carrier any more; the initial
activation check will happen when the device transitions to
DISCONNECTED
* src/nm-manager.c
- (dispose): clear unmanaged devices
- (handle_unmanaged_devices): update unmanaged device list and toggle
the managed property on each device when needed
- (system_settings_properties_changed_cb): handle signals from the
system settings service
- (system_settings_get_unmanaged_devices_cb): handle callback from
getting the unmanaged device list method call
- (query_unmanaged_devices): ask the system settings service for its
list of unmanaged devices
- (nm_manager_name_owner_changed, initial_get_connections): get unmanaged
devices
- (manager_set_wireless_enabled): push rfkill state down to wireless
devices directly and let them handle the necessary state transitions
- (manager_device_state_changed): update for new device states
- (nm_manager_add_device): set initial rfkill state on wireless devices
- (nm_manager_remove_device): don't touch the device if it's unmanaged
- (nm_manager_activate_connection): return error if the device is
unmanaged
- (nm_manager_sleep): handle new device states correctly; don't change
the state of unavailable/unmanaged devices
* libnm-glib/nm-device-802-11-wireless.c
- (state_changed_cb): update for new device states
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3540 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-08 02:58:02 +00:00
|
|
|
NM_MANAGER_ERROR_UNMANAGED_DEVICE,
|
2007-12-27 08:06:27 +00:00
|
|
|
NM_MANAGER_ERROR_SYSTEM_CONNECTION,
|
|
|
|
|
NM_MANAGER_ERROR_PERMISSION_DENIED,
|
2008-03-20 19:56:12 +00:00
|
|
|
NM_MANAGER_ERROR_CONNECTION_NOT_ACTIVE,
|
2008-04-29 15:19:31 +00:00
|
|
|
NM_MANAGER_ERROR_ALREADY_ASLEEP_OR_AWAKE,
|
2010-05-22 08:55:30 -07:00
|
|
|
NM_MANAGER_ERROR_ALREADY_ENABLED_OR_DISABLED,
|
2007-12-27 08:06:27 +00:00
|
|
|
} NMManagerError;
|
|
|
|
|
|
|
|
|
|
#define NM_MANAGER_ERROR (nm_manager_error_quark ())
|
|
|
|
|
#define NM_TYPE_MANAGER_ERROR (nm_manager_error_get_type ())
|
|
|
|
|
|
|
|
|
|
static GQuark
|
|
|
|
|
nm_manager_error_quark (void)
|
|
|
|
|
{
|
|
|
|
|
static GQuark quark = 0;
|
|
|
|
|
if (!quark)
|
|
|
|
|
quark = g_quark_from_static_string ("nm-manager-error");
|
|
|
|
|
return quark;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* This should really be standard. */
|
|
|
|
|
#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
|
|
|
|
|
|
|
|
|
|
static GType
|
|
|
|
|
nm_manager_error_get_type (void)
|
|
|
|
|
{
|
|
|
|
|
static GType etype = 0;
|
|
|
|
|
|
|
|
|
|
if (etype == 0) {
|
|
|
|
|
static const GEnumValue values[] = {
|
|
|
|
|
/* Connection was not provided by any known settings service. */
|
|
|
|
|
ENUM_ENTRY (NM_MANAGER_ERROR_UNKNOWN_CONNECTION, "UnknownConnection"),
|
|
|
|
|
/* Unknown device. */
|
|
|
|
|
ENUM_ENTRY (NM_MANAGER_ERROR_UNKNOWN_DEVICE, "UnknownDevice"),
|
2008-04-07 Dan Williams <dcbw@redhat.com>
* include/NetworkManager.h
- Remove the DOWN and CANCELLED device states
- Add UNMANAGED and UNAVAILABLE device states
- Document the device states
* introspection/nm-device.xml
src/nm-device-interface.c
src/nm-device-interface.h
- Add the 'managed' property
* test/nm-tool.c
- (detail_device): print out device state
* src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerMandriva.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerSuSE.c
- (nm_system_device_get_system_config, nm_system_device_get_disabled
nm_system_device_free_system_config): remove; they were unused and
their functionality should be re-implemented in each distro's
system settings service plugin
* src/nm-gsm-device.c
src/nm-gsm-device.h
src/nm-cdma-device.c
src/nm-cdma-device.h
- (*_new): take the 'managed' argument
* src/nm-device.c
- (nm_device_set_address): remove, fold into nm_device_bring_up()
- (nm_device_init): start in unmanaged state, not disconnected
- (constructor): don't start device until the system settings service
has had a chance to figure out if the device is managed or not
- (nm_device_deactivate, nm_device_bring_up, nm_device_bring_down):
don't set device state here, let callers handle that as appropriate
- (nm_device_dispose): don't touch the device if it's not managed
- (set_property, get_property, nm_device_class_init): implement the
'managed' property
- (nm_device_state_changed): bring the device up if its now managed,
and deactivate it if it used to be active
- (nm_device_get_managed, nm_device_set_managed): do the right thing
with the managed state
* src/nm-hal-manager.c
- (wired_device_creator, wireless_device_creator, modem_device_creator):
take initial managed state and pass it along to device constructors
- (create_device_and_add_to_list): get managed state and pass to
type creators
* src/nm-device-802-11-wireless.c
- (real_can_activate): fold in most of
nm_device_802_11_wireless_can_activate()
- (can_scan): can't scan in UNAVAILABLE or UNMANAGED
- (link_timeout_cb): instead of deactivating, change device state and
let the device state handler to it
- (real_update_hw_address): clean up
- (state_changed_cb): when entering UNAVAILABLE state, schedule an idle
handler to transition to DISCONNECTED if the device isn't rfkilled
* src/nm-device-802-3-ethernet.c
- (set_carrier): move above callers and get rid of prototype
- (device_state_changed): when entering UNAVAILABLE state, schedule an
idle handler to transition to DISCONNECTED if the device has a
carrier
- (real_update_hw_address): clean up
- (link_timeout_cb, ppp_state_changed): change state instead of calling
deactivation directly as deactivation doesn't change state anymore
* src/NetworkManagerPolicy.c
- (schedule_activate_check): yay, remove wireless_enabled hack since
the NMManager and wireless devices work that out themselves now
- (device_state_changed): change to a switch and update for new device
states
- (device_carrier_changed): remove; device handles this now through
state changes
- (device_added): don't care about carrier any more; the initial
activation check will happen when the device transitions to
DISCONNECTED
* src/nm-manager.c
- (dispose): clear unmanaged devices
- (handle_unmanaged_devices): update unmanaged device list and toggle
the managed property on each device when needed
- (system_settings_properties_changed_cb): handle signals from the
system settings service
- (system_settings_get_unmanaged_devices_cb): handle callback from
getting the unmanaged device list method call
- (query_unmanaged_devices): ask the system settings service for its
list of unmanaged devices
- (nm_manager_name_owner_changed, initial_get_connections): get unmanaged
devices
- (manager_set_wireless_enabled): push rfkill state down to wireless
devices directly and let them handle the necessary state transitions
- (manager_device_state_changed): update for new device states
- (nm_manager_add_device): set initial rfkill state on wireless devices
- (nm_manager_remove_device): don't touch the device if it's unmanaged
- (nm_manager_activate_connection): return error if the device is
unmanaged
- (nm_manager_sleep): handle new device states correctly; don't change
the state of unavailable/unmanaged devices
* libnm-glib/nm-device-802-11-wireless.c
- (state_changed_cb): update for new device states
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3540 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-08 02:58:02 +00:00
|
|
|
/* Unmanaged device. */
|
|
|
|
|
ENUM_ENTRY (NM_MANAGER_ERROR_UNMANAGED_DEVICE, "UnmanagedDevice"),
|
2007-12-27 08:06:27 +00:00
|
|
|
/* Connection was superceded by a system connection. */
|
|
|
|
|
ENUM_ENTRY (NM_MANAGER_ERROR_SYSTEM_CONNECTION, "SystemConnection"),
|
|
|
|
|
/* User does not have the permission to activate this connection. */
|
|
|
|
|
ENUM_ENTRY (NM_MANAGER_ERROR_PERMISSION_DENIED, "PermissionDenied"),
|
2008-03-20 19:56:12 +00:00
|
|
|
/* The connection was not active. */
|
|
|
|
|
ENUM_ENTRY (NM_MANAGER_ERROR_CONNECTION_NOT_ACTIVE, "ConnectionNotActive"),
|
2008-04-30 15:39:11 +00:00
|
|
|
/* The manager is already in the requested sleep state */
|
2008-04-29 15:19:31 +00:00
|
|
|
ENUM_ENTRY (NM_MANAGER_ERROR_ALREADY_ASLEEP_OR_AWAKE, "AlreadyAsleepOrAwake"),
|
2010-05-22 08:55:30 -07:00
|
|
|
/* The manager is already in the requested enabled/disabled state */
|
|
|
|
|
ENUM_ENTRY (NM_MANAGER_ERROR_ALREADY_ENABLED_OR_DISABLED, "AlreadyEnabledOrDisabled"),
|
2008-04-29 15:19:31 +00:00
|
|
|
{ 0, 0, 0 },
|
2007-12-27 08:06:27 +00:00
|
|
|
};
|
|
|
|
|
etype = g_enum_register_static ("NMManagerError", values);
|
|
|
|
|
}
|
|
|
|
|
return etype;
|
|
|
|
|
}
|
|
|
|
|
|
2010-05-22 08:55:30 -07:00
|
|
|
static gboolean
|
|
|
|
|
manager_sleeping (NMManager *self)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
|
|
|
|
|
if (priv->sleeping || !priv->net_enabled)
|
|
|
|
|
return TRUE;
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2008-03-26 13:43:01 +00:00
|
|
|
static void
|
|
|
|
|
vpn_manager_connection_deactivated_cb (NMVPNManager *manager,
|
|
|
|
|
NMVPNConnection *vpn,
|
|
|
|
|
NMVPNConnectionState state,
|
|
|
|
|
NMVPNConnectionStateReason reason,
|
|
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
g_object_notify (G_OBJECT (user_data), NM_MANAGER_ACTIVE_CONNECTIONS);
|
|
|
|
|
}
|
|
|
|
|
|
2009-01-19 11:01:00 +02:00
|
|
|
static void
|
|
|
|
|
modem_added (NMModemManager *modem_manager,
|
2009-10-04 23:35:20 -07:00
|
|
|
NMModem *modem,
|
|
|
|
|
const char *driver,
|
2009-01-19 11:01:00 +02:00
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
2009-10-04 23:35:20 -07:00
|
|
|
NMManager *self = NM_MANAGER (user_data);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
NMDevice *replace_device, *device = NULL;
|
2009-09-04 16:55:48 +02:00
|
|
|
const char *ip_iface;
|
2010-01-28 11:21:53 -08:00
|
|
|
GSList *iter;
|
2009-09-04 16:55:48 +02:00
|
|
|
|
2009-10-04 23:35:20 -07:00
|
|
|
ip_iface = nm_modem_get_iface (modem);
|
2009-09-04 16:55:48 +02:00
|
|
|
|
|
|
|
|
replace_device = find_device_by_iface (NM_MANAGER (user_data), ip_iface);
|
|
|
|
|
if (replace_device) {
|
2009-09-10 17:49:11 -07:00
|
|
|
priv->devices = remove_one_device (NM_MANAGER (user_data),
|
|
|
|
|
priv->devices,
|
|
|
|
|
replace_device,
|
2010-08-11 17:26:33 -05:00
|
|
|
FALSE);
|
2009-09-04 16:55:48 +02:00
|
|
|
}
|
|
|
|
|
|
2010-01-28 11:21:53 -08:00
|
|
|
/* Give Bluetooth DUN devices first chance to claim the modem */
|
|
|
|
|
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
|
|
|
|
|
if (NM_IS_DEVICE_BT (iter->data)) {
|
|
|
|
|
if (nm_device_bt_modem_added (NM_DEVICE_BT (iter->data), modem, driver))
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* If it was a Bluetooth modem and no bluetooth device claimed it, ignore
|
|
|
|
|
* it. The rfcomm port (and thus the modem) gets created automatically
|
|
|
|
|
* by the Bluetooth code during the connection process.
|
|
|
|
|
*/
|
|
|
|
|
if (driver && !strcmp (driver, "bluetooth")) {
|
2010-04-06 16:20:11 -07:00
|
|
|
nm_log_info (LOGD_MB, "ignoring modem '%s' (no associated Bluetooth device)", ip_iface);
|
2010-01-28 11:21:53 -08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Otherwise make a new top-level NMDevice for it */
|
2009-10-04 23:35:20 -07:00
|
|
|
if (NM_IS_MODEM_GSM (modem))
|
|
|
|
|
device = nm_device_gsm_new (NM_MODEM_GSM (modem), driver);
|
2009-10-05 00:42:53 -07:00
|
|
|
else if (NM_IS_MODEM_CDMA (modem))
|
2009-10-04 23:35:20 -07:00
|
|
|
device = nm_device_cdma_new (NM_MODEM_CDMA (modem), driver);
|
|
|
|
|
else
|
2010-04-06 16:20:11 -07:00
|
|
|
nm_log_info (LOGD_MB, "unhandled modem '%s'", ip_iface);
|
2009-10-04 23:35:20 -07:00
|
|
|
|
|
|
|
|
if (device)
|
|
|
|
|
add_device (self, device);
|
2009-01-19 11:01:00 +02:00
|
|
|
}
|
|
|
|
|
|
2009-05-20 12:02:18 -04:00
|
|
|
static void
|
|
|
|
|
nm_manager_update_state (NMManager *manager)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv;
|
|
|
|
|
NMState new_state = NM_STATE_DISCONNECTED;
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (NM_IS_MANAGER (manager));
|
|
|
|
|
|
|
|
|
|
priv = NM_MANAGER_GET_PRIVATE (manager);
|
|
|
|
|
|
2010-05-22 08:55:30 -07:00
|
|
|
if (manager_sleeping (manager))
|
2009-05-20 12:02:18 -04:00
|
|
|
new_state = NM_STATE_ASLEEP;
|
2010-05-22 08:55:30 -07:00
|
|
|
else {
|
2009-05-20 12:02:18 -04:00
|
|
|
GSList *iter;
|
|
|
|
|
|
|
|
|
|
for (iter = priv->devices; iter; iter = iter->next) {
|
|
|
|
|
NMDevice *dev = NM_DEVICE (iter->data);
|
|
|
|
|
|
|
|
|
|
if (nm_device_get_state (dev) == NM_DEVICE_STATE_ACTIVATED) {
|
|
|
|
|
new_state = NM_STATE_CONNECTED;
|
|
|
|
|
break;
|
|
|
|
|
} else if (nm_device_is_activating (dev)) {
|
|
|
|
|
new_state = NM_STATE_CONNECTING;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (priv->state != new_state) {
|
|
|
|
|
priv->state = new_state;
|
|
|
|
|
g_object_notify (G_OBJECT (manager), NM_MANAGER_STATE);
|
|
|
|
|
|
|
|
|
|
g_signal_emit (manager, signals[STATE_CHANGED], 0, priv->state);
|
|
|
|
|
|
|
|
|
|
/* Emit StateChange too for backwards compatibility */
|
|
|
|
|
g_signal_emit (manager, signals[STATE_CHANGE], 0, priv->state);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-10-19 11:10:17 +02:00
|
|
|
static void
|
2010-11-16 18:23:27 -06:00
|
|
|
ignore_cb (NMSysconfigConnection *connection, GError *error, gpointer user_data)
|
2010-10-19 11:10:17 +02:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
update_active_connection_timestamp (NMManager *manager, NMDevice *device)
|
|
|
|
|
{
|
|
|
|
|
NMActRequest *req;
|
|
|
|
|
NMConnection *connection;
|
|
|
|
|
NMSettingConnection *s_con;
|
|
|
|
|
NMManagerPrivate *priv;
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (NM_IS_DEVICE (device));
|
|
|
|
|
|
|
|
|
|
priv = NM_MANAGER_GET_PRIVATE (manager);
|
|
|
|
|
req = nm_device_get_act_request (device);
|
|
|
|
|
if (!req)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
connection = nm_act_request_get_connection (req);
|
|
|
|
|
g_assert (connection);
|
|
|
|
|
|
2010-11-16 18:23:27 -06:00
|
|
|
s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
|
2010-10-19 11:10:17 +02:00
|
|
|
g_assert (s_con);
|
|
|
|
|
g_object_set (s_con, NM_SETTING_CONNECTION_TIMESTAMP, (guint64) time (NULL), NULL);
|
|
|
|
|
|
|
|
|
|
if (nm_setting_connection_get_read_only (s_con))
|
|
|
|
|
return;
|
|
|
|
|
|
2010-11-16 18:23:27 -06:00
|
|
|
nm_sysconfig_connection_commit_changes (NM_SYSCONFIG_CONNECTION (connection), ignore_cb, NULL);
|
2010-10-19 11:10:17 +02:00
|
|
|
}
|
|
|
|
|
|
2009-05-20 12:02:18 -04:00
|
|
|
static void
|
|
|
|
|
manager_device_state_changed (NMDevice *device,
|
|
|
|
|
NMDeviceState new_state,
|
|
|
|
|
NMDeviceState old_state,
|
|
|
|
|
NMDeviceStateReason reason,
|
|
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMManager *manager = NM_MANAGER (user_data);
|
|
|
|
|
|
|
|
|
|
switch (new_state) {
|
|
|
|
|
case NM_DEVICE_STATE_UNMANAGED:
|
|
|
|
|
case NM_DEVICE_STATE_UNAVAILABLE:
|
|
|
|
|
case NM_DEVICE_STATE_DISCONNECTED:
|
|
|
|
|
case NM_DEVICE_STATE_PREPARE:
|
|
|
|
|
case NM_DEVICE_STATE_FAILED:
|
|
|
|
|
g_object_notify (G_OBJECT (manager), NM_MANAGER_ACTIVE_CONNECTIONS);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nm_manager_update_state (manager);
|
2010-10-19 11:10:17 +02:00
|
|
|
|
|
|
|
|
if (new_state == NM_DEVICE_STATE_ACTIVATED)
|
|
|
|
|
update_active_connection_timestamp (manager, device);
|
2009-05-20 12:02:18 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Removes a device from a device list; returns the start of the new device list */
|
|
|
|
|
static GSList *
|
2009-08-03 17:15:03 -04:00
|
|
|
remove_one_device (NMManager *manager,
|
|
|
|
|
GSList *list,
|
|
|
|
|
NMDevice *device,
|
2010-08-11 17:26:33 -05:00
|
|
|
gboolean quitting)
|
2009-05-20 12:02:18 -04:00
|
|
|
{
|
2009-07-09 11:06:31 -04:00
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
|
|
|
|
|
|
2009-08-03 17:15:03 -04:00
|
|
|
if (nm_device_get_managed (device)) {
|
2010-08-11 17:26:33 -05:00
|
|
|
/* When quitting, we want to leave up interfaces & connections
|
|
|
|
|
* that can be taken over again (ie, "assumed") when NM restarts
|
|
|
|
|
* so that '/etc/init.d/NetworkManager restart' will not distrupt
|
|
|
|
|
* networking for interfaces that support connection assumption.
|
|
|
|
|
* All other devices get unmanaged when NM quits so that their
|
|
|
|
|
* connections get torn down and the interface is deactivated.
|
|
|
|
|
*/
|
2009-08-03 17:15:03 -04:00
|
|
|
|
2010-08-11 17:26:33 -05:00
|
|
|
if ( !nm_device_interface_can_assume_connections (NM_DEVICE_INTERFACE (device))
|
|
|
|
|
|| (nm_device_get_state (device) != NM_DEVICE_STATE_ACTIVATED)
|
|
|
|
|
|| !quitting)
|
2009-08-03 17:15:03 -04:00
|
|
|
nm_device_set_managed (device, FALSE, NM_DEVICE_STATE_REASON_REMOVED);
|
|
|
|
|
}
|
2009-05-20 12:02:18 -04:00
|
|
|
|
|
|
|
|
g_signal_handlers_disconnect_by_func (device, manager_device_state_changed, manager);
|
|
|
|
|
|
2010-10-27 20:05:23 -05:00
|
|
|
nm_settings_device_removed (priv->settings, device);
|
2009-05-20 12:02:18 -04:00
|
|
|
g_signal_emit (manager, signals[DEVICE_REMOVED], 0, device);
|
|
|
|
|
g_object_unref (device);
|
|
|
|
|
|
|
|
|
|
return g_slist_remove (list, device);
|
|
|
|
|
}
|
|
|
|
|
|
2009-01-19 11:01:00 +02:00
|
|
|
static void
|
|
|
|
|
modem_removed (NMModemManager *modem_manager,
|
2009-10-04 23:35:20 -07:00
|
|
|
NMModem *modem,
|
2009-01-19 11:01:00 +02:00
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
2009-05-20 12:02:18 -04:00
|
|
|
NMManager *self = NM_MANAGER (user_data);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
2009-10-04 23:35:20 -07:00
|
|
|
NMDevice *found;
|
2010-01-28 11:21:53 -08:00
|
|
|
GSList *iter;
|
|
|
|
|
|
|
|
|
|
/* Give Bluetooth DUN devices first chance to handle the modem removal */
|
|
|
|
|
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
|
|
|
|
|
if (NM_IS_DEVICE_BT (iter->data)) {
|
|
|
|
|
if (nm_device_bt_modem_removed (NM_DEVICE_BT (iter->data), modem))
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
2009-01-19 11:01:00 +02:00
|
|
|
|
2010-01-28 11:21:53 -08:00
|
|
|
/* Otherwise remove the standalone modem */
|
2009-10-04 23:35:20 -07:00
|
|
|
found = nm_manager_get_device_by_udi (self, nm_modem_get_path (modem));
|
|
|
|
|
if (found)
|
2010-08-11 17:26:33 -05:00
|
|
|
priv->devices = remove_one_device (self, priv->devices, found, FALSE);
|
2009-01-19 11:01:00 +02:00
|
|
|
}
|
|
|
|
|
|
2008-07-09 14:05:49 +00:00
|
|
|
static void
|
|
|
|
|
aipd_handle_event (DBusGProxy *proxy,
|
|
|
|
|
const char *event,
|
|
|
|
|
const char *iface,
|
|
|
|
|
const char *address,
|
|
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMManager *manager = NM_MANAGER (user_data);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
|
|
|
|
|
GSList *iter;
|
2009-12-23 11:10:11 -08:00
|
|
|
gboolean handled = FALSE;
|
2008-07-09 14:05:49 +00:00
|
|
|
|
|
|
|
|
if (!event || !iface) {
|
2010-04-06 16:20:11 -07:00
|
|
|
nm_log_warn (LOGD_AUTOIP4, "incomplete message received from avahi-autoipd");
|
2008-07-09 14:05:49 +00:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( (strcmp (event, "BIND") != 0)
|
|
|
|
|
&& (strcmp (event, "CONFLICT") != 0)
|
|
|
|
|
&& (strcmp (event, "UNBIND") != 0)
|
|
|
|
|
&& (strcmp (event, "STOP") != 0)) {
|
2010-04-06 16:20:11 -07:00
|
|
|
nm_log_warn (LOGD_AUTOIP4, "unknown event '%s' received from avahi-autoipd", event);
|
2008-07-09 14:05:49 +00:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
|
|
|
|
|
NMDevice *candidate = NM_DEVICE (iter->data);
|
|
|
|
|
|
|
|
|
|
if (!strcmp (nm_device_get_iface (candidate), iface)) {
|
|
|
|
|
nm_device_handle_autoip4_event (candidate, event, address);
|
|
|
|
|
handled = TRUE;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!handled)
|
2010-04-06 16:20:11 -07:00
|
|
|
nm_log_warn (LOGD_AUTOIP4, "(%s): unhandled avahi-autoipd event", iface);
|
2008-07-09 14:05:49 +00:00
|
|
|
}
|
|
|
|
|
|
2009-03-16 14:31:28 +02:00
|
|
|
static const char *
|
|
|
|
|
hostname_provider_get_hostname (NMHostnameProvider *provider)
|
|
|
|
|
{
|
|
|
|
|
return NM_MANAGER_GET_PRIVATE (provider)->hostname;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
hostname_provider_init (NMHostnameProvider *provider_class)
|
|
|
|
|
{
|
|
|
|
|
provider_class->get_hostname = hostname_provider_get_hostname;
|
|
|
|
|
}
|
|
|
|
|
|
2007-09-25 16:47:53 +00:00
|
|
|
NMState
|
|
|
|
|
nm_manager_get_state (NMManager *manager)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (NM_IS_MANAGER (manager), NM_STATE_UNKNOWN);
|
|
|
|
|
|
|
|
|
|
return NM_MANAGER_GET_PRIVATE (manager)->state;
|
|
|
|
|
}
|
|
|
|
|
|
2010-06-01 00:36:46 -07:00
|
|
|
static PendingActivation *
|
|
|
|
|
pending_activation_new (NMManager *manager,
|
2010-06-03 23:20:11 -07:00
|
|
|
PolkitAuthority *authority,
|
|
|
|
|
DBusGMethodInvocation *context,
|
2010-06-01 00:36:46 -07:00
|
|
|
const char *device_path,
|
|
|
|
|
const char *connection_path,
|
2010-06-03 23:20:11 -07:00
|
|
|
const char *specific_object_path,
|
|
|
|
|
PendingActivationFunc callback)
|
2010-06-01 00:36:46 -07:00
|
|
|
{
|
|
|
|
|
PendingActivation *pending;
|
|
|
|
|
|
2010-06-03 23:20:11 -07:00
|
|
|
g_return_val_if_fail (manager != NULL, NULL);
|
|
|
|
|
g_return_val_if_fail (authority != NULL, NULL);
|
|
|
|
|
g_return_val_if_fail (context != NULL, NULL);
|
|
|
|
|
g_return_val_if_fail (device_path != NULL, NULL);
|
|
|
|
|
g_return_val_if_fail (connection_path != NULL, NULL);
|
|
|
|
|
|
2010-06-01 00:36:46 -07:00
|
|
|
pending = g_slice_new0 (PendingActivation);
|
|
|
|
|
pending->manager = manager;
|
2010-06-03 23:20:11 -07:00
|
|
|
pending->authority = authority;
|
|
|
|
|
pending->context = context;
|
|
|
|
|
pending->callback = callback;
|
|
|
|
|
|
2010-06-01 00:36:46 -07:00
|
|
|
pending->device_path = g_strdup (device_path);
|
|
|
|
|
pending->connection_path = g_strdup (connection_path);
|
2007-10-01 15:38:39 +00:00
|
|
|
|
2010-06-03 23:20:11 -07:00
|
|
|
/* "/" is special-cased to NULL to get through D-Bus */
|
|
|
|
|
if (specific_object_path && strcmp (specific_object_path, "/"))
|
|
|
|
|
pending->specific_object_path = g_strdup (specific_object_path);
|
2010-06-01 00:36:46 -07:00
|
|
|
|
|
|
|
|
return pending;
|
|
|
|
|
}
|
|
|
|
|
|
2010-06-03 23:20:11 -07:00
|
|
|
static void
|
|
|
|
|
pending_auth_net_done (NMAuthChain *chain,
|
|
|
|
|
GError *error,
|
|
|
|
|
DBusGMethodInvocation *context,
|
|
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
PendingActivation *pending = user_data;
|
|
|
|
|
NMAuthCallResult result;
|
|
|
|
|
|
|
|
|
|
pending->chain = NULL;
|
|
|
|
|
|
|
|
|
|
if (error) {
|
|
|
|
|
pending->callback (pending, error);
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Caller has had a chance to obtain authorization, so we only need to
|
|
|
|
|
* check for 'yes' here.
|
|
|
|
|
*/
|
|
|
|
|
result = GPOINTER_TO_UINT (nm_auth_chain_get_data (chain, NM_AUTH_PERMISSION_NETWORK_CONTROL));
|
|
|
|
|
if (result != NM_AUTH_CALL_RESULT_YES) {
|
|
|
|
|
error = g_error_new_literal (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_PERMISSION_DENIED,
|
|
|
|
|
"Not authorized to control networking.");
|
|
|
|
|
pending->callback (pending, error);
|
|
|
|
|
g_error_free (error);
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
2010-07-13 18:09:56 -04:00
|
|
|
pending->callback (pending, NULL);
|
2010-06-03 23:20:11 -07:00
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
nm_auth_chain_unref (chain);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
pending_activation_check_authorized (PendingActivation *pending,
|
2010-07-13 18:09:56 -04:00
|
|
|
NMDBusManager *dbus_mgr)
|
2010-06-01 00:36:46 -07:00
|
|
|
{
|
2010-11-18 13:47:04 -06:00
|
|
|
char *error_desc = NULL;
|
2010-06-03 23:20:11 -07:00
|
|
|
gulong sender_uid = G_MAXULONG;
|
|
|
|
|
GError *error;
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (pending != NULL);
|
|
|
|
|
g_return_if_fail (dbus_mgr != NULL);
|
|
|
|
|
|
2010-07-13 18:09:56 -04:00
|
|
|
if (!nm_auth_get_caller_uid (pending->context,
|
|
|
|
|
dbus_mgr,
|
|
|
|
|
&sender_uid,
|
|
|
|
|
&error_desc)) {
|
2010-06-03 23:20:11 -07:00
|
|
|
error = g_error_new_literal (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_PERMISSION_DENIED,
|
|
|
|
|
error_desc);
|
|
|
|
|
pending->callback (pending, error);
|
|
|
|
|
g_error_free (error);
|
2010-11-18 13:47:04 -06:00
|
|
|
g_free (error_desc);
|
2010-06-03 23:20:11 -07:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2010-06-04 00:42:10 -07:00
|
|
|
/* Yay for root */
|
2010-06-03 23:20:11 -07:00
|
|
|
if (0 == sender_uid) {
|
|
|
|
|
pending->callback (pending, NULL);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* First check if the user is allowed to use networking at all, giving
|
|
|
|
|
* the user a chance to authenticate to gain the permission.
|
|
|
|
|
*/
|
|
|
|
|
pending->chain = nm_auth_chain_new (pending->authority,
|
|
|
|
|
pending->context,
|
|
|
|
|
NULL,
|
|
|
|
|
pending_auth_net_done,
|
|
|
|
|
pending);
|
2010-06-04 00:42:10 -07:00
|
|
|
g_assert (pending->chain);
|
2010-06-03 23:20:11 -07:00
|
|
|
nm_auth_chain_add_call (pending->chain,
|
|
|
|
|
NM_AUTH_PERMISSION_NETWORK_CONTROL,
|
|
|
|
|
TRUE);
|
2010-06-01 00:36:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
pending_activation_destroy (PendingActivation *pending,
|
|
|
|
|
GError *error,
|
|
|
|
|
const char *ac_path)
|
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (pending != NULL);
|
|
|
|
|
|
|
|
|
|
g_free (pending->connection_path);
|
|
|
|
|
g_free (pending->specific_object_path);
|
|
|
|
|
g_free (pending->device_path);
|
|
|
|
|
|
2010-06-03 23:20:11 -07:00
|
|
|
if (error)
|
|
|
|
|
dbus_g_method_return_error (pending->context, error);
|
|
|
|
|
else if (ac_path)
|
|
|
|
|
dbus_g_method_return (pending->context, ac_path);
|
2010-06-01 00:36:46 -07:00
|
|
|
|
2010-06-03 23:20:11 -07:00
|
|
|
if (pending->chain)
|
|
|
|
|
nm_auth_chain_unref (pending->chain);
|
2010-06-01 00:36:46 -07:00
|
|
|
|
|
|
|
|
memset (pending, 0, sizeof (PendingActivation));
|
|
|
|
|
g_slice_free (PendingActivation, pending);
|
2007-10-01 15:38:39 +00:00
|
|
|
}
|
|
|
|
|
|
2008-03-26 13:43:01 +00:00
|
|
|
static GPtrArray *
|
|
|
|
|
get_active_connections (NMManager *manager, NMConnection *filter)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
|
|
|
|
|
NMVPNManager *vpn_manager;
|
|
|
|
|
GPtrArray *active;
|
|
|
|
|
GSList *iter;
|
|
|
|
|
|
|
|
|
|
active = g_ptr_array_sized_new (3);
|
|
|
|
|
|
|
|
|
|
/* Add active device connections */
|
|
|
|
|
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
|
|
|
|
|
NMActRequest *req;
|
|
|
|
|
const char *path;
|
|
|
|
|
|
|
|
|
|
req = nm_device_get_act_request (NM_DEVICE (iter->data));
|
|
|
|
|
if (!req)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (!filter || (nm_act_request_get_connection (req) == filter)) {
|
|
|
|
|
path = nm_act_request_get_active_connection_path (req);
|
|
|
|
|
g_ptr_array_add (active, g_strdup (path));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Add active VPN connections */
|
|
|
|
|
vpn_manager = nm_vpn_manager_get ();
|
|
|
|
|
nm_vpn_manager_add_active_connections (vpn_manager, filter, active);
|
|
|
|
|
g_object_unref (vpn_manager);
|
|
|
|
|
|
|
|
|
|
return active;
|
|
|
|
|
}
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
/*******************************************************************/
|
2010-10-27 20:05:23 -05:00
|
|
|
/* Settings stuff via NMSettings */
|
2009-06-11 00:39:12 -04:00
|
|
|
/*******************************************************************/
|
|
|
|
|
|
|
|
|
|
static void
|
2010-10-27 20:05:23 -05:00
|
|
|
connections_changed (NMSettings *settings,
|
2010-10-27 15:47:10 -05:00
|
|
|
NMSysconfigConnection *connection,
|
|
|
|
|
NMManager *manager)
|
2008-04-29 Dan Williams <dcbw@redhat.com>
Handle HAL dropouts better; allow NM to start up even if HAL isn't up yet.
* marshallers/nm-marshal.list
- Add marshaller
* src/NetworkManager.c
- (main): let the NMManager handle the NMHalManager
* src/nm-hal-manager.c
src/nm-hal-manager.h
- convert to a GObject, and emit singals when stuff changes. Let the
NMManager handle the signals, instead of the NMHalManager calling
into the NMManager.
* src/nm-manager.c
src/nm-manager.h
- (remove_one_device): consolidate device removals here
- (dispose): use remove_one_device()
- (nm_manager_get_device_by_udi): make static
- (deferred_hal_manager_query_devices): idle handler to query the HAL
manager for devices at startup or wakeup time
- (nm_manager_new): create and monitor the HAL manager
- (hal_manager_udi_added_cb): new function; do what
nm_manager_add_device() used to do when signalled by the hal manager
- (hal_manager_udi_removed_cb): new function; do what
nm_manager_remove_device() used to do when signalled by the hal
manager
- (hal_manager_rfkill_changed_cb): handle rfkill changes from the
hal manager
- (hal_manager_hal_reappeared_cb): when HAL comes back, remove devices
in our device list that aren't known to HAL
- (impl_manager_sleep): on wakeup, re-add devices from an idle handler;
see comments on nm-hal-manager.c::nm_manager_state_changed() a few
commits ago
- (nm_manager_get_device_by_path, nm_manager_is_udi_managed,
nm_manager_activation_pending, nm_manager_wireless_enabled,
nm_manager_wireless_hardware_enabled,
nm_manager_set_wireless_hardware_enabled): remove, unused
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3619 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-29 23:03:00 +00:00
|
|
|
{
|
2009-06-11 00:39:12 -04:00
|
|
|
bluez_manager_resync_devices (manager);
|
2008-05-22 14:22:31 +00:00
|
|
|
}
|
|
|
|
|
|
2008-04-07 Dan Williams <dcbw@redhat.com>
* include/NetworkManager.h
- Remove the DOWN and CANCELLED device states
- Add UNMANAGED and UNAVAILABLE device states
- Document the device states
* introspection/nm-device.xml
src/nm-device-interface.c
src/nm-device-interface.h
- Add the 'managed' property
* test/nm-tool.c
- (detail_device): print out device state
* src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerMandriva.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerSuSE.c
- (nm_system_device_get_system_config, nm_system_device_get_disabled
nm_system_device_free_system_config): remove; they were unused and
their functionality should be re-implemented in each distro's
system settings service plugin
* src/nm-gsm-device.c
src/nm-gsm-device.h
src/nm-cdma-device.c
src/nm-cdma-device.h
- (*_new): take the 'managed' argument
* src/nm-device.c
- (nm_device_set_address): remove, fold into nm_device_bring_up()
- (nm_device_init): start in unmanaged state, not disconnected
- (constructor): don't start device until the system settings service
has had a chance to figure out if the device is managed or not
- (nm_device_deactivate, nm_device_bring_up, nm_device_bring_down):
don't set device state here, let callers handle that as appropriate
- (nm_device_dispose): don't touch the device if it's not managed
- (set_property, get_property, nm_device_class_init): implement the
'managed' property
- (nm_device_state_changed): bring the device up if its now managed,
and deactivate it if it used to be active
- (nm_device_get_managed, nm_device_set_managed): do the right thing
with the managed state
* src/nm-hal-manager.c
- (wired_device_creator, wireless_device_creator, modem_device_creator):
take initial managed state and pass it along to device constructors
- (create_device_and_add_to_list): get managed state and pass to
type creators
* src/nm-device-802-11-wireless.c
- (real_can_activate): fold in most of
nm_device_802_11_wireless_can_activate()
- (can_scan): can't scan in UNAVAILABLE or UNMANAGED
- (link_timeout_cb): instead of deactivating, change device state and
let the device state handler to it
- (real_update_hw_address): clean up
- (state_changed_cb): when entering UNAVAILABLE state, schedule an idle
handler to transition to DISCONNECTED if the device isn't rfkilled
* src/nm-device-802-3-ethernet.c
- (set_carrier): move above callers and get rid of prototype
- (device_state_changed): when entering UNAVAILABLE state, schedule an
idle handler to transition to DISCONNECTED if the device has a
carrier
- (real_update_hw_address): clean up
- (link_timeout_cb, ppp_state_changed): change state instead of calling
deactivation directly as deactivation doesn't change state anymore
* src/NetworkManagerPolicy.c
- (schedule_activate_check): yay, remove wireless_enabled hack since
the NMManager and wireless devices work that out themselves now
- (device_state_changed): change to a switch and update for new device
states
- (device_carrier_changed): remove; device handles this now through
state changes
- (device_added): don't care about carrier any more; the initial
activation check will happen when the device transitions to
DISCONNECTED
* src/nm-manager.c
- (dispose): clear unmanaged devices
- (handle_unmanaged_devices): update unmanaged device list and toggle
the managed property on each device when needed
- (system_settings_properties_changed_cb): handle signals from the
system settings service
- (system_settings_get_unmanaged_devices_cb): handle callback from
getting the unmanaged device list method call
- (query_unmanaged_devices): ask the system settings service for its
list of unmanaged devices
- (nm_manager_name_owner_changed, initial_get_connections): get unmanaged
devices
- (manager_set_wireless_enabled): push rfkill state down to wireless
devices directly and let them handle the necessary state transitions
- (manager_device_state_changed): update for new device states
- (nm_manager_add_device): set initial rfkill state on wireless devices
- (nm_manager_remove_device): don't touch the device if it's unmanaged
- (nm_manager_activate_connection): return error if the device is
unmanaged
- (nm_manager_sleep): handle new device states correctly; don't change
the state of unavailable/unmanaged devices
* libnm-glib/nm-device-802-11-wireless.c
- (state_changed_cb): update for new device states
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3540 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-08 02:58:02 +00:00
|
|
|
static void
|
2010-10-27 20:05:23 -05:00
|
|
|
system_unmanaged_devices_changed_cb (NMSettings *settings,
|
2009-06-11 00:39:12 -04:00
|
|
|
GParamSpec *pspec,
|
|
|
|
|
gpointer user_data)
|
2008-04-07 Dan Williams <dcbw@redhat.com>
* include/NetworkManager.h
- Remove the DOWN and CANCELLED device states
- Add UNMANAGED and UNAVAILABLE device states
- Document the device states
* introspection/nm-device.xml
src/nm-device-interface.c
src/nm-device-interface.h
- Add the 'managed' property
* test/nm-tool.c
- (detail_device): print out device state
* src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerMandriva.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerSuSE.c
- (nm_system_device_get_system_config, nm_system_device_get_disabled
nm_system_device_free_system_config): remove; they were unused and
their functionality should be re-implemented in each distro's
system settings service plugin
* src/nm-gsm-device.c
src/nm-gsm-device.h
src/nm-cdma-device.c
src/nm-cdma-device.h
- (*_new): take the 'managed' argument
* src/nm-device.c
- (nm_device_set_address): remove, fold into nm_device_bring_up()
- (nm_device_init): start in unmanaged state, not disconnected
- (constructor): don't start device until the system settings service
has had a chance to figure out if the device is managed or not
- (nm_device_deactivate, nm_device_bring_up, nm_device_bring_down):
don't set device state here, let callers handle that as appropriate
- (nm_device_dispose): don't touch the device if it's not managed
- (set_property, get_property, nm_device_class_init): implement the
'managed' property
- (nm_device_state_changed): bring the device up if its now managed,
and deactivate it if it used to be active
- (nm_device_get_managed, nm_device_set_managed): do the right thing
with the managed state
* src/nm-hal-manager.c
- (wired_device_creator, wireless_device_creator, modem_device_creator):
take initial managed state and pass it along to device constructors
- (create_device_and_add_to_list): get managed state and pass to
type creators
* src/nm-device-802-11-wireless.c
- (real_can_activate): fold in most of
nm_device_802_11_wireless_can_activate()
- (can_scan): can't scan in UNAVAILABLE or UNMANAGED
- (link_timeout_cb): instead of deactivating, change device state and
let the device state handler to it
- (real_update_hw_address): clean up
- (state_changed_cb): when entering UNAVAILABLE state, schedule an idle
handler to transition to DISCONNECTED if the device isn't rfkilled
* src/nm-device-802-3-ethernet.c
- (set_carrier): move above callers and get rid of prototype
- (device_state_changed): when entering UNAVAILABLE state, schedule an
idle handler to transition to DISCONNECTED if the device has a
carrier
- (real_update_hw_address): clean up
- (link_timeout_cb, ppp_state_changed): change state instead of calling
deactivation directly as deactivation doesn't change state anymore
* src/NetworkManagerPolicy.c
- (schedule_activate_check): yay, remove wireless_enabled hack since
the NMManager and wireless devices work that out themselves now
- (device_state_changed): change to a switch and update for new device
states
- (device_carrier_changed): remove; device handles this now through
state changes
- (device_added): don't care about carrier any more; the initial
activation check will happen when the device transitions to
DISCONNECTED
* src/nm-manager.c
- (dispose): clear unmanaged devices
- (handle_unmanaged_devices): update unmanaged device list and toggle
the managed property on each device when needed
- (system_settings_properties_changed_cb): handle signals from the
system settings service
- (system_settings_get_unmanaged_devices_cb): handle callback from
getting the unmanaged device list method call
- (query_unmanaged_devices): ask the system settings service for its
list of unmanaged devices
- (nm_manager_name_owner_changed, initial_get_connections): get unmanaged
devices
- (manager_set_wireless_enabled): push rfkill state down to wireless
devices directly and let them handle the necessary state transitions
- (manager_device_state_changed): update for new device states
- (nm_manager_add_device): set initial rfkill state on wireless devices
- (nm_manager_remove_device): don't touch the device if it's unmanaged
- (nm_manager_activate_connection): return error if the device is
unmanaged
- (nm_manager_sleep): handle new device states correctly; don't change
the state of unavailable/unmanaged devices
* libnm-glib/nm-device-802-11-wireless.c
- (state_changed_cb): update for new device states
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3540 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-08 02:58:02 +00:00
|
|
|
{
|
2010-10-27 20:05:23 -05:00
|
|
|
NMManager *self = NM_MANAGER (user_data);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
2009-06-11 00:39:12 -04:00
|
|
|
const GSList *unmanaged_specs, *iter;
|
2008-04-07 Dan Williams <dcbw@redhat.com>
* include/NetworkManager.h
- Remove the DOWN and CANCELLED device states
- Add UNMANAGED and UNAVAILABLE device states
- Document the device states
* introspection/nm-device.xml
src/nm-device-interface.c
src/nm-device-interface.h
- Add the 'managed' property
* test/nm-tool.c
- (detail_device): print out device state
* src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerMandriva.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerSuSE.c
- (nm_system_device_get_system_config, nm_system_device_get_disabled
nm_system_device_free_system_config): remove; they were unused and
their functionality should be re-implemented in each distro's
system settings service plugin
* src/nm-gsm-device.c
src/nm-gsm-device.h
src/nm-cdma-device.c
src/nm-cdma-device.h
- (*_new): take the 'managed' argument
* src/nm-device.c
- (nm_device_set_address): remove, fold into nm_device_bring_up()
- (nm_device_init): start in unmanaged state, not disconnected
- (constructor): don't start device until the system settings service
has had a chance to figure out if the device is managed or not
- (nm_device_deactivate, nm_device_bring_up, nm_device_bring_down):
don't set device state here, let callers handle that as appropriate
- (nm_device_dispose): don't touch the device if it's not managed
- (set_property, get_property, nm_device_class_init): implement the
'managed' property
- (nm_device_state_changed): bring the device up if its now managed,
and deactivate it if it used to be active
- (nm_device_get_managed, nm_device_set_managed): do the right thing
with the managed state
* src/nm-hal-manager.c
- (wired_device_creator, wireless_device_creator, modem_device_creator):
take initial managed state and pass it along to device constructors
- (create_device_and_add_to_list): get managed state and pass to
type creators
* src/nm-device-802-11-wireless.c
- (real_can_activate): fold in most of
nm_device_802_11_wireless_can_activate()
- (can_scan): can't scan in UNAVAILABLE or UNMANAGED
- (link_timeout_cb): instead of deactivating, change device state and
let the device state handler to it
- (real_update_hw_address): clean up
- (state_changed_cb): when entering UNAVAILABLE state, schedule an idle
handler to transition to DISCONNECTED if the device isn't rfkilled
* src/nm-device-802-3-ethernet.c
- (set_carrier): move above callers and get rid of prototype
- (device_state_changed): when entering UNAVAILABLE state, schedule an
idle handler to transition to DISCONNECTED if the device has a
carrier
- (real_update_hw_address): clean up
- (link_timeout_cb, ppp_state_changed): change state instead of calling
deactivation directly as deactivation doesn't change state anymore
* src/NetworkManagerPolicy.c
- (schedule_activate_check): yay, remove wireless_enabled hack since
the NMManager and wireless devices work that out themselves now
- (device_state_changed): change to a switch and update for new device
states
- (device_carrier_changed): remove; device handles this now through
state changes
- (device_added): don't care about carrier any more; the initial
activation check will happen when the device transitions to
DISCONNECTED
* src/nm-manager.c
- (dispose): clear unmanaged devices
- (handle_unmanaged_devices): update unmanaged device list and toggle
the managed property on each device when needed
- (system_settings_properties_changed_cb): handle signals from the
system settings service
- (system_settings_get_unmanaged_devices_cb): handle callback from
getting the unmanaged device list method call
- (query_unmanaged_devices): ask the system settings service for its
list of unmanaged devices
- (nm_manager_name_owner_changed, initial_get_connections): get unmanaged
devices
- (manager_set_wireless_enabled): push rfkill state down to wireless
devices directly and let them handle the necessary state transitions
- (manager_device_state_changed): update for new device states
- (nm_manager_add_device): set initial rfkill state on wireless devices
- (nm_manager_remove_device): don't touch the device if it's unmanaged
- (nm_manager_activate_connection): return error if the device is
unmanaged
- (nm_manager_sleep): handle new device states correctly; don't change
the state of unavailable/unmanaged devices
* libnm-glib/nm-device-802-11-wireless.c
- (state_changed_cb): update for new device states
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3540 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-08 02:58:02 +00:00
|
|
|
|
2010-10-27 20:05:23 -05:00
|
|
|
unmanaged_specs = nm_settings_get_unmanaged_specs (priv->settings);
|
2009-06-11 00:39:12 -04:00
|
|
|
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
|
|
|
|
|
NMDevice *device = NM_DEVICE (iter->data);
|
|
|
|
|
gboolean managed;
|
2008-06-05 13:16:02 +00:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
managed = !nm_device_interface_spec_match_list (NM_DEVICE_INTERFACE (device), unmanaged_specs);
|
|
|
|
|
nm_device_set_managed (device,
|
|
|
|
|
managed,
|
|
|
|
|
managed ? NM_DEVICE_STATE_REASON_NOW_MANAGED :
|
2010-10-27 20:05:23 -05:00
|
|
|
NM_DEVICE_STATE_REASON_NOW_UNMANAGED);
|
2009-06-11 00:39:12 -04:00
|
|
|
}
|
2008-09-18 Dan Williams <dcbw@redhat.com>
Implement support for honoring configured and automatic hostnames, and for
setting the configured hostname.
* introspection/nm-ip4-config.xml
src/nm-ip4-config.c
src/nm-ip4-config.h
src/dhcp-manager/nm-dhcp-manager.c
- Remove useless hostname property; it's not really part of the IPv4
config
* introspection/nm-settings-system.xml
libnm-glib/nm-dbus-settings-system.c
libnm-glib/nm-dbus-settings-system.h
- Add SetHostname() call to system settings D-Bus interface
- Add Hostname property to system settings D-Bus interface
- (nm_dbus_settings_system_save_hostname,
nm_dbus_settings_system_get_hostname): implement
* src/nm-device.c
src/nm-device.h
- (nm_device_get_dhcp4_config): implement
* src/nm-manager.c
src/nm-manager.h
- Fetch and track system settings service hostname changes, and proxy
the changes via a GObject property of the manager
* system-settings/src/nm-system-config-interface.c
system-settings/src/nm-system-config-interface.h
- Replace nm_system_config_interface_supports_add() with a capabilities
bitfield
* system-settings/src/nm-system-config-error.c
system-settings/src/nm-system-config-error.h
- Add additional errors
* system-settings/src/dbus-settings.c
system-settings/src/dbus-settings.h
- (get_property, nm_sysconfig_settings_class_init): add hostname
property; first plugin returning a hostname wins
- (impl_settings_add_connection): use plugin capabilities instead of
nm_system_config_interface_supports_add()
- (impl_settings_save_hostname): implement hostname saving
* src/NetworkManagerPolicy.c
- (lookup_thread_run_cb, lookup_thread_worker, lookup_thread_new,
lookup_thread_die): implement an asynchronous hostname lookup thread
which given an IPv4 address tries to look up the hostname for that
address with reverse DNS
- (get_best_device): split out best device code from
update_routing_and_dns()
- (update_etc_hosts): update /etc/hosts with the machine's new hostname
to preserve the 127.0.0.1 reverse mapping that so many things require
- (set_system_hostname): set a given hostname
- (update_system_hostname): implement hostname policy; a configured
hostname (from the system settings service) is used if available,
otherwise an automatically determined hostname from DHCP, VPN, etc.
If there was no automatically determined hostname, reverse DNS of
the best device's IP address will be used, and as a last resort the
hostname 'localhost.localdomain' is set.
- (update_routing_and_dns): use get_best_device(); update the system
hostname when the network config changes
- (hostname_changed): update system hostname if the system settings
service signals a hostname change
- (nm_policy_new): list for system settings service hostname changes
- (nm_policy_destroy): ensure that an in-progress hostname lookup thread
gets told to die
* system-settings/plugins/keyfile/plugin.c
system-settings/plugins/ifcfg-suse/plugin.c
- (get_property, sc_plugin_ifcfg_class_init): implement hostname and
capabilities properties
* system-settings/plugins/ifcfg-fedora/shvar.c
- (svOpenFile): re-enable R/W access of ifcfg files since the plugin
writes out /etc/sysconfig/network now
* system-settings/plugins/ifcfg-fedora/plugin.c
- (plugin_get_hostname): get hostname from /etc/sysconfig/network
- (plugin_set_hostname): save hostname to /etc/sysconfig/network
- (sc_network_changed_cb): handle changes to /etc/sysconfig/network
- (sc_plugin_ifcfg_init): monitor /etc/sysconfig/network for changes
- (get_property, set_property, sc_plugin_ifcfg_class_init): implement
hostname get/set and capabilities get
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4077 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-09-18 15:16:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2010-10-27 20:05:23 -05:00
|
|
|
system_hostname_changed_cb (NMSettings *settings,
|
2009-06-11 00:39:12 -04:00
|
|
|
GParamSpec *pspec,
|
|
|
|
|
gpointer user_data)
|
2008-09-18 Dan Williams <dcbw@redhat.com>
Implement support for honoring configured and automatic hostnames, and for
setting the configured hostname.
* introspection/nm-ip4-config.xml
src/nm-ip4-config.c
src/nm-ip4-config.h
src/dhcp-manager/nm-dhcp-manager.c
- Remove useless hostname property; it's not really part of the IPv4
config
* introspection/nm-settings-system.xml
libnm-glib/nm-dbus-settings-system.c
libnm-glib/nm-dbus-settings-system.h
- Add SetHostname() call to system settings D-Bus interface
- Add Hostname property to system settings D-Bus interface
- (nm_dbus_settings_system_save_hostname,
nm_dbus_settings_system_get_hostname): implement
* src/nm-device.c
src/nm-device.h
- (nm_device_get_dhcp4_config): implement
* src/nm-manager.c
src/nm-manager.h
- Fetch and track system settings service hostname changes, and proxy
the changes via a GObject property of the manager
* system-settings/src/nm-system-config-interface.c
system-settings/src/nm-system-config-interface.h
- Replace nm_system_config_interface_supports_add() with a capabilities
bitfield
* system-settings/src/nm-system-config-error.c
system-settings/src/nm-system-config-error.h
- Add additional errors
* system-settings/src/dbus-settings.c
system-settings/src/dbus-settings.h
- (get_property, nm_sysconfig_settings_class_init): add hostname
property; first plugin returning a hostname wins
- (impl_settings_add_connection): use plugin capabilities instead of
nm_system_config_interface_supports_add()
- (impl_settings_save_hostname): implement hostname saving
* src/NetworkManagerPolicy.c
- (lookup_thread_run_cb, lookup_thread_worker, lookup_thread_new,
lookup_thread_die): implement an asynchronous hostname lookup thread
which given an IPv4 address tries to look up the hostname for that
address with reverse DNS
- (get_best_device): split out best device code from
update_routing_and_dns()
- (update_etc_hosts): update /etc/hosts with the machine's new hostname
to preserve the 127.0.0.1 reverse mapping that so many things require
- (set_system_hostname): set a given hostname
- (update_system_hostname): implement hostname policy; a configured
hostname (from the system settings service) is used if available,
otherwise an automatically determined hostname from DHCP, VPN, etc.
If there was no automatically determined hostname, reverse DNS of
the best device's IP address will be used, and as a last resort the
hostname 'localhost.localdomain' is set.
- (update_routing_and_dns): use get_best_device(); update the system
hostname when the network config changes
- (hostname_changed): update system hostname if the system settings
service signals a hostname change
- (nm_policy_new): list for system settings service hostname changes
- (nm_policy_destroy): ensure that an in-progress hostname lookup thread
gets told to die
* system-settings/plugins/keyfile/plugin.c
system-settings/plugins/ifcfg-suse/plugin.c
- (get_property, sc_plugin_ifcfg_class_init): implement hostname and
capabilities properties
* system-settings/plugins/ifcfg-fedora/shvar.c
- (svOpenFile): re-enable R/W access of ifcfg files since the plugin
writes out /etc/sysconfig/network now
* system-settings/plugins/ifcfg-fedora/plugin.c
- (plugin_get_hostname): get hostname from /etc/sysconfig/network
- (plugin_set_hostname): save hostname to /etc/sysconfig/network
- (sc_network_changed_cb): handle changes to /etc/sysconfig/network
- (sc_plugin_ifcfg_init): monitor /etc/sysconfig/network for changes
- (get_property, set_property, sc_plugin_ifcfg_class_init): implement
hostname get/set and capabilities get
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4077 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-09-18 15:16:44 +00:00
|
|
|
{
|
2010-10-27 20:05:23 -05:00
|
|
|
NMManager *self = NM_MANAGER (user_data);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
2009-06-11 00:39:12 -04:00
|
|
|
char *hostname;
|
2008-09-18 Dan Williams <dcbw@redhat.com>
Implement support for honoring configured and automatic hostnames, and for
setting the configured hostname.
* introspection/nm-ip4-config.xml
src/nm-ip4-config.c
src/nm-ip4-config.h
src/dhcp-manager/nm-dhcp-manager.c
- Remove useless hostname property; it's not really part of the IPv4
config
* introspection/nm-settings-system.xml
libnm-glib/nm-dbus-settings-system.c
libnm-glib/nm-dbus-settings-system.h
- Add SetHostname() call to system settings D-Bus interface
- Add Hostname property to system settings D-Bus interface
- (nm_dbus_settings_system_save_hostname,
nm_dbus_settings_system_get_hostname): implement
* src/nm-device.c
src/nm-device.h
- (nm_device_get_dhcp4_config): implement
* src/nm-manager.c
src/nm-manager.h
- Fetch and track system settings service hostname changes, and proxy
the changes via a GObject property of the manager
* system-settings/src/nm-system-config-interface.c
system-settings/src/nm-system-config-interface.h
- Replace nm_system_config_interface_supports_add() with a capabilities
bitfield
* system-settings/src/nm-system-config-error.c
system-settings/src/nm-system-config-error.h
- Add additional errors
* system-settings/src/dbus-settings.c
system-settings/src/dbus-settings.h
- (get_property, nm_sysconfig_settings_class_init): add hostname
property; first plugin returning a hostname wins
- (impl_settings_add_connection): use plugin capabilities instead of
nm_system_config_interface_supports_add()
- (impl_settings_save_hostname): implement hostname saving
* src/NetworkManagerPolicy.c
- (lookup_thread_run_cb, lookup_thread_worker, lookup_thread_new,
lookup_thread_die): implement an asynchronous hostname lookup thread
which given an IPv4 address tries to look up the hostname for that
address with reverse DNS
- (get_best_device): split out best device code from
update_routing_and_dns()
- (update_etc_hosts): update /etc/hosts with the machine's new hostname
to preserve the 127.0.0.1 reverse mapping that so many things require
- (set_system_hostname): set a given hostname
- (update_system_hostname): implement hostname policy; a configured
hostname (from the system settings service) is used if available,
otherwise an automatically determined hostname from DHCP, VPN, etc.
If there was no automatically determined hostname, reverse DNS of
the best device's IP address will be used, and as a last resort the
hostname 'localhost.localdomain' is set.
- (update_routing_and_dns): use get_best_device(); update the system
hostname when the network config changes
- (hostname_changed): update system hostname if the system settings
service signals a hostname change
- (nm_policy_new): list for system settings service hostname changes
- (nm_policy_destroy): ensure that an in-progress hostname lookup thread
gets told to die
* system-settings/plugins/keyfile/plugin.c
system-settings/plugins/ifcfg-suse/plugin.c
- (get_property, sc_plugin_ifcfg_class_init): implement hostname and
capabilities properties
* system-settings/plugins/ifcfg-fedora/shvar.c
- (svOpenFile): re-enable R/W access of ifcfg files since the plugin
writes out /etc/sysconfig/network now
* system-settings/plugins/ifcfg-fedora/plugin.c
- (plugin_get_hostname): get hostname from /etc/sysconfig/network
- (plugin_set_hostname): save hostname to /etc/sysconfig/network
- (sc_network_changed_cb): handle changes to /etc/sysconfig/network
- (sc_plugin_ifcfg_init): monitor /etc/sysconfig/network for changes
- (get_property, set_property, sc_plugin_ifcfg_class_init): implement
hostname get/set and capabilities get
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4077 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-09-18 15:16:44 +00:00
|
|
|
|
2010-10-27 20:05:23 -05:00
|
|
|
hostname = nm_settings_get_hostname (priv->settings);
|
2009-06-11 00:39:12 -04:00
|
|
|
if (!hostname && !priv->hostname)
|
|
|
|
|
return;
|
|
|
|
|
if (hostname && priv->hostname && !strcmp (hostname, priv->hostname))
|
2008-09-18 Dan Williams <dcbw@redhat.com>
Implement support for honoring configured and automatic hostnames, and for
setting the configured hostname.
* introspection/nm-ip4-config.xml
src/nm-ip4-config.c
src/nm-ip4-config.h
src/dhcp-manager/nm-dhcp-manager.c
- Remove useless hostname property; it's not really part of the IPv4
config
* introspection/nm-settings-system.xml
libnm-glib/nm-dbus-settings-system.c
libnm-glib/nm-dbus-settings-system.h
- Add SetHostname() call to system settings D-Bus interface
- Add Hostname property to system settings D-Bus interface
- (nm_dbus_settings_system_save_hostname,
nm_dbus_settings_system_get_hostname): implement
* src/nm-device.c
src/nm-device.h
- (nm_device_get_dhcp4_config): implement
* src/nm-manager.c
src/nm-manager.h
- Fetch and track system settings service hostname changes, and proxy
the changes via a GObject property of the manager
* system-settings/src/nm-system-config-interface.c
system-settings/src/nm-system-config-interface.h
- Replace nm_system_config_interface_supports_add() with a capabilities
bitfield
* system-settings/src/nm-system-config-error.c
system-settings/src/nm-system-config-error.h
- Add additional errors
* system-settings/src/dbus-settings.c
system-settings/src/dbus-settings.h
- (get_property, nm_sysconfig_settings_class_init): add hostname
property; first plugin returning a hostname wins
- (impl_settings_add_connection): use plugin capabilities instead of
nm_system_config_interface_supports_add()
- (impl_settings_save_hostname): implement hostname saving
* src/NetworkManagerPolicy.c
- (lookup_thread_run_cb, lookup_thread_worker, lookup_thread_new,
lookup_thread_die): implement an asynchronous hostname lookup thread
which given an IPv4 address tries to look up the hostname for that
address with reverse DNS
- (get_best_device): split out best device code from
update_routing_and_dns()
- (update_etc_hosts): update /etc/hosts with the machine's new hostname
to preserve the 127.0.0.1 reverse mapping that so many things require
- (set_system_hostname): set a given hostname
- (update_system_hostname): implement hostname policy; a configured
hostname (from the system settings service) is used if available,
otherwise an automatically determined hostname from DHCP, VPN, etc.
If there was no automatically determined hostname, reverse DNS of
the best device's IP address will be used, and as a last resort the
hostname 'localhost.localdomain' is set.
- (update_routing_and_dns): use get_best_device(); update the system
hostname when the network config changes
- (hostname_changed): update system hostname if the system settings
service signals a hostname change
- (nm_policy_new): list for system settings service hostname changes
- (nm_policy_destroy): ensure that an in-progress hostname lookup thread
gets told to die
* system-settings/plugins/keyfile/plugin.c
system-settings/plugins/ifcfg-suse/plugin.c
- (get_property, sc_plugin_ifcfg_class_init): implement hostname and
capabilities properties
* system-settings/plugins/ifcfg-fedora/shvar.c
- (svOpenFile): re-enable R/W access of ifcfg files since the plugin
writes out /etc/sysconfig/network now
* system-settings/plugins/ifcfg-fedora/plugin.c
- (plugin_get_hostname): get hostname from /etc/sysconfig/network
- (plugin_set_hostname): save hostname to /etc/sysconfig/network
- (sc_network_changed_cb): handle changes to /etc/sysconfig/network
- (sc_plugin_ifcfg_init): monitor /etc/sysconfig/network for changes
- (get_property, set_property, sc_plugin_ifcfg_class_init): implement
hostname get/set and capabilities get
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4077 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-09-18 15:16:44 +00:00
|
|
|
return;
|
2008-04-07 Dan Williams <dcbw@redhat.com>
* include/NetworkManager.h
- Remove the DOWN and CANCELLED device states
- Add UNMANAGED and UNAVAILABLE device states
- Document the device states
* introspection/nm-device.xml
src/nm-device-interface.c
src/nm-device-interface.h
- Add the 'managed' property
* test/nm-tool.c
- (detail_device): print out device state
* src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerMandriva.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerSuSE.c
- (nm_system_device_get_system_config, nm_system_device_get_disabled
nm_system_device_free_system_config): remove; they were unused and
their functionality should be re-implemented in each distro's
system settings service plugin
* src/nm-gsm-device.c
src/nm-gsm-device.h
src/nm-cdma-device.c
src/nm-cdma-device.h
- (*_new): take the 'managed' argument
* src/nm-device.c
- (nm_device_set_address): remove, fold into nm_device_bring_up()
- (nm_device_init): start in unmanaged state, not disconnected
- (constructor): don't start device until the system settings service
has had a chance to figure out if the device is managed or not
- (nm_device_deactivate, nm_device_bring_up, nm_device_bring_down):
don't set device state here, let callers handle that as appropriate
- (nm_device_dispose): don't touch the device if it's not managed
- (set_property, get_property, nm_device_class_init): implement the
'managed' property
- (nm_device_state_changed): bring the device up if its now managed,
and deactivate it if it used to be active
- (nm_device_get_managed, nm_device_set_managed): do the right thing
with the managed state
* src/nm-hal-manager.c
- (wired_device_creator, wireless_device_creator, modem_device_creator):
take initial managed state and pass it along to device constructors
- (create_device_and_add_to_list): get managed state and pass to
type creators
* src/nm-device-802-11-wireless.c
- (real_can_activate): fold in most of
nm_device_802_11_wireless_can_activate()
- (can_scan): can't scan in UNAVAILABLE or UNMANAGED
- (link_timeout_cb): instead of deactivating, change device state and
let the device state handler to it
- (real_update_hw_address): clean up
- (state_changed_cb): when entering UNAVAILABLE state, schedule an idle
handler to transition to DISCONNECTED if the device isn't rfkilled
* src/nm-device-802-3-ethernet.c
- (set_carrier): move above callers and get rid of prototype
- (device_state_changed): when entering UNAVAILABLE state, schedule an
idle handler to transition to DISCONNECTED if the device has a
carrier
- (real_update_hw_address): clean up
- (link_timeout_cb, ppp_state_changed): change state instead of calling
deactivation directly as deactivation doesn't change state anymore
* src/NetworkManagerPolicy.c
- (schedule_activate_check): yay, remove wireless_enabled hack since
the NMManager and wireless devices work that out themselves now
- (device_state_changed): change to a switch and update for new device
states
- (device_carrier_changed): remove; device handles this now through
state changes
- (device_added): don't care about carrier any more; the initial
activation check will happen when the device transitions to
DISCONNECTED
* src/nm-manager.c
- (dispose): clear unmanaged devices
- (handle_unmanaged_devices): update unmanaged device list and toggle
the managed property on each device when needed
- (system_settings_properties_changed_cb): handle signals from the
system settings service
- (system_settings_get_unmanaged_devices_cb): handle callback from
getting the unmanaged device list method call
- (query_unmanaged_devices): ask the system settings service for its
list of unmanaged devices
- (nm_manager_name_owner_changed, initial_get_connections): get unmanaged
devices
- (manager_set_wireless_enabled): push rfkill state down to wireless
devices directly and let them handle the necessary state transitions
- (manager_device_state_changed): update for new device states
- (nm_manager_add_device): set initial rfkill state on wireless devices
- (nm_manager_remove_device): don't touch the device if it's unmanaged
- (nm_manager_activate_connection): return error if the device is
unmanaged
- (nm_manager_sleep): handle new device states correctly; don't change
the state of unavailable/unmanaged devices
* libnm-glib/nm-device-802-11-wireless.c
- (state_changed_cb): update for new device states
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3540 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-08 02:58:02 +00:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
g_free (priv->hostname);
|
|
|
|
|
priv->hostname = (hostname && strlen (hostname)) ? g_strdup (hostname) : NULL;
|
2010-10-27 20:05:23 -05:00
|
|
|
g_object_notify (G_OBJECT (self), NM_MANAGER_HOSTNAME);
|
2008-09-18 Dan Williams <dcbw@redhat.com>
Implement support for honoring configured and automatic hostnames, and for
setting the configured hostname.
* introspection/nm-ip4-config.xml
src/nm-ip4-config.c
src/nm-ip4-config.h
src/dhcp-manager/nm-dhcp-manager.c
- Remove useless hostname property; it's not really part of the IPv4
config
* introspection/nm-settings-system.xml
libnm-glib/nm-dbus-settings-system.c
libnm-glib/nm-dbus-settings-system.h
- Add SetHostname() call to system settings D-Bus interface
- Add Hostname property to system settings D-Bus interface
- (nm_dbus_settings_system_save_hostname,
nm_dbus_settings_system_get_hostname): implement
* src/nm-device.c
src/nm-device.h
- (nm_device_get_dhcp4_config): implement
* src/nm-manager.c
src/nm-manager.h
- Fetch and track system settings service hostname changes, and proxy
the changes via a GObject property of the manager
* system-settings/src/nm-system-config-interface.c
system-settings/src/nm-system-config-interface.h
- Replace nm_system_config_interface_supports_add() with a capabilities
bitfield
* system-settings/src/nm-system-config-error.c
system-settings/src/nm-system-config-error.h
- Add additional errors
* system-settings/src/dbus-settings.c
system-settings/src/dbus-settings.h
- (get_property, nm_sysconfig_settings_class_init): add hostname
property; first plugin returning a hostname wins
- (impl_settings_add_connection): use plugin capabilities instead of
nm_system_config_interface_supports_add()
- (impl_settings_save_hostname): implement hostname saving
* src/NetworkManagerPolicy.c
- (lookup_thread_run_cb, lookup_thread_worker, lookup_thread_new,
lookup_thread_die): implement an asynchronous hostname lookup thread
which given an IPv4 address tries to look up the hostname for that
address with reverse DNS
- (get_best_device): split out best device code from
update_routing_and_dns()
- (update_etc_hosts): update /etc/hosts with the machine's new hostname
to preserve the 127.0.0.1 reverse mapping that so many things require
- (set_system_hostname): set a given hostname
- (update_system_hostname): implement hostname policy; a configured
hostname (from the system settings service) is used if available,
otherwise an automatically determined hostname from DHCP, VPN, etc.
If there was no automatically determined hostname, reverse DNS of
the best device's IP address will be used, and as a last resort the
hostname 'localhost.localdomain' is set.
- (update_routing_and_dns): use get_best_device(); update the system
hostname when the network config changes
- (hostname_changed): update system hostname if the system settings
service signals a hostname change
- (nm_policy_new): list for system settings service hostname changes
- (nm_policy_destroy): ensure that an in-progress hostname lookup thread
gets told to die
* system-settings/plugins/keyfile/plugin.c
system-settings/plugins/ifcfg-suse/plugin.c
- (get_property, sc_plugin_ifcfg_class_init): implement hostname and
capabilities properties
* system-settings/plugins/ifcfg-fedora/shvar.c
- (svOpenFile): re-enable R/W access of ifcfg files since the plugin
writes out /etc/sysconfig/network now
* system-settings/plugins/ifcfg-fedora/plugin.c
- (plugin_get_hostname): get hostname from /etc/sysconfig/network
- (plugin_set_hostname): save hostname to /etc/sysconfig/network
- (sc_network_changed_cb): handle changes to /etc/sysconfig/network
- (sc_plugin_ifcfg_init): monitor /etc/sysconfig/network for changes
- (get_property, set_property, sc_plugin_ifcfg_class_init): implement
hostname get/set and capabilities get
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4077 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-09-18 15:16:44 +00:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
g_free (hostname);
|
2008-04-07 Dan Williams <dcbw@redhat.com>
* include/NetworkManager.h
- Remove the DOWN and CANCELLED device states
- Add UNMANAGED and UNAVAILABLE device states
- Document the device states
* introspection/nm-device.xml
src/nm-device-interface.c
src/nm-device-interface.h
- Add the 'managed' property
* test/nm-tool.c
- (detail_device): print out device state
* src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerMandriva.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerSuSE.c
- (nm_system_device_get_system_config, nm_system_device_get_disabled
nm_system_device_free_system_config): remove; they were unused and
their functionality should be re-implemented in each distro's
system settings service plugin
* src/nm-gsm-device.c
src/nm-gsm-device.h
src/nm-cdma-device.c
src/nm-cdma-device.h
- (*_new): take the 'managed' argument
* src/nm-device.c
- (nm_device_set_address): remove, fold into nm_device_bring_up()
- (nm_device_init): start in unmanaged state, not disconnected
- (constructor): don't start device until the system settings service
has had a chance to figure out if the device is managed or not
- (nm_device_deactivate, nm_device_bring_up, nm_device_bring_down):
don't set device state here, let callers handle that as appropriate
- (nm_device_dispose): don't touch the device if it's not managed
- (set_property, get_property, nm_device_class_init): implement the
'managed' property
- (nm_device_state_changed): bring the device up if its now managed,
and deactivate it if it used to be active
- (nm_device_get_managed, nm_device_set_managed): do the right thing
with the managed state
* src/nm-hal-manager.c
- (wired_device_creator, wireless_device_creator, modem_device_creator):
take initial managed state and pass it along to device constructors
- (create_device_and_add_to_list): get managed state and pass to
type creators
* src/nm-device-802-11-wireless.c
- (real_can_activate): fold in most of
nm_device_802_11_wireless_can_activate()
- (can_scan): can't scan in UNAVAILABLE or UNMANAGED
- (link_timeout_cb): instead of deactivating, change device state and
let the device state handler to it
- (real_update_hw_address): clean up
- (state_changed_cb): when entering UNAVAILABLE state, schedule an idle
handler to transition to DISCONNECTED if the device isn't rfkilled
* src/nm-device-802-3-ethernet.c
- (set_carrier): move above callers and get rid of prototype
- (device_state_changed): when entering UNAVAILABLE state, schedule an
idle handler to transition to DISCONNECTED if the device has a
carrier
- (real_update_hw_address): clean up
- (link_timeout_cb, ppp_state_changed): change state instead of calling
deactivation directly as deactivation doesn't change state anymore
* src/NetworkManagerPolicy.c
- (schedule_activate_check): yay, remove wireless_enabled hack since
the NMManager and wireless devices work that out themselves now
- (device_state_changed): change to a switch and update for new device
states
- (device_carrier_changed): remove; device handles this now through
state changes
- (device_added): don't care about carrier any more; the initial
activation check will happen when the device transitions to
DISCONNECTED
* src/nm-manager.c
- (dispose): clear unmanaged devices
- (handle_unmanaged_devices): update unmanaged device list and toggle
the managed property on each device when needed
- (system_settings_properties_changed_cb): handle signals from the
system settings service
- (system_settings_get_unmanaged_devices_cb): handle callback from
getting the unmanaged device list method call
- (query_unmanaged_devices): ask the system settings service for its
list of unmanaged devices
- (nm_manager_name_owner_changed, initial_get_connections): get unmanaged
devices
- (manager_set_wireless_enabled): push rfkill state down to wireless
devices directly and let them handle the necessary state transitions
- (manager_device_state_changed): update for new device states
- (nm_manager_add_device): set initial rfkill state on wireless devices
- (nm_manager_remove_device): don't touch the device if it's unmanaged
- (nm_manager_activate_connection): return error if the device is
unmanaged
- (nm_manager_sleep): handle new device states correctly; don't change
the state of unavailable/unmanaged devices
* libnm-glib/nm-device-802-11-wireless.c
- (state_changed_cb): update for new device states
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3540 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-08 02:58:02 +00:00
|
|
|
}
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
/*******************************************************************/
|
|
|
|
|
/* General NMManager stuff */
|
|
|
|
|
/*******************************************************************/
|
|
|
|
|
|
|
|
|
|
static NMDevice *
|
|
|
|
|
nm_manager_get_device_by_udi (NMManager *manager, const char *udi)
|
2008-04-07 Dan Williams <dcbw@redhat.com>
* include/NetworkManager.h
- Remove the DOWN and CANCELLED device states
- Add UNMANAGED and UNAVAILABLE device states
- Document the device states
* introspection/nm-device.xml
src/nm-device-interface.c
src/nm-device-interface.h
- Add the 'managed' property
* test/nm-tool.c
- (detail_device): print out device state
* src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerMandriva.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerSuSE.c
- (nm_system_device_get_system_config, nm_system_device_get_disabled
nm_system_device_free_system_config): remove; they were unused and
their functionality should be re-implemented in each distro's
system settings service plugin
* src/nm-gsm-device.c
src/nm-gsm-device.h
src/nm-cdma-device.c
src/nm-cdma-device.h
- (*_new): take the 'managed' argument
* src/nm-device.c
- (nm_device_set_address): remove, fold into nm_device_bring_up()
- (nm_device_init): start in unmanaged state, not disconnected
- (constructor): don't start device until the system settings service
has had a chance to figure out if the device is managed or not
- (nm_device_deactivate, nm_device_bring_up, nm_device_bring_down):
don't set device state here, let callers handle that as appropriate
- (nm_device_dispose): don't touch the device if it's not managed
- (set_property, get_property, nm_device_class_init): implement the
'managed' property
- (nm_device_state_changed): bring the device up if its now managed,
and deactivate it if it used to be active
- (nm_device_get_managed, nm_device_set_managed): do the right thing
with the managed state
* src/nm-hal-manager.c
- (wired_device_creator, wireless_device_creator, modem_device_creator):
take initial managed state and pass it along to device constructors
- (create_device_and_add_to_list): get managed state and pass to
type creators
* src/nm-device-802-11-wireless.c
- (real_can_activate): fold in most of
nm_device_802_11_wireless_can_activate()
- (can_scan): can't scan in UNAVAILABLE or UNMANAGED
- (link_timeout_cb): instead of deactivating, change device state and
let the device state handler to it
- (real_update_hw_address): clean up
- (state_changed_cb): when entering UNAVAILABLE state, schedule an idle
handler to transition to DISCONNECTED if the device isn't rfkilled
* src/nm-device-802-3-ethernet.c
- (set_carrier): move above callers and get rid of prototype
- (device_state_changed): when entering UNAVAILABLE state, schedule an
idle handler to transition to DISCONNECTED if the device has a
carrier
- (real_update_hw_address): clean up
- (link_timeout_cb, ppp_state_changed): change state instead of calling
deactivation directly as deactivation doesn't change state anymore
* src/NetworkManagerPolicy.c
- (schedule_activate_check): yay, remove wireless_enabled hack since
the NMManager and wireless devices work that out themselves now
- (device_state_changed): change to a switch and update for new device
states
- (device_carrier_changed): remove; device handles this now through
state changes
- (device_added): don't care about carrier any more; the initial
activation check will happen when the device transitions to
DISCONNECTED
* src/nm-manager.c
- (dispose): clear unmanaged devices
- (handle_unmanaged_devices): update unmanaged device list and toggle
the managed property on each device when needed
- (system_settings_properties_changed_cb): handle signals from the
system settings service
- (system_settings_get_unmanaged_devices_cb): handle callback from
getting the unmanaged device list method call
- (query_unmanaged_devices): ask the system settings service for its
list of unmanaged devices
- (nm_manager_name_owner_changed, initial_get_connections): get unmanaged
devices
- (manager_set_wireless_enabled): push rfkill state down to wireless
devices directly and let them handle the necessary state transitions
- (manager_device_state_changed): update for new device states
- (nm_manager_add_device): set initial rfkill state on wireless devices
- (nm_manager_remove_device): don't touch the device if it's unmanaged
- (nm_manager_activate_connection): return error if the device is
unmanaged
- (nm_manager_sleep): handle new device states correctly; don't change
the state of unavailable/unmanaged devices
* libnm-glib/nm-device-802-11-wireless.c
- (state_changed_cb): update for new device states
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3540 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-08 02:58:02 +00:00
|
|
|
{
|
2009-06-11 00:39:12 -04:00
|
|
|
GSList *iter;
|
2008-04-07 Dan Williams <dcbw@redhat.com>
* include/NetworkManager.h
- Remove the DOWN and CANCELLED device states
- Add UNMANAGED and UNAVAILABLE device states
- Document the device states
* introspection/nm-device.xml
src/nm-device-interface.c
src/nm-device-interface.h
- Add the 'managed' property
* test/nm-tool.c
- (detail_device): print out device state
* src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerMandriva.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerSuSE.c
- (nm_system_device_get_system_config, nm_system_device_get_disabled
nm_system_device_free_system_config): remove; they were unused and
their functionality should be re-implemented in each distro's
system settings service plugin
* src/nm-gsm-device.c
src/nm-gsm-device.h
src/nm-cdma-device.c
src/nm-cdma-device.h
- (*_new): take the 'managed' argument
* src/nm-device.c
- (nm_device_set_address): remove, fold into nm_device_bring_up()
- (nm_device_init): start in unmanaged state, not disconnected
- (constructor): don't start device until the system settings service
has had a chance to figure out if the device is managed or not
- (nm_device_deactivate, nm_device_bring_up, nm_device_bring_down):
don't set device state here, let callers handle that as appropriate
- (nm_device_dispose): don't touch the device if it's not managed
- (set_property, get_property, nm_device_class_init): implement the
'managed' property
- (nm_device_state_changed): bring the device up if its now managed,
and deactivate it if it used to be active
- (nm_device_get_managed, nm_device_set_managed): do the right thing
with the managed state
* src/nm-hal-manager.c
- (wired_device_creator, wireless_device_creator, modem_device_creator):
take initial managed state and pass it along to device constructors
- (create_device_and_add_to_list): get managed state and pass to
type creators
* src/nm-device-802-11-wireless.c
- (real_can_activate): fold in most of
nm_device_802_11_wireless_can_activate()
- (can_scan): can't scan in UNAVAILABLE or UNMANAGED
- (link_timeout_cb): instead of deactivating, change device state and
let the device state handler to it
- (real_update_hw_address): clean up
- (state_changed_cb): when entering UNAVAILABLE state, schedule an idle
handler to transition to DISCONNECTED if the device isn't rfkilled
* src/nm-device-802-3-ethernet.c
- (set_carrier): move above callers and get rid of prototype
- (device_state_changed): when entering UNAVAILABLE state, schedule an
idle handler to transition to DISCONNECTED if the device has a
carrier
- (real_update_hw_address): clean up
- (link_timeout_cb, ppp_state_changed): change state instead of calling
deactivation directly as deactivation doesn't change state anymore
* src/NetworkManagerPolicy.c
- (schedule_activate_check): yay, remove wireless_enabled hack since
the NMManager and wireless devices work that out themselves now
- (device_state_changed): change to a switch and update for new device
states
- (device_carrier_changed): remove; device handles this now through
state changes
- (device_added): don't care about carrier any more; the initial
activation check will happen when the device transitions to
DISCONNECTED
* src/nm-manager.c
- (dispose): clear unmanaged devices
- (handle_unmanaged_devices): update unmanaged device list and toggle
the managed property on each device when needed
- (system_settings_properties_changed_cb): handle signals from the
system settings service
- (system_settings_get_unmanaged_devices_cb): handle callback from
getting the unmanaged device list method call
- (query_unmanaged_devices): ask the system settings service for its
list of unmanaged devices
- (nm_manager_name_owner_changed, initial_get_connections): get unmanaged
devices
- (manager_set_wireless_enabled): push rfkill state down to wireless
devices directly and let them handle the necessary state transitions
- (manager_device_state_changed): update for new device states
- (nm_manager_add_device): set initial rfkill state on wireless devices
- (nm_manager_remove_device): don't touch the device if it's unmanaged
- (nm_manager_activate_connection): return error if the device is
unmanaged
- (nm_manager_sleep): handle new device states correctly; don't change
the state of unavailable/unmanaged devices
* libnm-glib/nm-device-802-11-wireless.c
- (state_changed_cb): update for new device states
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3540 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-08 02:58:02 +00:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
for (iter = NM_MANAGER_GET_PRIVATE (manager)->devices; iter; iter = iter->next) {
|
|
|
|
|
if (!strcmp (nm_device_get_udi (NM_DEVICE (iter->data)), udi))
|
|
|
|
|
return NM_DEVICE (iter->data);
|
|
|
|
|
}
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2008-04-07 Dan Williams <dcbw@redhat.com>
* include/NetworkManager.h
- Remove the DOWN and CANCELLED device states
- Add UNMANAGED and UNAVAILABLE device states
- Document the device states
* introspection/nm-device.xml
src/nm-device-interface.c
src/nm-device-interface.h
- Add the 'managed' property
* test/nm-tool.c
- (detail_device): print out device state
* src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerMandriva.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerSuSE.c
- (nm_system_device_get_system_config, nm_system_device_get_disabled
nm_system_device_free_system_config): remove; they were unused and
their functionality should be re-implemented in each distro's
system settings service plugin
* src/nm-gsm-device.c
src/nm-gsm-device.h
src/nm-cdma-device.c
src/nm-cdma-device.h
- (*_new): take the 'managed' argument
* src/nm-device.c
- (nm_device_set_address): remove, fold into nm_device_bring_up()
- (nm_device_init): start in unmanaged state, not disconnected
- (constructor): don't start device until the system settings service
has had a chance to figure out if the device is managed or not
- (nm_device_deactivate, nm_device_bring_up, nm_device_bring_down):
don't set device state here, let callers handle that as appropriate
- (nm_device_dispose): don't touch the device if it's not managed
- (set_property, get_property, nm_device_class_init): implement the
'managed' property
- (nm_device_state_changed): bring the device up if its now managed,
and deactivate it if it used to be active
- (nm_device_get_managed, nm_device_set_managed): do the right thing
with the managed state
* src/nm-hal-manager.c
- (wired_device_creator, wireless_device_creator, modem_device_creator):
take initial managed state and pass it along to device constructors
- (create_device_and_add_to_list): get managed state and pass to
type creators
* src/nm-device-802-11-wireless.c
- (real_can_activate): fold in most of
nm_device_802_11_wireless_can_activate()
- (can_scan): can't scan in UNAVAILABLE or UNMANAGED
- (link_timeout_cb): instead of deactivating, change device state and
let the device state handler to it
- (real_update_hw_address): clean up
- (state_changed_cb): when entering UNAVAILABLE state, schedule an idle
handler to transition to DISCONNECTED if the device isn't rfkilled
* src/nm-device-802-3-ethernet.c
- (set_carrier): move above callers and get rid of prototype
- (device_state_changed): when entering UNAVAILABLE state, schedule an
idle handler to transition to DISCONNECTED if the device has a
carrier
- (real_update_hw_address): clean up
- (link_timeout_cb, ppp_state_changed): change state instead of calling
deactivation directly as deactivation doesn't change state anymore
* src/NetworkManagerPolicy.c
- (schedule_activate_check): yay, remove wireless_enabled hack since
the NMManager and wireless devices work that out themselves now
- (device_state_changed): change to a switch and update for new device
states
- (device_carrier_changed): remove; device handles this now through
state changes
- (device_added): don't care about carrier any more; the initial
activation check will happen when the device transitions to
DISCONNECTED
* src/nm-manager.c
- (dispose): clear unmanaged devices
- (handle_unmanaged_devices): update unmanaged device list and toggle
the managed property on each device when needed
- (system_settings_properties_changed_cb): handle signals from the
system settings service
- (system_settings_get_unmanaged_devices_cb): handle callback from
getting the unmanaged device list method call
- (query_unmanaged_devices): ask the system settings service for its
list of unmanaged devices
- (nm_manager_name_owner_changed, initial_get_connections): get unmanaged
devices
- (manager_set_wireless_enabled): push rfkill state down to wireless
devices directly and let them handle the necessary state transitions
- (manager_device_state_changed): update for new device states
- (nm_manager_add_device): set initial rfkill state on wireless devices
- (nm_manager_remove_device): don't touch the device if it's unmanaged
- (nm_manager_activate_connection): return error if the device is
unmanaged
- (nm_manager_sleep): handle new device states correctly; don't change
the state of unavailable/unmanaged devices
* libnm-glib/nm-device-802-11-wireless.c
- (state_changed_cb): update for new device states
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3540 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-08 02:58:02 +00:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
static NMDevice *
|
|
|
|
|
nm_manager_get_device_by_path (NMManager *manager, const char *path)
|
|
|
|
|
{
|
|
|
|
|
GSList *iter;
|
2008-04-07 Dan Williams <dcbw@redhat.com>
* include/NetworkManager.h
- Remove the DOWN and CANCELLED device states
- Add UNMANAGED and UNAVAILABLE device states
- Document the device states
* introspection/nm-device.xml
src/nm-device-interface.c
src/nm-device-interface.h
- Add the 'managed' property
* test/nm-tool.c
- (detail_device): print out device state
* src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerMandriva.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerSuSE.c
- (nm_system_device_get_system_config, nm_system_device_get_disabled
nm_system_device_free_system_config): remove; they were unused and
their functionality should be re-implemented in each distro's
system settings service plugin
* src/nm-gsm-device.c
src/nm-gsm-device.h
src/nm-cdma-device.c
src/nm-cdma-device.h
- (*_new): take the 'managed' argument
* src/nm-device.c
- (nm_device_set_address): remove, fold into nm_device_bring_up()
- (nm_device_init): start in unmanaged state, not disconnected
- (constructor): don't start device until the system settings service
has had a chance to figure out if the device is managed or not
- (nm_device_deactivate, nm_device_bring_up, nm_device_bring_down):
don't set device state here, let callers handle that as appropriate
- (nm_device_dispose): don't touch the device if it's not managed
- (set_property, get_property, nm_device_class_init): implement the
'managed' property
- (nm_device_state_changed): bring the device up if its now managed,
and deactivate it if it used to be active
- (nm_device_get_managed, nm_device_set_managed): do the right thing
with the managed state
* src/nm-hal-manager.c
- (wired_device_creator, wireless_device_creator, modem_device_creator):
take initial managed state and pass it along to device constructors
- (create_device_and_add_to_list): get managed state and pass to
type creators
* src/nm-device-802-11-wireless.c
- (real_can_activate): fold in most of
nm_device_802_11_wireless_can_activate()
- (can_scan): can't scan in UNAVAILABLE or UNMANAGED
- (link_timeout_cb): instead of deactivating, change device state and
let the device state handler to it
- (real_update_hw_address): clean up
- (state_changed_cb): when entering UNAVAILABLE state, schedule an idle
handler to transition to DISCONNECTED if the device isn't rfkilled
* src/nm-device-802-3-ethernet.c
- (set_carrier): move above callers and get rid of prototype
- (device_state_changed): when entering UNAVAILABLE state, schedule an
idle handler to transition to DISCONNECTED if the device has a
carrier
- (real_update_hw_address): clean up
- (link_timeout_cb, ppp_state_changed): change state instead of calling
deactivation directly as deactivation doesn't change state anymore
* src/NetworkManagerPolicy.c
- (schedule_activate_check): yay, remove wireless_enabled hack since
the NMManager and wireless devices work that out themselves now
- (device_state_changed): change to a switch and update for new device
states
- (device_carrier_changed): remove; device handles this now through
state changes
- (device_added): don't care about carrier any more; the initial
activation check will happen when the device transitions to
DISCONNECTED
* src/nm-manager.c
- (dispose): clear unmanaged devices
- (handle_unmanaged_devices): update unmanaged device list and toggle
the managed property on each device when needed
- (system_settings_properties_changed_cb): handle signals from the
system settings service
- (system_settings_get_unmanaged_devices_cb): handle callback from
getting the unmanaged device list method call
- (query_unmanaged_devices): ask the system settings service for its
list of unmanaged devices
- (nm_manager_name_owner_changed, initial_get_connections): get unmanaged
devices
- (manager_set_wireless_enabled): push rfkill state down to wireless
devices directly and let them handle the necessary state transitions
- (manager_device_state_changed): update for new device states
- (nm_manager_add_device): set initial rfkill state on wireless devices
- (nm_manager_remove_device): don't touch the device if it's unmanaged
- (nm_manager_activate_connection): return error if the device is
unmanaged
- (nm_manager_sleep): handle new device states correctly; don't change
the state of unavailable/unmanaged devices
* libnm-glib/nm-device-802-11-wireless.c
- (state_changed_cb): update for new device states
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3540 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-08 02:58:02 +00:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
for (iter = NM_MANAGER_GET_PRIVATE (manager)->devices; iter; iter = iter->next) {
|
|
|
|
|
if (!strcmp (nm_device_get_path (NM_DEVICE (iter->data)), path))
|
|
|
|
|
return NM_DEVICE (iter->data);
|
|
|
|
|
}
|
|
|
|
|
return NULL;
|
2008-04-07 Dan Williams <dcbw@redhat.com>
* include/NetworkManager.h
- Remove the DOWN and CANCELLED device states
- Add UNMANAGED and UNAVAILABLE device states
- Document the device states
* introspection/nm-device.xml
src/nm-device-interface.c
src/nm-device-interface.h
- Add the 'managed' property
* test/nm-tool.c
- (detail_device): print out device state
* src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerMandriva.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerSuSE.c
- (nm_system_device_get_system_config, nm_system_device_get_disabled
nm_system_device_free_system_config): remove; they were unused and
their functionality should be re-implemented in each distro's
system settings service plugin
* src/nm-gsm-device.c
src/nm-gsm-device.h
src/nm-cdma-device.c
src/nm-cdma-device.h
- (*_new): take the 'managed' argument
* src/nm-device.c
- (nm_device_set_address): remove, fold into nm_device_bring_up()
- (nm_device_init): start in unmanaged state, not disconnected
- (constructor): don't start device until the system settings service
has had a chance to figure out if the device is managed or not
- (nm_device_deactivate, nm_device_bring_up, nm_device_bring_down):
don't set device state here, let callers handle that as appropriate
- (nm_device_dispose): don't touch the device if it's not managed
- (set_property, get_property, nm_device_class_init): implement the
'managed' property
- (nm_device_state_changed): bring the device up if its now managed,
and deactivate it if it used to be active
- (nm_device_get_managed, nm_device_set_managed): do the right thing
with the managed state
* src/nm-hal-manager.c
- (wired_device_creator, wireless_device_creator, modem_device_creator):
take initial managed state and pass it along to device constructors
- (create_device_and_add_to_list): get managed state and pass to
type creators
* src/nm-device-802-11-wireless.c
- (real_can_activate): fold in most of
nm_device_802_11_wireless_can_activate()
- (can_scan): can't scan in UNAVAILABLE or UNMANAGED
- (link_timeout_cb): instead of deactivating, change device state and
let the device state handler to it
- (real_update_hw_address): clean up
- (state_changed_cb): when entering UNAVAILABLE state, schedule an idle
handler to transition to DISCONNECTED if the device isn't rfkilled
* src/nm-device-802-3-ethernet.c
- (set_carrier): move above callers and get rid of prototype
- (device_state_changed): when entering UNAVAILABLE state, schedule an
idle handler to transition to DISCONNECTED if the device has a
carrier
- (real_update_hw_address): clean up
- (link_timeout_cb, ppp_state_changed): change state instead of calling
deactivation directly as deactivation doesn't change state anymore
* src/NetworkManagerPolicy.c
- (schedule_activate_check): yay, remove wireless_enabled hack since
the NMManager and wireless devices work that out themselves now
- (device_state_changed): change to a switch and update for new device
states
- (device_carrier_changed): remove; device handles this now through
state changes
- (device_added): don't care about carrier any more; the initial
activation check will happen when the device transitions to
DISCONNECTED
* src/nm-manager.c
- (dispose): clear unmanaged devices
- (handle_unmanaged_devices): update unmanaged device list and toggle
the managed property on each device when needed
- (system_settings_properties_changed_cb): handle signals from the
system settings service
- (system_settings_get_unmanaged_devices_cb): handle callback from
getting the unmanaged device list method call
- (query_unmanaged_devices): ask the system settings service for its
list of unmanaged devices
- (nm_manager_name_owner_changed, initial_get_connections): get unmanaged
devices
- (manager_set_wireless_enabled): push rfkill state down to wireless
devices directly and let them handle the necessary state transitions
- (manager_device_state_changed): update for new device states
- (nm_manager_add_device): set initial rfkill state on wireless devices
- (nm_manager_remove_device): don't touch the device if it's unmanaged
- (nm_manager_activate_connection): return error if the device is
unmanaged
- (nm_manager_sleep): handle new device states correctly; don't change
the state of unavailable/unmanaged devices
* libnm-glib/nm-device-802-11-wireless.c
- (state_changed_cb): update for new device states
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3540 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-08 02:58:02 +00:00
|
|
|
}
|
|
|
|
|
|
2009-11-02 17:29:53 -08:00
|
|
|
/* Store value into key-file; supported types: boolean, int, string */
|
|
|
|
|
static gboolean
|
|
|
|
|
write_value_to_state_file (const char *filename,
|
|
|
|
|
const char *group,
|
|
|
|
|
const char *key,
|
|
|
|
|
GType value_type,
|
|
|
|
|
gpointer value,
|
|
|
|
|
GError **error)
|
|
|
|
|
{
|
|
|
|
|
GKeyFile *key_file;
|
|
|
|
|
char *data;
|
|
|
|
|
gsize len = 0;
|
|
|
|
|
gboolean ret = FALSE;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (filename != NULL, FALSE);
|
|
|
|
|
g_return_val_if_fail (group != NULL, FALSE);
|
|
|
|
|
g_return_val_if_fail (key != NULL, FALSE);
|
|
|
|
|
g_return_val_if_fail (value_type == G_TYPE_BOOLEAN ||
|
|
|
|
|
value_type == G_TYPE_INT ||
|
|
|
|
|
value_type == G_TYPE_STRING,
|
|
|
|
|
FALSE);
|
|
|
|
|
|
|
|
|
|
key_file = g_key_file_new ();
|
|
|
|
|
if (!key_file)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
g_key_file_set_list_separator (key_file, ',');
|
|
|
|
|
g_key_file_load_from_file (key_file, filename, G_KEY_FILE_KEEP_COMMENTS, NULL);
|
|
|
|
|
switch (value_type) {
|
|
|
|
|
case G_TYPE_BOOLEAN:
|
|
|
|
|
g_key_file_set_boolean (key_file, group, key, *((gboolean *) value));
|
|
|
|
|
break;
|
|
|
|
|
case G_TYPE_INT:
|
|
|
|
|
g_key_file_set_integer (key_file, group, key, *((gint *) value));
|
|
|
|
|
break;
|
|
|
|
|
case G_TYPE_STRING:
|
|
|
|
|
g_key_file_set_string (key_file, group, key, *((const gchar **) value));
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
data = g_key_file_to_data (key_file, &len, NULL);
|
|
|
|
|
if (data) {
|
|
|
|
|
ret = g_file_set_contents (filename, data, len, error);
|
|
|
|
|
g_free (data);
|
|
|
|
|
}
|
|
|
|
|
g_key_file_free (key_file);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
2010-09-01 17:08:10 -05:00
|
|
|
static gboolean
|
|
|
|
|
radio_enabled_for_rstate (RadioState *rstate)
|
|
|
|
|
{
|
|
|
|
|
return rstate->user_enabled && rstate->sw_enabled && rstate->hw_enabled;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
radio_enabled_for_type (NMManager *self, RfKillType rtype)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
|
|
|
|
|
return radio_enabled_for_rstate (&priv->radio_states[rtype]);
|
|
|
|
|
}
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
static void
|
2010-09-01 17:08:10 -05:00
|
|
|
manager_update_radio_enabled (NMManager *self, RadioState *rstate)
|
2008-02-06 16:50:43 +00:00
|
|
|
{
|
2010-09-01 17:08:10 -05:00
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
2009-06-11 00:39:12 -04:00
|
|
|
GSList *iter;
|
2008-02-06 16:50:43 +00:00
|
|
|
|
2009-12-23 00:03:45 -08:00
|
|
|
/* Do nothing for radio types not yet implemented */
|
|
|
|
|
if (!rstate->prop)
|
|
|
|
|
return;
|
|
|
|
|
|
2010-09-01 17:08:10 -05:00
|
|
|
g_object_notify (G_OBJECT (self), rstate->prop);
|
2009-11-02 17:29:53 -08:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
/* Don't touch devices if asleep/networking disabled */
|
2010-09-01 17:08:10 -05:00
|
|
|
if (manager_sleeping (self))
|
2009-06-11 00:39:12 -04:00
|
|
|
return;
|
2007-09-03 01:12:23 +00:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
/* enable/disable wireless devices as required */
|
|
|
|
|
for (iter = priv->devices; iter; iter = iter->next) {
|
2010-03-25 11:36:19 -07:00
|
|
|
RfKillType devtype = RFKILL_TYPE_UNKNOWN;
|
2010-09-01 17:08:10 -05:00
|
|
|
gboolean enabled = radio_enabled_for_rstate (rstate);
|
2010-03-25 11:36:19 -07:00
|
|
|
|
|
|
|
|
g_object_get (G_OBJECT (iter->data), NM_DEVICE_INTERFACE_RFKILL_TYPE, &devtype, NULL);
|
2010-04-07 14:55:43 -07:00
|
|
|
if (devtype == rstate->rtype) {
|
|
|
|
|
nm_log_dbg (LOGD_RFKILL, "(%s): setting radio %s",
|
|
|
|
|
nm_device_get_iface (NM_DEVICE (iter->data)),
|
|
|
|
|
enabled ? "enabled" : "disabled");
|
2009-12-22 23:36:57 -08:00
|
|
|
nm_device_interface_set_enabled (NM_DEVICE_INTERFACE (iter->data), enabled);
|
2010-04-07 14:55:43 -07:00
|
|
|
}
|
2008-02-06 16:50:43 +00:00
|
|
|
}
|
2007-09-03 01:12:23 +00:00
|
|
|
}
|
|
|
|
|
|
2008-05-22 14:22:31 +00:00
|
|
|
static void
|
2009-06-11 00:39:12 -04:00
|
|
|
manager_hidden_ap_found (NMDeviceInterface *device,
|
|
|
|
|
NMAccessPoint *ap,
|
|
|
|
|
gpointer user_data)
|
2008-05-22 14:22:31 +00:00
|
|
|
{
|
2009-06-11 00:39:12 -04:00
|
|
|
NMManager *manager = NM_MANAGER (user_data);
|
2010-10-27 15:47:10 -05:00
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
|
2009-06-11 00:39:12 -04:00
|
|
|
const struct ether_addr *ap_addr;
|
|
|
|
|
const GByteArray *ap_ssid;
|
|
|
|
|
GSList *iter;
|
|
|
|
|
GSList *connections;
|
|
|
|
|
gboolean done = FALSE;
|
2008-05-22 14:22:31 +00:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
ap_ssid = nm_ap_get_ssid (ap);
|
|
|
|
|
if (ap_ssid && ap_ssid->len)
|
|
|
|
|
return;
|
2008-05-22 14:22:31 +00:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
ap_addr = nm_ap_get_address (ap);
|
|
|
|
|
g_assert (ap_addr);
|
2009-03-31 13:10:00 -04:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
/* Look for this AP's BSSID in the seen-bssids list of a connection,
|
|
|
|
|
* and if a match is found, copy over the SSID */
|
2010-10-27 20:05:23 -05:00
|
|
|
connections = nm_settings_get_connections (priv->settings);
|
2008-05-22 14:22:31 +00:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
for (iter = connections; iter && !done; iter = g_slist_next (iter)) {
|
|
|
|
|
NMConnection *connection = NM_CONNECTION (iter->data);
|
|
|
|
|
NMSettingWireless *s_wireless;
|
|
|
|
|
const GByteArray *ssid;
|
|
|
|
|
guint32 num_bssids;
|
|
|
|
|
guint32 i;
|
2008-10-28 19:26:00 +00:00
|
|
|
|
2007-11-07 16:06:43 +00:00
|
|
|
s_wireless = (NMSettingWireless *) nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRELESS);
|
2008-10-28 19:26:00 +00:00
|
|
|
if (!s_wireless)
|
2010-11-17 17:42:22 -06:00
|
|
|
continue;
|
2008-10-28 19:26:00 +00:00
|
|
|
|
|
|
|
|
num_bssids = nm_setting_wireless_get_num_seen_bssids (s_wireless);
|
|
|
|
|
if (num_bssids < 1)
|
2010-11-17 17:42:22 -06:00
|
|
|
continue;
|
2007-10-08 15:09:33 +00:00
|
|
|
|
2008-10-28 19:26:00 +00:00
|
|
|
ssid = nm_setting_wireless_get_ssid (s_wireless);
|
|
|
|
|
g_assert (ssid);
|
|
|
|
|
|
2010-11-17 17:42:22 -06:00
|
|
|
for (i = 0; i < num_bssids && !done; i++) {
|
2008-10-28 19:26:00 +00:00
|
|
|
const char *seen_bssid = nm_setting_wireless_get_seen_bssid (s_wireless, i);
|
2007-10-08 15:09:33 +00:00
|
|
|
struct ether_addr seen_addr;
|
|
|
|
|
|
2010-11-17 17:42:22 -06:00
|
|
|
if (ether_aton_r (seen_bssid, &seen_addr)) {
|
|
|
|
|
if (memcmp (ap_addr, &seen_addr, sizeof (struct ether_addr))) {
|
|
|
|
|
/* Copy the SSID from the connection to the AP */
|
|
|
|
|
nm_ap_set_ssid (ap, ssid);
|
|
|
|
|
done = TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
2007-10-08 15:09:33 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
g_slist_free (connections);
|
|
|
|
|
}
|
|
|
|
|
|
2009-11-24 10:43:43 -08:00
|
|
|
static RfKillState
|
|
|
|
|
nm_manager_get_ipw_rfkill_state (NMManager *self)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
GSList *iter;
|
|
|
|
|
RfKillState ipw_state = RFKILL_UNBLOCKED;
|
|
|
|
|
|
|
|
|
|
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
|
|
|
|
|
NMDevice *candidate = NM_DEVICE (iter->data);
|
|
|
|
|
RfKillState candidate_state;
|
|
|
|
|
|
|
|
|
|
if (NM_IS_DEVICE_WIFI (candidate)) {
|
|
|
|
|
candidate_state = nm_device_wifi_get_ipw_rfkill_state (NM_DEVICE_WIFI (candidate));
|
|
|
|
|
|
|
|
|
|
if (candidate_state > ipw_state)
|
|
|
|
|
ipw_state = candidate_state;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ipw_state;
|
|
|
|
|
}
|
|
|
|
|
|
2009-12-23 00:18:18 -08:00
|
|
|
static RfKillState
|
|
|
|
|
nm_manager_get_modem_enabled_state (NMManager *self)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
GSList *iter;
|
|
|
|
|
RfKillState wwan_state = RFKILL_UNBLOCKED;
|
|
|
|
|
|
|
|
|
|
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
|
|
|
|
|
NMDevice *candidate = NM_DEVICE (iter->data);
|
|
|
|
|
RfKillState candidate_state = RFKILL_UNBLOCKED;
|
2010-03-25 12:18:26 -07:00
|
|
|
RfKillType devtype = RFKILL_TYPE_UNKNOWN;
|
2009-12-23 00:18:18 -08:00
|
|
|
|
2010-03-25 12:18:26 -07:00
|
|
|
g_object_get (G_OBJECT (candidate), NM_DEVICE_INTERFACE_RFKILL_TYPE, &devtype, NULL);
|
|
|
|
|
if (devtype == RFKILL_TYPE_WWAN) {
|
|
|
|
|
if (!nm_device_interface_get_enabled (NM_DEVICE_INTERFACE (candidate)))
|
2009-12-23 00:18:18 -08:00
|
|
|
candidate_state = RFKILL_SOFT_BLOCKED;
|
|
|
|
|
|
|
|
|
|
if (candidate_state > wwan_state)
|
|
|
|
|
wwan_state = candidate_state;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return wwan_state;
|
|
|
|
|
}
|
|
|
|
|
|
2010-09-01 17:08:10 -05:00
|
|
|
static void
|
|
|
|
|
update_rstate_from_rfkill (RadioState *rstate, RfKillState rfkill)
|
|
|
|
|
{
|
|
|
|
|
if (rfkill == RFKILL_UNBLOCKED) {
|
|
|
|
|
rstate->sw_enabled = TRUE;
|
|
|
|
|
rstate->hw_enabled = TRUE;
|
|
|
|
|
} else if (rfkill == RFKILL_SOFT_BLOCKED) {
|
|
|
|
|
rstate->sw_enabled = FALSE;
|
|
|
|
|
rstate->hw_enabled = TRUE;
|
|
|
|
|
} else if (rfkill == RFKILL_HARD_BLOCKED) {
|
|
|
|
|
rstate->sw_enabled = FALSE;
|
|
|
|
|
rstate->hw_enabled = FALSE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2009-11-24 10:43:43 -08:00
|
|
|
static void
|
2009-12-23 00:03:45 -08:00
|
|
|
manager_rfkill_update_one_type (NMManager *self,
|
|
|
|
|
RadioState *rstate,
|
|
|
|
|
RfKillType rtype)
|
2009-11-24 10:43:43 -08:00
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
2009-12-23 00:03:45 -08:00
|
|
|
RfKillState udev_state = RFKILL_UNBLOCKED;
|
|
|
|
|
RfKillState other_state = RFKILL_UNBLOCKED;
|
|
|
|
|
RfKillState composite;
|
2010-09-01 17:08:10 -05:00
|
|
|
gboolean old_enabled, new_enabled, old_rfkilled, new_rfkilled;
|
|
|
|
|
gboolean old_hwe;
|
|
|
|
|
|
|
|
|
|
old_enabled = radio_enabled_for_rstate (rstate);
|
|
|
|
|
old_rfkilled = rstate->hw_enabled && rstate->sw_enabled;
|
|
|
|
|
old_hwe = rstate->hw_enabled;
|
2009-11-24 10:43:43 -08:00
|
|
|
|
2010-03-23 17:54:16 -07:00
|
|
|
udev_state = nm_udev_manager_get_rfkill_state (priv->udev_mgr, rtype);
|
2009-11-24 10:43:43 -08:00
|
|
|
|
2009-12-23 00:03:45 -08:00
|
|
|
if (rstate->other_enabled_func)
|
|
|
|
|
other_state = rstate->other_enabled_func (self);
|
2009-11-24 10:43:43 -08:00
|
|
|
|
2009-12-23 00:03:45 -08:00
|
|
|
/* The composite state is the "worst" of either udev or other states */
|
|
|
|
|
if (udev_state == RFKILL_HARD_BLOCKED || other_state == RFKILL_HARD_BLOCKED)
|
2009-11-24 10:43:43 -08:00
|
|
|
composite = RFKILL_HARD_BLOCKED;
|
2009-12-23 00:03:45 -08:00
|
|
|
else if (udev_state == RFKILL_SOFT_BLOCKED || other_state == RFKILL_SOFT_BLOCKED)
|
2009-11-24 10:43:43 -08:00
|
|
|
composite = RFKILL_SOFT_BLOCKED;
|
|
|
|
|
else
|
|
|
|
|
composite = RFKILL_UNBLOCKED;
|
|
|
|
|
|
2010-09-01 17:08:10 -05:00
|
|
|
update_rstate_from_rfkill (rstate, composite);
|
2009-11-24 10:43:43 -08:00
|
|
|
|
2010-04-08 18:23:43 -07:00
|
|
|
if (rstate->desc) {
|
2010-09-01 17:08:10 -05:00
|
|
|
nm_log_dbg (LOGD_RFKILL, "%s hw-enabled %d sw-enabled %d",
|
|
|
|
|
rstate->desc, rstate->hw_enabled, rstate->sw_enabled);
|
2010-04-08 18:23:43 -07:00
|
|
|
}
|
|
|
|
|
|
2010-09-01 17:08:10 -05:00
|
|
|
/* Log new killswitch state */
|
|
|
|
|
new_rfkilled = rstate->hw_enabled && rstate->sw_enabled;
|
|
|
|
|
if (old_rfkilled != new_rfkilled) {
|
2010-04-06 16:20:11 -07:00
|
|
|
nm_log_info (LOGD_RFKILL, "%s now %s by radio killswitch",
|
|
|
|
|
rstate->desc,
|
2010-09-01 17:08:10 -05:00
|
|
|
new_rfkilled ? "enabled" : "disabled");
|
|
|
|
|
}
|
2009-12-23 00:03:45 -08:00
|
|
|
|
2010-09-01 17:08:10 -05:00
|
|
|
/* Send out property changed signal for HW enabled */
|
|
|
|
|
if (rstate->hw_enabled != old_hwe) {
|
2010-04-08 18:23:43 -07:00
|
|
|
if (rstate->hw_prop)
|
|
|
|
|
g_object_notify (G_OBJECT (self), rstate->hw_prop);
|
2009-11-24 10:43:43 -08:00
|
|
|
}
|
2010-09-01 17:08:10 -05:00
|
|
|
|
|
|
|
|
/* And finally update the actual device radio state itself */
|
|
|
|
|
new_enabled = radio_enabled_for_rstate (rstate);
|
|
|
|
|
if (new_enabled != old_enabled)
|
|
|
|
|
manager_update_radio_enabled (self, rstate);
|
2009-12-23 00:03:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
nm_manager_rfkill_update (NMManager *self, RfKillType rtype)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
guint i;
|
|
|
|
|
|
|
|
|
|
if (rtype != RFKILL_TYPE_UNKNOWN) {
|
|
|
|
|
manager_rfkill_update_one_type (self, &priv->radio_states[rtype], rtype);
|
|
|
|
|
return;
|
2009-11-24 10:43:43 -08:00
|
|
|
}
|
2009-12-23 00:03:45 -08:00
|
|
|
|
|
|
|
|
/* Otherwise sync all radio types */
|
|
|
|
|
for (i = 0; i < RFKILL_TYPE_MAX; i++)
|
|
|
|
|
manager_rfkill_update_one_type (self, &priv->radio_states[i], i);
|
2009-11-24 10:43:43 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
manager_ipw_rfkill_state_changed (NMDeviceWifi *device,
|
|
|
|
|
GParamSpec *pspec,
|
|
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
2009-12-23 00:03:45 -08:00
|
|
|
nm_manager_rfkill_update (NM_MANAGER (user_data), RFKILL_TYPE_WLAN);
|
2009-11-24 10:43:43 -08:00
|
|
|
}
|
|
|
|
|
|
2009-12-23 00:18:18 -08:00
|
|
|
static void
|
2010-05-24 17:07:46 -07:00
|
|
|
manager_modem_enabled_changed (NMModem *device, gpointer user_data)
|
2009-12-23 00:18:18 -08:00
|
|
|
{
|
|
|
|
|
nm_manager_rfkill_update (NM_MANAGER (user_data), RFKILL_TYPE_WWAN);
|
2009-11-24 10:43:43 -08:00
|
|
|
}
|
|
|
|
|
|
2010-06-04 00:42:10 -07:00
|
|
|
static GError *
|
|
|
|
|
deactivate_disconnect_check_error (GError *auth_error,
|
|
|
|
|
NMAuthCallResult result,
|
|
|
|
|
const char *detail)
|
|
|
|
|
{
|
|
|
|
|
if (auth_error) {
|
|
|
|
|
nm_log_dbg (LOGD_CORE, "%s request failed: %s", detail, auth_error->message);
|
|
|
|
|
return g_error_new (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_PERMISSION_DENIED,
|
|
|
|
|
"%s request failed: %s",
|
|
|
|
|
detail, auth_error->message);
|
|
|
|
|
} else if (result != NM_AUTH_CALL_RESULT_YES) {
|
|
|
|
|
return g_error_new (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_PERMISSION_DENIED,
|
2010-07-13 18:09:56 -04:00
|
|
|
"Not authorized to %s connections",
|
2010-06-04 00:42:10 -07:00
|
|
|
detail);
|
|
|
|
|
}
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
disconnect_net_auth_done_cb (NMAuthChain *chain,
|
2010-11-17 17:02:21 -06:00
|
|
|
GError *auth_error,
|
2010-06-04 00:42:10 -07:00
|
|
|
DBusGMethodInvocation *context,
|
|
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMManager *self = NM_MANAGER (user_data);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
2010-11-17 17:02:21 -06:00
|
|
|
GError *error = NULL;
|
2010-06-04 00:42:10 -07:00
|
|
|
NMAuthCallResult result;
|
|
|
|
|
NMDevice *device;
|
|
|
|
|
|
|
|
|
|
priv->auth_chains = g_slist_remove (priv->auth_chains, chain);
|
|
|
|
|
|
|
|
|
|
result = GPOINTER_TO_UINT (nm_auth_chain_get_data (chain, NM_AUTH_PERMISSION_NETWORK_CONTROL));
|
2010-11-17 17:02:21 -06:00
|
|
|
error = deactivate_disconnect_check_error (auth_error, result, "Disconnect");
|
|
|
|
|
if (!error) {
|
|
|
|
|
device = nm_auth_chain_get_data (chain, "device");
|
|
|
|
|
if (!nm_device_interface_disconnect (NM_DEVICE_INTERFACE (device), &error))
|
|
|
|
|
g_assert (error);
|
2010-06-04 00:42:10 -07:00
|
|
|
}
|
|
|
|
|
|
2010-11-17 17:02:21 -06:00
|
|
|
if (error)
|
|
|
|
|
dbus_g_method_return_error (context, error);
|
|
|
|
|
else
|
2010-07-13 18:09:56 -04:00
|
|
|
dbus_g_method_return (context);
|
2010-06-04 00:42:10 -07:00
|
|
|
|
2010-11-17 17:02:21 -06:00
|
|
|
g_clear_error (&error);
|
2010-06-04 00:42:10 -07:00
|
|
|
nm_auth_chain_unref (chain);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
manager_device_disconnect_request (NMDevice *device,
|
|
|
|
|
DBusGMethodInvocation *context,
|
|
|
|
|
NMManager *self)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
NMActRequest *req;
|
|
|
|
|
GError *error = NULL;
|
|
|
|
|
gulong sender_uid = G_MAXULONG;
|
2010-11-18 13:47:04 -06:00
|
|
|
char *error_desc = NULL;
|
2010-06-04 00:42:10 -07:00
|
|
|
|
|
|
|
|
req = nm_device_get_act_request (device);
|
|
|
|
|
if (!req) {
|
|
|
|
|
error = g_error_new_literal (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_UNKNOWN_CONNECTION,
|
|
|
|
|
"This device is not active");
|
|
|
|
|
dbus_g_method_return_error (context, error);
|
|
|
|
|
g_error_free (error);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Need to check the caller's permissions and stuff before we can
|
|
|
|
|
* deactivate the connection.
|
|
|
|
|
*/
|
2010-07-13 18:09:56 -04:00
|
|
|
if (!nm_auth_get_caller_uid (context,
|
|
|
|
|
priv->dbus_mgr,
|
|
|
|
|
&sender_uid,
|
|
|
|
|
&error_desc)) {
|
2010-06-04 00:42:10 -07:00
|
|
|
error = g_error_new_literal (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_PERMISSION_DENIED,
|
|
|
|
|
error_desc);
|
|
|
|
|
dbus_g_method_return_error (context, error);
|
|
|
|
|
g_error_free (error);
|
2010-11-18 13:47:04 -06:00
|
|
|
g_free (error_desc);
|
2010-06-04 00:42:10 -07:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Yay for root */
|
|
|
|
|
if (0 == sender_uid) {
|
|
|
|
|
if (!nm_device_interface_disconnect (NM_DEVICE_INTERFACE (device), &error)) {
|
|
|
|
|
dbus_g_method_return_error (context, error);
|
|
|
|
|
g_clear_error (&error);
|
|
|
|
|
} else
|
|
|
|
|
dbus_g_method_return (context);
|
|
|
|
|
} else {
|
|
|
|
|
NMAuthChain *chain;
|
|
|
|
|
|
|
|
|
|
/* Otherwise validate the user request */
|
|
|
|
|
chain = nm_auth_chain_new (priv->authority, context, NULL, disconnect_net_auth_done_cb, self);
|
|
|
|
|
g_assert (chain);
|
|
|
|
|
priv->auth_chains = g_slist_append (priv->auth_chains, chain);
|
|
|
|
|
|
|
|
|
|
nm_auth_chain_set_data (chain, "device", g_object_ref (device), g_object_unref);
|
|
|
|
|
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_NETWORK_CONTROL, TRUE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2008-04-29 Dan Williams <dcbw@redhat.com>
Handle HAL dropouts better; allow NM to start up even if HAL isn't up yet.
* marshallers/nm-marshal.list
- Add marshaller
* src/NetworkManager.c
- (main): let the NMManager handle the NMHalManager
* src/nm-hal-manager.c
src/nm-hal-manager.h
- convert to a GObject, and emit singals when stuff changes. Let the
NMManager handle the signals, instead of the NMHalManager calling
into the NMManager.
* src/nm-manager.c
src/nm-manager.h
- (remove_one_device): consolidate device removals here
- (dispose): use remove_one_device()
- (nm_manager_get_device_by_udi): make static
- (deferred_hal_manager_query_devices): idle handler to query the HAL
manager for devices at startup or wakeup time
- (nm_manager_new): create and monitor the HAL manager
- (hal_manager_udi_added_cb): new function; do what
nm_manager_add_device() used to do when signalled by the hal manager
- (hal_manager_udi_removed_cb): new function; do what
nm_manager_remove_device() used to do when signalled by the hal
manager
- (hal_manager_rfkill_changed_cb): handle rfkill changes from the
hal manager
- (hal_manager_hal_reappeared_cb): when HAL comes back, remove devices
in our device list that aren't known to HAL
- (impl_manager_sleep): on wakeup, re-add devices from an idle handler;
see comments on nm-hal-manager.c::nm_manager_state_changed() a few
commits ago
- (nm_manager_get_device_by_path, nm_manager_is_udi_managed,
nm_manager_activation_pending, nm_manager_wireless_enabled,
nm_manager_wireless_hardware_enabled,
nm_manager_set_wireless_hardware_enabled): remove, unused
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3619 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-29 23:03:00 +00:00
|
|
|
static void
|
2009-02-16 18:47:03 -05:00
|
|
|
add_device (NMManager *self, NMDevice *device)
|
2007-02-08 15:34:26 +00:00
|
|
|
{
|
2008-04-29 Dan Williams <dcbw@redhat.com>
Handle HAL dropouts better; allow NM to start up even if HAL isn't up yet.
* marshallers/nm-marshal.list
- Add marshaller
* src/NetworkManager.c
- (main): let the NMManager handle the NMHalManager
* src/nm-hal-manager.c
src/nm-hal-manager.h
- convert to a GObject, and emit singals when stuff changes. Let the
NMManager handle the signals, instead of the NMHalManager calling
into the NMManager.
* src/nm-manager.c
src/nm-manager.h
- (remove_one_device): consolidate device removals here
- (dispose): use remove_one_device()
- (nm_manager_get_device_by_udi): make static
- (deferred_hal_manager_query_devices): idle handler to query the HAL
manager for devices at startup or wakeup time
- (nm_manager_new): create and monitor the HAL manager
- (hal_manager_udi_added_cb): new function; do what
nm_manager_add_device() used to do when signalled by the hal manager
- (hal_manager_udi_removed_cb): new function; do what
nm_manager_remove_device() used to do when signalled by the hal
manager
- (hal_manager_rfkill_changed_cb): handle rfkill changes from the
hal manager
- (hal_manager_hal_reappeared_cb): when HAL comes back, remove devices
in our device list that aren't known to HAL
- (impl_manager_sleep): on wakeup, re-add devices from an idle handler;
see comments on nm-hal-manager.c::nm_manager_state_changed() a few
commits ago
- (nm_manager_get_device_by_path, nm_manager_is_udi_managed,
nm_manager_activation_pending, nm_manager_wireless_enabled,
nm_manager_wireless_hardware_enabled,
nm_manager_set_wireless_hardware_enabled): remove, unused
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3619 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-29 23:03:00 +00:00
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
2009-07-07 14:24:12 -04:00
|
|
|
const char *iface, *driver, *type_desc;
|
2009-06-11 00:39:12 -04:00
|
|
|
char *path;
|
|
|
|
|
static guint32 devcount = 0;
|
|
|
|
|
const GSList *unmanaged_specs;
|
2009-08-06 15:15:46 -04:00
|
|
|
NMConnection *existing = NULL;
|
2010-09-01 17:08:10 -05:00
|
|
|
gboolean managed = FALSE, enabled = FALSE;
|
2007-02-08 15:34:26 +00:00
|
|
|
|
2009-09-04 16:55:48 +02:00
|
|
|
iface = nm_device_get_ip_iface (device);
|
|
|
|
|
g_assert (iface);
|
|
|
|
|
|
2010-03-25 12:18:26 -07:00
|
|
|
if (!NM_IS_DEVICE_MODEM (device) && find_device_by_iface (self, iface)) {
|
2009-09-04 16:55:48 +02:00
|
|
|
g_object_unref (device);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2009-10-04 23:36:06 -07:00
|
|
|
priv->devices = g_slist_append (priv->devices, device);
|
|
|
|
|
|
2007-02-08 15:34:26 +00:00
|
|
|
g_signal_connect (device, "state-changed",
|
2009-02-16 18:47:03 -05:00
|
|
|
G_CALLBACK (manager_device_state_changed),
|
|
|
|
|
self);
|
2007-03-02 Tambet Ingo <tambet@ximian.com>
* libnm-glib/nm-device-802-11-wireless.c: Cache networks (bssids) list.
We get signalled when it changes.
* libnm-glib/nm-client.c: Cache NMState and device list, we get signalled
when it changes.
* libnm-glib/nm-device.c: Cache the device state property.
* libnm-glib/nm-access-point.c: Cache the strength property.
* src/nm-device-802-11-wireless.c: Fix wireless device scanning scheduler.
The new algorithm is to start from SCAN_INTERVAL_MIN (currently defined as 0)
and add a SCAN_INTERVAL_STEP (currently 20 seconds) with each successful scan
until SCAN_INTERVAL_MAX (currently 120 seconds) is reached. Do not scan while
the device is down, activating, or activated (in case of A/B/G cards).
Remove some old dead ifdef'ed out code that used to configure wireless devices,
it's all done through supplicant now.
* src/supplicant-manager/nm-supplicant-interface.c: Fix the reference
counting issues with pending calls which caused leaks and crashes when
interface was removed (now that the interface actually gets removed).
* src/nm-call-store.c: Make a copy of data before running a foreach
with user callback on it - The most common usage pattern is to cancel
(and thus remove) all pending calls with foreach which would modify
the hash table we're iterating over.
* src/nm-manager.c: When a device is added, make sure it is "up". When
it's removed or disabled due to disabling wireless or networking, bring
it down.
* include/NetworkManager.h: Add new device state NM_DEVICE_STATE_DOWN.
* src/nm-device-802-11-wireless.c:
* src/nm-device-802-3-ethernet.c:
* src/nm-device.c:
- Remove "init" virtual function, all gobjects have a place for that
already (constructor).
- Replace "start" virtual function with "bring_up", devices can be
brought up and down more than just on startup now.
- Add "is_up" virtual function.
- Implement one way to bring a device down instead of previous 4 different
ways, each of witch did something different.
* src/NetworkManagerUtils.c (nm_dev_sock_open): This doesn't need an NMDevice,
all it needs is the device interface.
Get rid of NMData.dev_list (3 members to go).
Get rif of NMData in a lot of places.
* gnome/libnm_glib/libnm_glib.c: Make it compile again.
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@2395 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2007-03-02 09:30:48 +00:00
|
|
|
|
2010-06-04 00:42:10 -07:00
|
|
|
g_signal_connect (device, NM_DEVICE_INTERFACE_DISCONNECT_REQUEST,
|
|
|
|
|
G_CALLBACK (manager_device_disconnect_request),
|
|
|
|
|
self);
|
|
|
|
|
|
2008-06-10 16:32:39 +00:00
|
|
|
if (NM_IS_DEVICE_WIFI (device)) {
|
2009-11-24 10:43:43 -08:00
|
|
|
/* Attach to the access-point-added signal so that the manager can fill
|
|
|
|
|
* non-SSID-broadcasting APs with an SSID.
|
|
|
|
|
*/
|
2007-10-08 15:09:33 +00:00
|
|
|
g_signal_connect (device, "hidden-ap-found",
|
2009-02-16 18:47:03 -05:00
|
|
|
G_CALLBACK (manager_hidden_ap_found),
|
|
|
|
|
self);
|
2007-10-08 15:09:33 +00:00
|
|
|
|
2009-11-24 10:43:43 -08:00
|
|
|
/* Hook up rfkill handling for ipw-based cards until they get converted
|
|
|
|
|
* to use the kernel's rfkill subsystem in 2.6.33.
|
|
|
|
|
*/
|
|
|
|
|
g_signal_connect (device, "notify::" NM_DEVICE_WIFI_IPW_RFKILL_STATE,
|
|
|
|
|
G_CALLBACK (manager_ipw_rfkill_state_changed),
|
|
|
|
|
self);
|
|
|
|
|
|
|
|
|
|
/* Update global rfkill state with this device's rfkill state, and
|
|
|
|
|
* then set this device's rfkill state based on the global state.
|
|
|
|
|
*/
|
2009-12-23 00:03:45 -08:00
|
|
|
nm_manager_rfkill_update (self, RFKILL_TYPE_WLAN);
|
2010-09-01 17:08:10 -05:00
|
|
|
enabled = radio_enabled_for_type (self, RFKILL_TYPE_WLAN);
|
|
|
|
|
nm_device_interface_set_enabled (NM_DEVICE_INTERFACE (device), enabled);
|
2010-03-25 12:18:26 -07:00
|
|
|
} else if (NM_IS_DEVICE_MODEM (device)) {
|
2010-05-24 17:07:46 -07:00
|
|
|
g_signal_connect (device, NM_DEVICE_MODEM_ENABLE_CHANGED,
|
2009-12-23 00:18:18 -08:00
|
|
|
G_CALLBACK (manager_modem_enabled_changed),
|
|
|
|
|
self);
|
|
|
|
|
|
|
|
|
|
nm_manager_rfkill_update (self, RFKILL_TYPE_WWAN);
|
2010-09-01 17:08:10 -05:00
|
|
|
enabled = radio_enabled_for_type (self, RFKILL_TYPE_WWAN);
|
2009-12-23 00:18:18 -08:00
|
|
|
/* Until we start respecting WWAN rfkill switches the modem itself
|
|
|
|
|
* is the source of the enabled/disabled state, so the manager shouldn't
|
|
|
|
|
* touch it here.
|
|
|
|
|
nm_device_interface_set_enabled (NM_DEVICE_INTERFACE (device),
|
|
|
|
|
priv->radio_states[RFKILL_TYPE_WWAN].enabled);
|
|
|
|
|
*/
|
2007-03-02 Tambet Ingo <tambet@ximian.com>
* libnm-glib/nm-device-802-11-wireless.c: Cache networks (bssids) list.
We get signalled when it changes.
* libnm-glib/nm-client.c: Cache NMState and device list, we get signalled
when it changes.
* libnm-glib/nm-device.c: Cache the device state property.
* libnm-glib/nm-access-point.c: Cache the strength property.
* src/nm-device-802-11-wireless.c: Fix wireless device scanning scheduler.
The new algorithm is to start from SCAN_INTERVAL_MIN (currently defined as 0)
and add a SCAN_INTERVAL_STEP (currently 20 seconds) with each successful scan
until SCAN_INTERVAL_MAX (currently 120 seconds) is reached. Do not scan while
the device is down, activating, or activated (in case of A/B/G cards).
Remove some old dead ifdef'ed out code that used to configure wireless devices,
it's all done through supplicant now.
* src/supplicant-manager/nm-supplicant-interface.c: Fix the reference
counting issues with pending calls which caused leaks and crashes when
interface was removed (now that the interface actually gets removed).
* src/nm-call-store.c: Make a copy of data before running a foreach
with user callback on it - The most common usage pattern is to cancel
(and thus remove) all pending calls with foreach which would modify
the hash table we're iterating over.
* src/nm-manager.c: When a device is added, make sure it is "up". When
it's removed or disabled due to disabling wireless or networking, bring
it down.
* include/NetworkManager.h: Add new device state NM_DEVICE_STATE_DOWN.
* src/nm-device-802-11-wireless.c:
* src/nm-device-802-3-ethernet.c:
* src/nm-device.c:
- Remove "init" virtual function, all gobjects have a place for that
already (constructor).
- Replace "start" virtual function with "bring_up", devices can be
brought up and down more than just on startup now.
- Add "is_up" virtual function.
- Implement one way to bring a device down instead of previous 4 different
ways, each of witch did something different.
* src/NetworkManagerUtils.c (nm_dev_sock_open): This doesn't need an NMDevice,
all it needs is the device interface.
Get rid of NMData.dev_list (3 members to go).
Get rif of NMData in a lot of places.
* gnome/libnm_glib/libnm_glib.c: Make it compile again.
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@2395 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2007-03-02 09:30:48 +00:00
|
|
|
}
|
|
|
|
|
|
2009-07-07 14:24:12 -04:00
|
|
|
type_desc = nm_device_get_type_desc (device);
|
|
|
|
|
g_assert (type_desc);
|
|
|
|
|
driver = nm_device_get_driver (device);
|
2009-02-18 14:21:02 -05:00
|
|
|
if (!driver)
|
|
|
|
|
driver = "unknown";
|
2010-04-21 14:58:25 -07:00
|
|
|
nm_log_info (LOGD_HW, "(%s): new %s device (driver: '%s' ifindex: %d)",
|
|
|
|
|
iface, type_desc, driver, nm_device_get_ifindex (device));
|
2008-04-07 Dan Williams <dcbw@redhat.com>
* include/NetworkManager.h
- Remove the DOWN and CANCELLED device states
- Add UNMANAGED and UNAVAILABLE device states
- Document the device states
* introspection/nm-device.xml
src/nm-device-interface.c
src/nm-device-interface.h
- Add the 'managed' property
* test/nm-tool.c
- (detail_device): print out device state
* src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerMandriva.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerSuSE.c
- (nm_system_device_get_system_config, nm_system_device_get_disabled
nm_system_device_free_system_config): remove; they were unused and
their functionality should be re-implemented in each distro's
system settings service plugin
* src/nm-gsm-device.c
src/nm-gsm-device.h
src/nm-cdma-device.c
src/nm-cdma-device.h
- (*_new): take the 'managed' argument
* src/nm-device.c
- (nm_device_set_address): remove, fold into nm_device_bring_up()
- (nm_device_init): start in unmanaged state, not disconnected
- (constructor): don't start device until the system settings service
has had a chance to figure out if the device is managed or not
- (nm_device_deactivate, nm_device_bring_up, nm_device_bring_down):
don't set device state here, let callers handle that as appropriate
- (nm_device_dispose): don't touch the device if it's not managed
- (set_property, get_property, nm_device_class_init): implement the
'managed' property
- (nm_device_state_changed): bring the device up if its now managed,
and deactivate it if it used to be active
- (nm_device_get_managed, nm_device_set_managed): do the right thing
with the managed state
* src/nm-hal-manager.c
- (wired_device_creator, wireless_device_creator, modem_device_creator):
take initial managed state and pass it along to device constructors
- (create_device_and_add_to_list): get managed state and pass to
type creators
* src/nm-device-802-11-wireless.c
- (real_can_activate): fold in most of
nm_device_802_11_wireless_can_activate()
- (can_scan): can't scan in UNAVAILABLE or UNMANAGED
- (link_timeout_cb): instead of deactivating, change device state and
let the device state handler to it
- (real_update_hw_address): clean up
- (state_changed_cb): when entering UNAVAILABLE state, schedule an idle
handler to transition to DISCONNECTED if the device isn't rfkilled
* src/nm-device-802-3-ethernet.c
- (set_carrier): move above callers and get rid of prototype
- (device_state_changed): when entering UNAVAILABLE state, schedule an
idle handler to transition to DISCONNECTED if the device has a
carrier
- (real_update_hw_address): clean up
- (link_timeout_cb, ppp_state_changed): change state instead of calling
deactivation directly as deactivation doesn't change state anymore
* src/NetworkManagerPolicy.c
- (schedule_activate_check): yay, remove wireless_enabled hack since
the NMManager and wireless devices work that out themselves now
- (device_state_changed): change to a switch and update for new device
states
- (device_carrier_changed): remove; device handles this now through
state changes
- (device_added): don't care about carrier any more; the initial
activation check will happen when the device transitions to
DISCONNECTED
* src/nm-manager.c
- (dispose): clear unmanaged devices
- (handle_unmanaged_devices): update unmanaged device list and toggle
the managed property on each device when needed
- (system_settings_properties_changed_cb): handle signals from the
system settings service
- (system_settings_get_unmanaged_devices_cb): handle callback from
getting the unmanaged device list method call
- (query_unmanaged_devices): ask the system settings service for its
list of unmanaged devices
- (nm_manager_name_owner_changed, initial_get_connections): get unmanaged
devices
- (manager_set_wireless_enabled): push rfkill state down to wireless
devices directly and let them handle the necessary state transitions
- (manager_device_state_changed): update for new device states
- (nm_manager_add_device): set initial rfkill state on wireless devices
- (nm_manager_remove_device): don't touch the device if it's unmanaged
- (nm_manager_activate_connection): return error if the device is
unmanaged
- (nm_manager_sleep): handle new device states correctly; don't change
the state of unavailable/unmanaged devices
* libnm-glib/nm-device-802-11-wireless.c
- (state_changed_cb): update for new device states
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3540 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-08 02:58:02 +00:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
path = g_strdup_printf ("/org/freedesktop/NetworkManager/Devices/%d", devcount++);
|
|
|
|
|
nm_device_set_path (device, path);
|
2008-01-02 13:42:52 +00:00
|
|
|
dbus_g_connection_register_g_object (nm_dbus_manager_get_connection (priv->dbus_mgr),
|
2009-06-11 00:39:12 -04:00
|
|
|
path,
|
|
|
|
|
G_OBJECT (device));
|
2010-04-06 16:20:11 -07:00
|
|
|
nm_log_info (LOGD_CORE, "(%s): exported as %s", iface, path);
|
2009-06-11 00:39:12 -04:00
|
|
|
g_free (path);
|
|
|
|
|
|
2009-08-03 17:15:03 -04:00
|
|
|
/* Check if we should assume the device's active connection by matching its
|
|
|
|
|
* config with an existing system connection.
|
|
|
|
|
*/
|
2010-08-11 17:26:33 -05:00
|
|
|
if (nm_device_interface_can_assume_connections (NM_DEVICE_INTERFACE (device))) {
|
2009-08-05 18:03:09 -04:00
|
|
|
GSList *connections = NULL;
|
|
|
|
|
|
2010-10-27 20:05:23 -05:00
|
|
|
connections = nm_settings_get_connections (priv->settings);
|
2009-08-05 18:03:09 -04:00
|
|
|
existing = nm_device_interface_connection_match_config (NM_DEVICE_INTERFACE (device),
|
|
|
|
|
(const GSList *) connections);
|
|
|
|
|
g_slist_free (connections);
|
2010-04-07 14:55:43 -07:00
|
|
|
|
|
|
|
|
if (existing) {
|
|
|
|
|
NMSettingConnection *s_con;
|
|
|
|
|
|
|
|
|
|
s_con = (NMSettingConnection *) nm_connection_get_setting (existing, NM_TYPE_SETTING_CONNECTION);
|
|
|
|
|
nm_log_dbg (LOGD_DEVICE, "(%s): found existing device connection '%s'",
|
|
|
|
|
nm_device_get_iface (device),
|
|
|
|
|
nm_setting_connection_get_id (s_con));
|
|
|
|
|
}
|
2009-08-05 18:03:09 -04:00
|
|
|
}
|
2009-08-03 17:15:03 -04:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
/* Start the device if it's supposed to be managed */
|
2010-10-27 20:05:23 -05:00
|
|
|
unmanaged_specs = nm_settings_get_unmanaged_specs (priv->settings);
|
2010-05-22 08:55:30 -07:00
|
|
|
if ( !manager_sleeping (self)
|
2009-08-05 18:03:09 -04:00
|
|
|
&& !nm_device_interface_spec_match_list (NM_DEVICE_INTERFACE (device), unmanaged_specs)) {
|
|
|
|
|
nm_device_set_managed (device,
|
|
|
|
|
TRUE,
|
|
|
|
|
existing ? NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED :
|
|
|
|
|
NM_DEVICE_STATE_REASON_NOW_MANAGED);
|
2009-09-28 11:09:31 -07:00
|
|
|
managed = TRUE;
|
2009-08-05 18:03:09 -04:00
|
|
|
}
|
2008-01-02 13:42:52 +00:00
|
|
|
|
2010-10-27 20:05:23 -05:00
|
|
|
nm_settings_device_added (priv->settings, device);
|
2008-04-29 Dan Williams <dcbw@redhat.com>
Handle HAL dropouts better; allow NM to start up even if HAL isn't up yet.
* marshallers/nm-marshal.list
- Add marshaller
* src/NetworkManager.c
- (main): let the NMManager handle the NMHalManager
* src/nm-hal-manager.c
src/nm-hal-manager.h
- convert to a GObject, and emit singals when stuff changes. Let the
NMManager handle the signals, instead of the NMHalManager calling
into the NMManager.
* src/nm-manager.c
src/nm-manager.h
- (remove_one_device): consolidate device removals here
- (dispose): use remove_one_device()
- (nm_manager_get_device_by_udi): make static
- (deferred_hal_manager_query_devices): idle handler to query the HAL
manager for devices at startup or wakeup time
- (nm_manager_new): create and monitor the HAL manager
- (hal_manager_udi_added_cb): new function; do what
nm_manager_add_device() used to do when signalled by the hal manager
- (hal_manager_udi_removed_cb): new function; do what
nm_manager_remove_device() used to do when signalled by the hal
manager
- (hal_manager_rfkill_changed_cb): handle rfkill changes from the
hal manager
- (hal_manager_hal_reappeared_cb): when HAL comes back, remove devices
in our device list that aren't known to HAL
- (impl_manager_sleep): on wakeup, re-add devices from an idle handler;
see comments on nm-hal-manager.c::nm_manager_state_changed() a few
commits ago
- (nm_manager_get_device_by_path, nm_manager_is_udi_managed,
nm_manager_activation_pending, nm_manager_wireless_enabled,
nm_manager_wireless_hardware_enabled,
nm_manager_set_wireless_hardware_enabled): remove, unused
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3619 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-29 23:03:00 +00:00
|
|
|
g_signal_emit (self, signals[DEVICE_ADDED], 0, device);
|
2009-08-05 18:03:09 -04:00
|
|
|
|
|
|
|
|
/* If the device has a connection it can assume, do that now */
|
2009-09-28 11:09:31 -07:00
|
|
|
if (existing && managed && nm_device_is_available (device)) {
|
2009-08-05 18:03:09 -04:00
|
|
|
const char *ac_path;
|
|
|
|
|
GError *error = NULL;
|
|
|
|
|
|
2010-04-07 14:55:43 -07:00
|
|
|
nm_log_dbg (LOGD_DEVICE, "(%s): will attempt to assume existing connection",
|
|
|
|
|
nm_device_get_iface (device));
|
|
|
|
|
|
2009-08-05 18:03:09 -04:00
|
|
|
ac_path = internal_activate_device (self, device, existing, NULL, FALSE, TRUE, &error);
|
|
|
|
|
if (ac_path)
|
|
|
|
|
g_object_notify (G_OBJECT (self), NM_MANAGER_ACTIVE_CONNECTIONS);
|
|
|
|
|
else {
|
2010-07-13 18:09:56 -04:00
|
|
|
nm_log_warn (LOGD_DEVICE, "assumed connection %s failed to activate: (%d) %s",
|
2010-04-06 16:20:11 -07:00
|
|
|
nm_connection_get_path (existing),
|
|
|
|
|
error ? error->code : -1,
|
|
|
|
|
error && error->message ? error->message : "(unknown)");
|
2009-08-05 18:03:09 -04:00
|
|
|
g_error_free (error);
|
|
|
|
|
}
|
|
|
|
|
}
|
2007-02-08 15:34:26 +00:00
|
|
|
}
|
|
|
|
|
|
2009-05-19 15:20:20 -04:00
|
|
|
static gboolean
|
|
|
|
|
bdaddr_matches_connection (NMSettingBluetooth *s_bt, const char *bdaddr)
|
|
|
|
|
{
|
|
|
|
|
const GByteArray *arr;
|
|
|
|
|
gboolean ret = FALSE;
|
|
|
|
|
|
|
|
|
|
arr = nm_setting_bluetooth_get_bdaddr (s_bt);
|
|
|
|
|
|
|
|
|
|
if ( arr != NULL
|
|
|
|
|
&& arr->len == ETH_ALEN) {
|
|
|
|
|
char *str;
|
|
|
|
|
|
|
|
|
|
str = g_strdup_printf ("%02X:%02X:%02X:%02X:%02X:%02X",
|
|
|
|
|
arr->data[0],
|
|
|
|
|
arr->data[1],
|
|
|
|
|
arr->data[2],
|
|
|
|
|
arr->data[3],
|
|
|
|
|
arr->data[4],
|
|
|
|
|
arr->data[5]);
|
|
|
|
|
ret = g_str_equal (str, bdaddr);
|
|
|
|
|
g_free (str);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
2009-05-20 12:02:18 -04:00
|
|
|
static NMConnection *
|
|
|
|
|
bluez_manager_find_connection (NMManager *manager,
|
|
|
|
|
const char *bdaddr,
|
|
|
|
|
guint32 capabilities)
|
2009-05-14 13:59:03 -04:00
|
|
|
{
|
2010-10-27 15:47:10 -05:00
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
|
2009-05-20 12:02:18 -04:00
|
|
|
NMConnection *found = NULL;
|
2009-05-14 13:59:03 -04:00
|
|
|
GSList *connections, *l;
|
|
|
|
|
|
2010-10-27 20:05:23 -05:00
|
|
|
connections = nm_settings_get_connections (priv->settings);
|
2009-05-19 15:20:20 -04:00
|
|
|
|
2009-05-14 13:59:03 -04:00
|
|
|
for (l = connections; l != NULL; l = l->next) {
|
2009-05-20 12:02:18 -04:00
|
|
|
NMConnection *candidate = NM_CONNECTION (l->data);
|
2009-05-14 13:59:03 -04:00
|
|
|
NMSettingConnection *s_con;
|
|
|
|
|
NMSettingBluetooth *s_bt;
|
|
|
|
|
const char *con_type;
|
|
|
|
|
const char *bt_type;
|
|
|
|
|
|
2009-05-20 12:02:18 -04:00
|
|
|
s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (candidate, NM_TYPE_SETTING_CONNECTION));
|
2009-05-14 13:59:03 -04:00
|
|
|
g_assert (s_con);
|
|
|
|
|
con_type = nm_setting_connection_get_connection_type (s_con);
|
|
|
|
|
g_assert (con_type);
|
|
|
|
|
if (!g_str_equal (con_type, NM_SETTING_BLUETOOTH_SETTING_NAME))
|
|
|
|
|
continue;
|
|
|
|
|
|
2009-05-20 12:02:18 -04:00
|
|
|
s_bt = (NMSettingBluetooth *) nm_connection_get_setting (candidate, NM_TYPE_SETTING_BLUETOOTH);
|
2009-05-14 13:59:03 -04:00
|
|
|
if (!s_bt)
|
|
|
|
|
continue;
|
|
|
|
|
|
2009-05-19 15:20:20 -04:00
|
|
|
if (!bdaddr_matches_connection (s_bt, bdaddr))
|
2009-05-14 13:59:03 -04:00
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
bt_type = nm_setting_bluetooth_get_connection_type (s_bt);
|
|
|
|
|
if ( g_str_equal (bt_type, NM_SETTING_BLUETOOTH_TYPE_DUN)
|
2009-05-20 12:02:18 -04:00
|
|
|
&& !(capabilities & NM_BT_CAPABILITY_DUN))
|
2009-05-14 13:59:03 -04:00
|
|
|
continue;
|
|
|
|
|
if ( g_str_equal (bt_type, NM_SETTING_BLUETOOTH_TYPE_PANU)
|
2009-05-20 12:02:18 -04:00
|
|
|
&& !(capabilities & NM_BT_CAPABILITY_NAP))
|
2009-05-14 13:59:03 -04:00
|
|
|
continue;
|
|
|
|
|
|
2009-05-20 12:02:18 -04:00
|
|
|
found = candidate;
|
2009-05-14 13:59:03 -04:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g_slist_free (connections);
|
|
|
|
|
return found;
|
|
|
|
|
}
|
|
|
|
|
|
2009-05-20 12:02:18 -04:00
|
|
|
static void
|
|
|
|
|
bluez_manager_resync_devices (NMManager *self)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
2009-07-09 11:06:31 -04:00
|
|
|
GSList *iter, *gone = NULL, *keep = NULL;
|
2009-05-20 12:02:18 -04:00
|
|
|
|
|
|
|
|
/* Remove devices from the device list that don't have a corresponding connection */
|
|
|
|
|
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
|
|
|
|
|
NMDevice *candidate = NM_DEVICE (iter->data);
|
|
|
|
|
guint32 uuids;
|
|
|
|
|
const char *bdaddr;
|
|
|
|
|
|
|
|
|
|
if (NM_IS_DEVICE_BT (candidate)) {
|
|
|
|
|
uuids = nm_device_bt_get_capabilities (NM_DEVICE_BT (candidate));
|
|
|
|
|
bdaddr = nm_device_bt_get_hw_address (NM_DEVICE_BT (candidate));
|
|
|
|
|
|
|
|
|
|
if (bluez_manager_find_connection (self, bdaddr, uuids))
|
|
|
|
|
keep = g_slist_prepend (keep, candidate);
|
|
|
|
|
else
|
|
|
|
|
gone = g_slist_prepend (gone, candidate);
|
|
|
|
|
} else
|
|
|
|
|
keep = g_slist_prepend (keep, candidate);
|
|
|
|
|
}
|
|
|
|
|
|
2009-07-09 11:06:31 -04:00
|
|
|
/* Only touch the device list if anything actually changed */
|
|
|
|
|
if (g_slist_length (gone)) {
|
|
|
|
|
g_slist_free (priv->devices);
|
|
|
|
|
priv->devices = keep;
|
|
|
|
|
|
|
|
|
|
while (g_slist_length (gone))
|
2010-08-11 17:26:33 -05:00
|
|
|
gone = remove_one_device (self, gone, NM_DEVICE (gone->data), FALSE);
|
2009-07-09 11:06:31 -04:00
|
|
|
} else {
|
|
|
|
|
g_slist_free (keep);
|
|
|
|
|
g_slist_free (gone);
|
|
|
|
|
}
|
2009-05-20 12:02:18 -04:00
|
|
|
|
|
|
|
|
/* Now look for devices without connections */
|
|
|
|
|
nm_bluez_manager_query_devices (priv->bluez_mgr);
|
|
|
|
|
}
|
|
|
|
|
|
2009-05-13 21:32:56 -04:00
|
|
|
static void
|
|
|
|
|
bluez_manager_bdaddr_added_cb (NMBluezManager *bluez_mgr,
|
2009-06-11 00:39:12 -04:00
|
|
|
const char *bdaddr,
|
|
|
|
|
const char *name,
|
|
|
|
|
const char *object_path,
|
|
|
|
|
guint32 capabilities,
|
|
|
|
|
NMManager *manager)
|
2009-05-13 21:32:56 -04:00
|
|
|
{
|
2009-07-07 14:57:05 -04:00
|
|
|
NMDevice *device;
|
2009-05-14 13:59:03 -04:00
|
|
|
gboolean has_dun = (capabilities & NM_BT_CAPABILITY_DUN);
|
|
|
|
|
gboolean has_nap = (capabilities & NM_BT_CAPABILITY_NAP);
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (bdaddr != NULL);
|
|
|
|
|
g_return_if_fail (name != NULL);
|
|
|
|
|
g_return_if_fail (object_path != NULL);
|
|
|
|
|
g_return_if_fail (capabilities != NM_BT_CAPABILITY_NONE);
|
2009-05-13 21:32:56 -04:00
|
|
|
|
2009-05-14 13:59:03 -04:00
|
|
|
/* Make sure the device is not already in the device list */
|
|
|
|
|
if (nm_manager_get_device_by_udi (manager, object_path))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (has_dun == FALSE && has_nap == FALSE)
|
|
|
|
|
return;
|
|
|
|
|
|
2009-05-20 12:02:18 -04:00
|
|
|
if (!bluez_manager_find_connection (manager, bdaddr, capabilities))
|
2009-05-14 13:59:03 -04:00
|
|
|
return;
|
|
|
|
|
|
2009-07-10 10:45:24 -04:00
|
|
|
device = nm_device_bt_new (object_path, bdaddr, name, capabilities, FALSE);
|
2009-07-07 14:57:05 -04:00
|
|
|
if (device) {
|
2010-04-06 16:20:11 -07:00
|
|
|
nm_log_info (LOGD_HW, "BT device %s (%s) added (%s%s%s)",
|
|
|
|
|
name,
|
|
|
|
|
bdaddr,
|
|
|
|
|
has_dun ? "DUN" : "",
|
|
|
|
|
has_dun && has_nap ? " " : "",
|
|
|
|
|
has_nap ? "NAP" : "");
|
2009-07-07 14:57:05 -04:00
|
|
|
|
|
|
|
|
add_device (manager, device);
|
|
|
|
|
}
|
2009-05-13 21:32:56 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
bluez_manager_bdaddr_removed_cb (NMBluezManager *bluez_mgr,
|
2009-05-14 13:59:03 -04:00
|
|
|
const char *bdaddr,
|
2009-05-20 12:02:18 -04:00
|
|
|
const char *object_path,
|
|
|
|
|
gpointer user_data)
|
2009-05-13 21:32:56 -04:00
|
|
|
{
|
2009-05-14 13:59:03 -04:00
|
|
|
NMManager *self = NM_MANAGER (user_data);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
GSList *iter;
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (bdaddr != NULL);
|
|
|
|
|
g_return_if_fail (object_path != NULL);
|
|
|
|
|
|
2010-04-06 16:20:11 -07:00
|
|
|
nm_log_info (LOGD_HW, "BT device %s removed", bdaddr);
|
2009-05-14 13:59:03 -04:00
|
|
|
|
|
|
|
|
for (iter = priv->devices; iter; iter = iter->next) {
|
|
|
|
|
NMDevice *device = NM_DEVICE (iter->data);
|
|
|
|
|
|
|
|
|
|
if (!strcmp (nm_device_get_udi (device), object_path)) {
|
2010-08-11 17:26:33 -05:00
|
|
|
priv->devices = remove_one_device (self, priv->devices, device, FALSE);
|
2009-05-14 13:59:03 -04:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2009-05-13 21:32:56 -04:00
|
|
|
}
|
|
|
|
|
|
2009-09-04 16:55:48 +02:00
|
|
|
static NMDevice *
|
|
|
|
|
find_device_by_iface (NMManager *self, const gchar *iface)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
GSList *iter;
|
2010-01-28 11:21:53 -08:00
|
|
|
|
2009-09-04 16:55:48 +02:00
|
|
|
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
|
|
|
|
|
NMDevice *device = NM_DEVICE (iter->data);
|
|
|
|
|
const gchar *d_iface = nm_device_get_ip_iface (device);
|
|
|
|
|
if (!strcmp (d_iface, iface))
|
|
|
|
|
return device;
|
|
|
|
|
}
|
2010-01-28 11:21:53 -08:00
|
|
|
|
2009-09-04 16:55:48 +02:00
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
static NMDevice *
|
|
|
|
|
find_device_by_ifindex (NMManager *self, guint32 ifindex)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
GSList *iter;
|
|
|
|
|
|
|
|
|
|
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
|
2010-04-21 14:58:25 -07:00
|
|
|
NMDevice *candidate = NM_DEVICE (iter->data);
|
2009-06-11 00:39:12 -04:00
|
|
|
|
2010-04-21 14:58:25 -07:00
|
|
|
if (ifindex == nm_device_get_ifindex (candidate))
|
|
|
|
|
return candidate;
|
2009-06-11 00:39:12 -04:00
|
|
|
}
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2009-01-19 11:01:00 +02:00
|
|
|
static void
|
2009-06-11 00:39:12 -04:00
|
|
|
udev_device_added_cb (NMUdevManager *udev_mgr,
|
|
|
|
|
GUdevDevice *udev_device,
|
|
|
|
|
NMDeviceCreatorFn creator_fn,
|
|
|
|
|
gpointer user_data)
|
2009-01-19 11:01:00 +02:00
|
|
|
{
|
|
|
|
|
NMManager *self = NM_MANAGER (user_data);
|
|
|
|
|
GObject *device;
|
2009-06-11 00:39:12 -04:00
|
|
|
guint32 ifindex;
|
2009-01-19 11:01:00 +02:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
ifindex = g_udev_device_get_property_as_int (udev_device, "IFINDEX");
|
|
|
|
|
if (find_device_by_ifindex (self, ifindex))
|
2009-01-19 11:01:00 +02:00
|
|
|
return;
|
|
|
|
|
|
2010-05-22 08:55:30 -07:00
|
|
|
device = creator_fn (udev_mgr, udev_device, manager_sleeping (self));
|
2009-06-11 00:39:12 -04:00
|
|
|
if (device)
|
|
|
|
|
add_device (self, NM_DEVICE (device));
|
2009-01-19 11:01:00 +02:00
|
|
|
}
|
|
|
|
|
|
2008-04-29 Dan Williams <dcbw@redhat.com>
Handle HAL dropouts better; allow NM to start up even if HAL isn't up yet.
* marshallers/nm-marshal.list
- Add marshaller
* src/NetworkManager.c
- (main): let the NMManager handle the NMHalManager
* src/nm-hal-manager.c
src/nm-hal-manager.h
- convert to a GObject, and emit singals when stuff changes. Let the
NMManager handle the signals, instead of the NMHalManager calling
into the NMManager.
* src/nm-manager.c
src/nm-manager.h
- (remove_one_device): consolidate device removals here
- (dispose): use remove_one_device()
- (nm_manager_get_device_by_udi): make static
- (deferred_hal_manager_query_devices): idle handler to query the HAL
manager for devices at startup or wakeup time
- (nm_manager_new): create and monitor the HAL manager
- (hal_manager_udi_added_cb): new function; do what
nm_manager_add_device() used to do when signalled by the hal manager
- (hal_manager_udi_removed_cb): new function; do what
nm_manager_remove_device() used to do when signalled by the hal
manager
- (hal_manager_rfkill_changed_cb): handle rfkill changes from the
hal manager
- (hal_manager_hal_reappeared_cb): when HAL comes back, remove devices
in our device list that aren't known to HAL
- (impl_manager_sleep): on wakeup, re-add devices from an idle handler;
see comments on nm-hal-manager.c::nm_manager_state_changed() a few
commits ago
- (nm_manager_get_device_by_path, nm_manager_is_udi_managed,
nm_manager_activation_pending, nm_manager_wireless_enabled,
nm_manager_wireless_hardware_enabled,
nm_manager_set_wireless_hardware_enabled): remove, unused
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3619 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-29 23:03:00 +00:00
|
|
|
static void
|
2009-06-11 00:39:12 -04:00
|
|
|
udev_device_removed_cb (NMUdevManager *manager,
|
|
|
|
|
GUdevDevice *udev_device,
|
|
|
|
|
gpointer user_data)
|
2007-02-08 15:34:26 +00:00
|
|
|
{
|
2008-04-29 Dan Williams <dcbw@redhat.com>
Handle HAL dropouts better; allow NM to start up even if HAL isn't up yet.
* marshallers/nm-marshal.list
- Add marshaller
* src/NetworkManager.c
- (main): let the NMManager handle the NMHalManager
* src/nm-hal-manager.c
src/nm-hal-manager.h
- convert to a GObject, and emit singals when stuff changes. Let the
NMManager handle the signals, instead of the NMHalManager calling
into the NMManager.
* src/nm-manager.c
src/nm-manager.h
- (remove_one_device): consolidate device removals here
- (dispose): use remove_one_device()
- (nm_manager_get_device_by_udi): make static
- (deferred_hal_manager_query_devices): idle handler to query the HAL
manager for devices at startup or wakeup time
- (nm_manager_new): create and monitor the HAL manager
- (hal_manager_udi_added_cb): new function; do what
nm_manager_add_device() used to do when signalled by the hal manager
- (hal_manager_udi_removed_cb): new function; do what
nm_manager_remove_device() used to do when signalled by the hal
manager
- (hal_manager_rfkill_changed_cb): handle rfkill changes from the
hal manager
- (hal_manager_hal_reappeared_cb): when HAL comes back, remove devices
in our device list that aren't known to HAL
- (impl_manager_sleep): on wakeup, re-add devices from an idle handler;
see comments on nm-hal-manager.c::nm_manager_state_changed() a few
commits ago
- (nm_manager_get_device_by_path, nm_manager_is_udi_managed,
nm_manager_activation_pending, nm_manager_wireless_enabled,
nm_manager_wireless_hardware_enabled,
nm_manager_set_wireless_hardware_enabled): remove, unused
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3619 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-29 23:03:00 +00:00
|
|
|
NMManager *self = NM_MANAGER (user_data);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
2009-06-11 00:39:12 -04:00
|
|
|
NMDevice *device;
|
|
|
|
|
guint32 ifindex;
|
2007-02-08 15:34:26 +00:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
ifindex = g_udev_device_get_property_as_int (udev_device, "IFINDEX");
|
|
|
|
|
device = find_device_by_ifindex (self, ifindex);
|
|
|
|
|
if (device)
|
2010-08-11 17:26:33 -05:00
|
|
|
priv->devices = remove_one_device (self, priv->devices, device, FALSE);
|
2007-02-08 15:34:26 +00:00
|
|
|
}
|
|
|
|
|
|
2008-04-29 Dan Williams <dcbw@redhat.com>
Handle HAL dropouts better; allow NM to start up even if HAL isn't up yet.
* marshallers/nm-marshal.list
- Add marshaller
* src/NetworkManager.c
- (main): let the NMManager handle the NMHalManager
* src/nm-hal-manager.c
src/nm-hal-manager.h
- convert to a GObject, and emit singals when stuff changes. Let the
NMManager handle the signals, instead of the NMHalManager calling
into the NMManager.
* src/nm-manager.c
src/nm-manager.h
- (remove_one_device): consolidate device removals here
- (dispose): use remove_one_device()
- (nm_manager_get_device_by_udi): make static
- (deferred_hal_manager_query_devices): idle handler to query the HAL
manager for devices at startup or wakeup time
- (nm_manager_new): create and monitor the HAL manager
- (hal_manager_udi_added_cb): new function; do what
nm_manager_add_device() used to do when signalled by the hal manager
- (hal_manager_udi_removed_cb): new function; do what
nm_manager_remove_device() used to do when signalled by the hal
manager
- (hal_manager_rfkill_changed_cb): handle rfkill changes from the
hal manager
- (hal_manager_hal_reappeared_cb): when HAL comes back, remove devices
in our device list that aren't known to HAL
- (impl_manager_sleep): on wakeup, re-add devices from an idle handler;
see comments on nm-hal-manager.c::nm_manager_state_changed() a few
commits ago
- (nm_manager_get_device_by_path, nm_manager_is_udi_managed,
nm_manager_activation_pending, nm_manager_wireless_enabled,
nm_manager_wireless_hardware_enabled,
nm_manager_set_wireless_hardware_enabled): remove, unused
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3619 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-29 23:03:00 +00:00
|
|
|
static void
|
2009-06-11 00:39:12 -04:00
|
|
|
udev_manager_rfkill_changed_cb (NMUdevManager *udev_mgr,
|
2009-12-22 23:46:06 -08:00
|
|
|
RfKillType rtype,
|
2009-11-24 10:43:43 -08:00
|
|
|
RfKillState udev_state,
|
2009-06-05 01:55:02 -04:00
|
|
|
gpointer user_data)
|
2007-02-08 15:34:26 +00:00
|
|
|
{
|
2009-12-23 00:03:45 -08:00
|
|
|
nm_manager_rfkill_update (NM_MANAGER (user_data), rtype);
|
2007-02-08 15:34:26 +00:00
|
|
|
}
|
|
|
|
|
|
2008-04-29 Dan Williams <dcbw@redhat.com>
Handle HAL dropouts better; allow NM to start up even if HAL isn't up yet.
* marshallers/nm-marshal.list
- Add marshaller
* src/NetworkManager.c
- (main): let the NMManager handle the NMHalManager
* src/nm-hal-manager.c
src/nm-hal-manager.h
- convert to a GObject, and emit singals when stuff changes. Let the
NMManager handle the signals, instead of the NMHalManager calling
into the NMManager.
* src/nm-manager.c
src/nm-manager.h
- (remove_one_device): consolidate device removals here
- (dispose): use remove_one_device()
- (nm_manager_get_device_by_udi): make static
- (deferred_hal_manager_query_devices): idle handler to query the HAL
manager for devices at startup or wakeup time
- (nm_manager_new): create and monitor the HAL manager
- (hal_manager_udi_added_cb): new function; do what
nm_manager_add_device() used to do when signalled by the hal manager
- (hal_manager_udi_removed_cb): new function; do what
nm_manager_remove_device() used to do when signalled by the hal
manager
- (hal_manager_rfkill_changed_cb): handle rfkill changes from the
hal manager
- (hal_manager_hal_reappeared_cb): when HAL comes back, remove devices
in our device list that aren't known to HAL
- (impl_manager_sleep): on wakeup, re-add devices from an idle handler;
see comments on nm-hal-manager.c::nm_manager_state_changed() a few
commits ago
- (nm_manager_get_device_by_path, nm_manager_is_udi_managed,
nm_manager_activation_pending, nm_manager_wireless_enabled,
nm_manager_wireless_hardware_enabled,
nm_manager_set_wireless_hardware_enabled): remove, unused
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3619 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-29 23:03:00 +00:00
|
|
|
GSList *
|
|
|
|
|
nm_manager_get_devices (NMManager *manager)
|
2007-02-08 15:34:26 +00:00
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (NM_IS_MANAGER (manager), NULL);
|
|
|
|
|
|
2008-04-29 Dan Williams <dcbw@redhat.com>
Handle HAL dropouts better; allow NM to start up even if HAL isn't up yet.
* marshallers/nm-marshal.list
- Add marshaller
* src/NetworkManager.c
- (main): let the NMManager handle the NMHalManager
* src/nm-hal-manager.c
src/nm-hal-manager.h
- convert to a GObject, and emit singals when stuff changes. Let the
NMManager handle the signals, instead of the NMHalManager calling
into the NMManager.
* src/nm-manager.c
src/nm-manager.h
- (remove_one_device): consolidate device removals here
- (dispose): use remove_one_device()
- (nm_manager_get_device_by_udi): make static
- (deferred_hal_manager_query_devices): idle handler to query the HAL
manager for devices at startup or wakeup time
- (nm_manager_new): create and monitor the HAL manager
- (hal_manager_udi_added_cb): new function; do what
nm_manager_add_device() used to do when signalled by the hal manager
- (hal_manager_udi_removed_cb): new function; do what
nm_manager_remove_device() used to do when signalled by the hal
manager
- (hal_manager_rfkill_changed_cb): handle rfkill changes from the
hal manager
- (hal_manager_hal_reappeared_cb): when HAL comes back, remove devices
in our device list that aren't known to HAL
- (impl_manager_sleep): on wakeup, re-add devices from an idle handler;
see comments on nm-hal-manager.c::nm_manager_state_changed() a few
commits ago
- (nm_manager_get_device_by_path, nm_manager_is_udi_managed,
nm_manager_activation_pending, nm_manager_wireless_enabled,
nm_manager_wireless_hardware_enabled,
nm_manager_set_wireless_hardware_enabled): remove, unused
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3619 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-29 23:03:00 +00:00
|
|
|
return NM_MANAGER_GET_PRIVATE (manager)->devices;
|
2007-02-08 15:34:26 +00:00
|
|
|
}
|
|
|
|
|
|
2008-04-29 Dan Williams <dcbw@redhat.com>
Handle HAL dropouts better; allow NM to start up even if HAL isn't up yet.
* marshallers/nm-marshal.list
- Add marshaller
* src/NetworkManager.c
- (main): let the NMManager handle the NMHalManager
* src/nm-hal-manager.c
src/nm-hal-manager.h
- convert to a GObject, and emit singals when stuff changes. Let the
NMManager handle the signals, instead of the NMHalManager calling
into the NMManager.
* src/nm-manager.c
src/nm-manager.h
- (remove_one_device): consolidate device removals here
- (dispose): use remove_one_device()
- (nm_manager_get_device_by_udi): make static
- (deferred_hal_manager_query_devices): idle handler to query the HAL
manager for devices at startup or wakeup time
- (nm_manager_new): create and monitor the HAL manager
- (hal_manager_udi_added_cb): new function; do what
nm_manager_add_device() used to do when signalled by the hal manager
- (hal_manager_udi_removed_cb): new function; do what
nm_manager_remove_device() used to do when signalled by the hal
manager
- (hal_manager_rfkill_changed_cb): handle rfkill changes from the
hal manager
- (hal_manager_hal_reappeared_cb): when HAL comes back, remove devices
in our device list that aren't known to HAL
- (impl_manager_sleep): on wakeup, re-add devices from an idle handler;
see comments on nm-hal-manager.c::nm_manager_state_changed() a few
commits ago
- (nm_manager_get_device_by_path, nm_manager_is_udi_managed,
nm_manager_activation_pending, nm_manager_wireless_enabled,
nm_manager_wireless_hardware_enabled,
nm_manager_set_wireless_hardware_enabled): remove, unused
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3619 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-29 23:03:00 +00:00
|
|
|
static gboolean
|
|
|
|
|
impl_manager_get_devices (NMManager *manager, GPtrArray **devices, GError **err)
|
2007-08-26 15:55:27 +00:00
|
|
|
{
|
2008-04-29 Dan Williams <dcbw@redhat.com>
Handle HAL dropouts better; allow NM to start up even if HAL isn't up yet.
* marshallers/nm-marshal.list
- Add marshaller
* src/NetworkManager.c
- (main): let the NMManager handle the NMHalManager
* src/nm-hal-manager.c
src/nm-hal-manager.h
- convert to a GObject, and emit singals when stuff changes. Let the
NMManager handle the signals, instead of the NMHalManager calling
into the NMManager.
* src/nm-manager.c
src/nm-manager.h
- (remove_one_device): consolidate device removals here
- (dispose): use remove_one_device()
- (nm_manager_get_device_by_udi): make static
- (deferred_hal_manager_query_devices): idle handler to query the HAL
manager for devices at startup or wakeup time
- (nm_manager_new): create and monitor the HAL manager
- (hal_manager_udi_added_cb): new function; do what
nm_manager_add_device() used to do when signalled by the hal manager
- (hal_manager_udi_removed_cb): new function; do what
nm_manager_remove_device() used to do when signalled by the hal
manager
- (hal_manager_rfkill_changed_cb): handle rfkill changes from the
hal manager
- (hal_manager_hal_reappeared_cb): when HAL comes back, remove devices
in our device list that aren't known to HAL
- (impl_manager_sleep): on wakeup, re-add devices from an idle handler;
see comments on nm-hal-manager.c::nm_manager_state_changed() a few
commits ago
- (nm_manager_get_device_by_path, nm_manager_is_udi_managed,
nm_manager_activation_pending, nm_manager_wireless_enabled,
nm_manager_wireless_hardware_enabled,
nm_manager_set_wireless_hardware_enabled): remove, unused
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3619 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-29 23:03:00 +00:00
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
|
2007-08-26 15:55:27 +00:00
|
|
|
GSList *iter;
|
|
|
|
|
|
2008-04-29 Dan Williams <dcbw@redhat.com>
Handle HAL dropouts better; allow NM to start up even if HAL isn't up yet.
* marshallers/nm-marshal.list
- Add marshaller
* src/NetworkManager.c
- (main): let the NMManager handle the NMHalManager
* src/nm-hal-manager.c
src/nm-hal-manager.h
- convert to a GObject, and emit singals when stuff changes. Let the
NMManager handle the signals, instead of the NMHalManager calling
into the NMManager.
* src/nm-manager.c
src/nm-manager.h
- (remove_one_device): consolidate device removals here
- (dispose): use remove_one_device()
- (nm_manager_get_device_by_udi): make static
- (deferred_hal_manager_query_devices): idle handler to query the HAL
manager for devices at startup or wakeup time
- (nm_manager_new): create and monitor the HAL manager
- (hal_manager_udi_added_cb): new function; do what
nm_manager_add_device() used to do when signalled by the hal manager
- (hal_manager_udi_removed_cb): new function; do what
nm_manager_remove_device() used to do when signalled by the hal
manager
- (hal_manager_rfkill_changed_cb): handle rfkill changes from the
hal manager
- (hal_manager_hal_reappeared_cb): when HAL comes back, remove devices
in our device list that aren't known to HAL
- (impl_manager_sleep): on wakeup, re-add devices from an idle handler;
see comments on nm-hal-manager.c::nm_manager_state_changed() a few
commits ago
- (nm_manager_get_device_by_path, nm_manager_is_udi_managed,
nm_manager_activation_pending, nm_manager_wireless_enabled,
nm_manager_wireless_hardware_enabled,
nm_manager_set_wireless_hardware_enabled): remove, unused
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3619 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-29 23:03:00 +00:00
|
|
|
*devices = g_ptr_array_sized_new (g_slist_length (priv->devices));
|
2007-08-26 15:55:27 +00:00
|
|
|
|
2008-04-29 Dan Williams <dcbw@redhat.com>
Handle HAL dropouts better; allow NM to start up even if HAL isn't up yet.
* marshallers/nm-marshal.list
- Add marshaller
* src/NetworkManager.c
- (main): let the NMManager handle the NMHalManager
* src/nm-hal-manager.c
src/nm-hal-manager.h
- convert to a GObject, and emit singals when stuff changes. Let the
NMManager handle the signals, instead of the NMHalManager calling
into the NMManager.
* src/nm-manager.c
src/nm-manager.h
- (remove_one_device): consolidate device removals here
- (dispose): use remove_one_device()
- (nm_manager_get_device_by_udi): make static
- (deferred_hal_manager_query_devices): idle handler to query the HAL
manager for devices at startup or wakeup time
- (nm_manager_new): create and monitor the HAL manager
- (hal_manager_udi_added_cb): new function; do what
nm_manager_add_device() used to do when signalled by the hal manager
- (hal_manager_udi_removed_cb): new function; do what
nm_manager_remove_device() used to do when signalled by the hal
manager
- (hal_manager_rfkill_changed_cb): handle rfkill changes from the
hal manager
- (hal_manager_hal_reappeared_cb): when HAL comes back, remove devices
in our device list that aren't known to HAL
- (impl_manager_sleep): on wakeup, re-add devices from an idle handler;
see comments on nm-hal-manager.c::nm_manager_state_changed() a few
commits ago
- (nm_manager_get_device_by_path, nm_manager_is_udi_managed,
nm_manager_activation_pending, nm_manager_wireless_enabled,
nm_manager_wireless_hardware_enabled,
nm_manager_set_wireless_hardware_enabled): remove, unused
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3619 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-29 23:03:00 +00:00
|
|
|
for (iter = priv->devices; iter; iter = iter->next)
|
2009-06-11 00:39:12 -04:00
|
|
|
g_ptr_array_add (*devices, g_strdup (nm_device_get_path (NM_DEVICE (iter->data))));
|
2007-08-26 15:55:27 +00:00
|
|
|
|
2008-04-29 Dan Williams <dcbw@redhat.com>
Handle HAL dropouts better; allow NM to start up even if HAL isn't up yet.
* marshallers/nm-marshal.list
- Add marshaller
* src/NetworkManager.c
- (main): let the NMManager handle the NMHalManager
* src/nm-hal-manager.c
src/nm-hal-manager.h
- convert to a GObject, and emit singals when stuff changes. Let the
NMManager handle the signals, instead of the NMHalManager calling
into the NMManager.
* src/nm-manager.c
src/nm-manager.h
- (remove_one_device): consolidate device removals here
- (dispose): use remove_one_device()
- (nm_manager_get_device_by_udi): make static
- (deferred_hal_manager_query_devices): idle handler to query the HAL
manager for devices at startup or wakeup time
- (nm_manager_new): create and monitor the HAL manager
- (hal_manager_udi_added_cb): new function; do what
nm_manager_add_device() used to do when signalled by the hal manager
- (hal_manager_udi_removed_cb): new function; do what
nm_manager_remove_device() used to do when signalled by the hal
manager
- (hal_manager_rfkill_changed_cb): handle rfkill changes from the
hal manager
- (hal_manager_hal_reappeared_cb): when HAL comes back, remove devices
in our device list that aren't known to HAL
- (impl_manager_sleep): on wakeup, re-add devices from an idle handler;
see comments on nm-hal-manager.c::nm_manager_state_changed() a few
commits ago
- (nm_manager_get_device_by_path, nm_manager_is_udi_managed,
nm_manager_activation_pending, nm_manager_wireless_enabled,
nm_manager_wireless_hardware_enabled,
nm_manager_set_wireless_hardware_enabled): remove, unused
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3619 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-29 23:03:00 +00:00
|
|
|
return TRUE;
|
2007-08-26 15:55:27 +00:00
|
|
|
}
|
|
|
|
|
|
2008-03-26 13:43:01 +00:00
|
|
|
static NMActRequest *
|
|
|
|
|
nm_manager_get_act_request_by_path (NMManager *manager,
|
|
|
|
|
const char *path,
|
|
|
|
|
NMDevice **device)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
|
|
|
|
|
GSList *iter;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (manager != NULL, NULL);
|
|
|
|
|
g_return_val_if_fail (path != NULL, NULL);
|
|
|
|
|
g_return_val_if_fail (device != NULL, NULL);
|
|
|
|
|
g_return_val_if_fail (*device == NULL, NULL);
|
|
|
|
|
|
|
|
|
|
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
|
|
|
|
|
NMActRequest *req;
|
|
|
|
|
const char *ac_path;
|
|
|
|
|
|
|
|
|
|
req = nm_device_get_act_request (NM_DEVICE (iter->data));
|
|
|
|
|
if (!req)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
ac_path = nm_act_request_get_active_connection_path (req);
|
|
|
|
|
if (!strcmp (path, ac_path)) {
|
|
|
|
|
*device = NM_DEVICE (iter->data);
|
|
|
|
|
return req;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
static const char *
|
|
|
|
|
internal_activate_device (NMManager *manager,
|
|
|
|
|
NMDevice *device,
|
|
|
|
|
NMConnection *connection,
|
|
|
|
|
const char *specific_object,
|
|
|
|
|
gboolean user_requested,
|
2009-08-05 18:03:09 -04:00
|
|
|
gboolean assumed,
|
2009-06-11 00:39:12 -04:00
|
|
|
GError **error)
|
|
|
|
|
{
|
|
|
|
|
NMActRequest *req;
|
|
|
|
|
NMDeviceInterface *dev_iface;
|
|
|
|
|
gboolean success;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (NM_IS_MANAGER (manager), NULL);
|
|
|
|
|
g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
|
|
|
|
|
g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
|
|
|
|
|
|
|
|
|
|
dev_iface = NM_DEVICE_INTERFACE (device);
|
|
|
|
|
|
|
|
|
|
/* Ensure the requested connection is compatible with the device */
|
|
|
|
|
if (!nm_device_interface_check_connection_compatible (dev_iface, connection, error))
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
/* Tear down any existing connection */
|
|
|
|
|
if (nm_device_get_act_request (device)) {
|
|
|
|
|
nm_device_state_changed (device,
|
|
|
|
|
NM_DEVICE_STATE_DISCONNECTED,
|
|
|
|
|
NM_DEVICE_STATE_REASON_NONE);
|
|
|
|
|
}
|
|
|
|
|
|
2010-12-13 13:11:51 -06:00
|
|
|
req = nm_act_request_new (connection,
|
|
|
|
|
specific_object,
|
|
|
|
|
NM_MANAGER_GET_PRIVATE (manager)->agent_mgr,
|
|
|
|
|
user_requested,
|
|
|
|
|
assumed,
|
|
|
|
|
(gpointer) device);
|
2009-06-11 00:39:12 -04:00
|
|
|
success = nm_device_interface_activate (dev_iface, req, error);
|
|
|
|
|
g_object_unref (req);
|
|
|
|
|
|
|
|
|
|
return success ? nm_act_request_get_active_connection_path (req) : NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2008-03-26 13:43:01 +00:00
|
|
|
const char *
|
|
|
|
|
nm_manager_activate_connection (NMManager *manager,
|
|
|
|
|
NMConnection *connection,
|
|
|
|
|
const char *specific_object,
|
|
|
|
|
const char *device_path,
|
|
|
|
|
gboolean user_requested,
|
|
|
|
|
GError **error)
|
|
|
|
|
{
|
2009-10-16 11:52:27 -07:00
|
|
|
NMManagerPrivate *priv;
|
2008-03-26 13:43:01 +00:00
|
|
|
NMDevice *device = NULL;
|
|
|
|
|
NMSettingConnection *s_con;
|
2009-06-11 00:39:12 -04:00
|
|
|
NMVPNConnection *vpn_connection;
|
2010-08-17 14:04:47 -05:00
|
|
|
const char *path = NULL;
|
2008-03-26 13:43:01 +00:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (manager != NULL, NULL);
|
|
|
|
|
g_return_val_if_fail (connection != NULL, NULL);
|
|
|
|
|
g_return_val_if_fail (error != NULL, NULL);
|
|
|
|
|
g_return_val_if_fail (*error == NULL, NULL);
|
|
|
|
|
|
2009-10-16 11:52:27 -07:00
|
|
|
priv = NM_MANAGER_GET_PRIVATE (manager);
|
|
|
|
|
|
2008-03-26 13:43:01 +00:00
|
|
|
s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
|
|
|
|
|
g_assert (s_con);
|
|
|
|
|
|
2008-10-26 17:41:37 +00:00
|
|
|
if (!strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_VPN_SETTING_NAME)) {
|
2010-12-13 13:11:51 -06:00
|
|
|
NMActRequest *parent_req = NULL;
|
2008-03-26 13:43:01 +00:00
|
|
|
NMVPNManager *vpn_manager;
|
|
|
|
|
|
|
|
|
|
/* VPN connection */
|
2009-10-16 11:52:27 -07:00
|
|
|
|
|
|
|
|
if (specific_object) {
|
|
|
|
|
/* Find the specifc connection the client requested we use */
|
2010-12-13 13:11:51 -06:00
|
|
|
parent_req = nm_manager_get_act_request_by_path (manager, specific_object, &device);
|
|
|
|
|
if (!parent_req) {
|
2009-10-16 11:52:27 -07:00
|
|
|
g_set_error (error,
|
|
|
|
|
NM_MANAGER_ERROR, NM_MANAGER_ERROR_CONNECTION_NOT_ACTIVE,
|
|
|
|
|
"%s", "Base connection for VPN connection not active.");
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
GSList *iter;
|
|
|
|
|
|
|
|
|
|
/* Just find the current default connection */
|
|
|
|
|
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
|
|
|
|
|
NMDevice *candidate = NM_DEVICE (iter->data);
|
|
|
|
|
NMActRequest *candidate_req;
|
|
|
|
|
|
|
|
|
|
candidate_req = nm_device_get_act_request (candidate);
|
|
|
|
|
if (candidate_req && nm_act_request_get_default (candidate_req)) {
|
|
|
|
|
device = candidate;
|
2010-12-13 13:11:51 -06:00
|
|
|
parent_req = candidate_req;
|
2009-10-16 11:52:27 -07:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2008-03-26 13:43:01 +00:00
|
|
|
}
|
|
|
|
|
|
2010-12-13 13:11:51 -06:00
|
|
|
if (!device || !parent_req) {
|
2008-03-26 13:43:01 +00:00
|
|
|
g_set_error (error,
|
|
|
|
|
NM_MANAGER_ERROR, NM_MANAGER_ERROR_UNKNOWN_DEVICE,
|
2009-10-16 11:52:27 -07:00
|
|
|
"%s", "Could not find source connection, or the source connection had no active device.");
|
2008-03-26 13:43:01 +00:00
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vpn_manager = nm_vpn_manager_get ();
|
2009-06-11 00:39:12 -04:00
|
|
|
vpn_connection = nm_vpn_manager_activate_connection (vpn_manager,
|
|
|
|
|
connection,
|
2010-12-13 13:11:51 -06:00
|
|
|
parent_req,
|
2009-06-11 00:39:12 -04:00
|
|
|
device,
|
|
|
|
|
error);
|
2010-12-13 13:11:51 -06:00
|
|
|
if (vpn_connection)
|
2010-08-17 14:04:47 -05:00
|
|
|
path = nm_vpn_connection_get_active_connection_path (vpn_connection);
|
2008-03-26 13:43:01 +00:00
|
|
|
g_object_unref (vpn_manager);
|
|
|
|
|
} else {
|
2008-04-07 Dan Williams <dcbw@redhat.com>
* include/NetworkManager.h
- Remove the DOWN and CANCELLED device states
- Add UNMANAGED and UNAVAILABLE device states
- Document the device states
* introspection/nm-device.xml
src/nm-device-interface.c
src/nm-device-interface.h
- Add the 'managed' property
* test/nm-tool.c
- (detail_device): print out device state
* src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerMandriva.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerSuSE.c
- (nm_system_device_get_system_config, nm_system_device_get_disabled
nm_system_device_free_system_config): remove; they were unused and
their functionality should be re-implemented in each distro's
system settings service plugin
* src/nm-gsm-device.c
src/nm-gsm-device.h
src/nm-cdma-device.c
src/nm-cdma-device.h
- (*_new): take the 'managed' argument
* src/nm-device.c
- (nm_device_set_address): remove, fold into nm_device_bring_up()
- (nm_device_init): start in unmanaged state, not disconnected
- (constructor): don't start device until the system settings service
has had a chance to figure out if the device is managed or not
- (nm_device_deactivate, nm_device_bring_up, nm_device_bring_down):
don't set device state here, let callers handle that as appropriate
- (nm_device_dispose): don't touch the device if it's not managed
- (set_property, get_property, nm_device_class_init): implement the
'managed' property
- (nm_device_state_changed): bring the device up if its now managed,
and deactivate it if it used to be active
- (nm_device_get_managed, nm_device_set_managed): do the right thing
with the managed state
* src/nm-hal-manager.c
- (wired_device_creator, wireless_device_creator, modem_device_creator):
take initial managed state and pass it along to device constructors
- (create_device_and_add_to_list): get managed state and pass to
type creators
* src/nm-device-802-11-wireless.c
- (real_can_activate): fold in most of
nm_device_802_11_wireless_can_activate()
- (can_scan): can't scan in UNAVAILABLE or UNMANAGED
- (link_timeout_cb): instead of deactivating, change device state and
let the device state handler to it
- (real_update_hw_address): clean up
- (state_changed_cb): when entering UNAVAILABLE state, schedule an idle
handler to transition to DISCONNECTED if the device isn't rfkilled
* src/nm-device-802-3-ethernet.c
- (set_carrier): move above callers and get rid of prototype
- (device_state_changed): when entering UNAVAILABLE state, schedule an
idle handler to transition to DISCONNECTED if the device has a
carrier
- (real_update_hw_address): clean up
- (link_timeout_cb, ppp_state_changed): change state instead of calling
deactivation directly as deactivation doesn't change state anymore
* src/NetworkManagerPolicy.c
- (schedule_activate_check): yay, remove wireless_enabled hack since
the NMManager and wireless devices work that out themselves now
- (device_state_changed): change to a switch and update for new device
states
- (device_carrier_changed): remove; device handles this now through
state changes
- (device_added): don't care about carrier any more; the initial
activation check will happen when the device transitions to
DISCONNECTED
* src/nm-manager.c
- (dispose): clear unmanaged devices
- (handle_unmanaged_devices): update unmanaged device list and toggle
the managed property on each device when needed
- (system_settings_properties_changed_cb): handle signals from the
system settings service
- (system_settings_get_unmanaged_devices_cb): handle callback from
getting the unmanaged device list method call
- (query_unmanaged_devices): ask the system settings service for its
list of unmanaged devices
- (nm_manager_name_owner_changed, initial_get_connections): get unmanaged
devices
- (manager_set_wireless_enabled): push rfkill state down to wireless
devices directly and let them handle the necessary state transitions
- (manager_device_state_changed): update for new device states
- (nm_manager_add_device): set initial rfkill state on wireless devices
- (nm_manager_remove_device): don't touch the device if it's unmanaged
- (nm_manager_activate_connection): return error if the device is
unmanaged
- (nm_manager_sleep): handle new device states correctly; don't change
the state of unavailable/unmanaged devices
* libnm-glib/nm-device-802-11-wireless.c
- (state_changed_cb): update for new device states
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3540 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-08 02:58:02 +00:00
|
|
|
NMDeviceState state;
|
|
|
|
|
|
2008-03-26 13:43:01 +00:00
|
|
|
/* Device-based connection */
|
2009-06-11 00:39:12 -04:00
|
|
|
device = nm_manager_get_device_by_path (manager, device_path);
|
2008-03-26 13:43:01 +00:00
|
|
|
if (!device) {
|
|
|
|
|
g_set_error (error,
|
|
|
|
|
NM_MANAGER_ERROR, NM_MANAGER_ERROR_UNKNOWN_DEVICE,
|
|
|
|
|
"%s", "Device not found");
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2008-04-07 Dan Williams <dcbw@redhat.com>
* include/NetworkManager.h
- Remove the DOWN and CANCELLED device states
- Add UNMANAGED and UNAVAILABLE device states
- Document the device states
* introspection/nm-device.xml
src/nm-device-interface.c
src/nm-device-interface.h
- Add the 'managed' property
* test/nm-tool.c
- (detail_device): print out device state
* src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerMandriva.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerSuSE.c
- (nm_system_device_get_system_config, nm_system_device_get_disabled
nm_system_device_free_system_config): remove; they were unused and
their functionality should be re-implemented in each distro's
system settings service plugin
* src/nm-gsm-device.c
src/nm-gsm-device.h
src/nm-cdma-device.c
src/nm-cdma-device.h
- (*_new): take the 'managed' argument
* src/nm-device.c
- (nm_device_set_address): remove, fold into nm_device_bring_up()
- (nm_device_init): start in unmanaged state, not disconnected
- (constructor): don't start device until the system settings service
has had a chance to figure out if the device is managed or not
- (nm_device_deactivate, nm_device_bring_up, nm_device_bring_down):
don't set device state here, let callers handle that as appropriate
- (nm_device_dispose): don't touch the device if it's not managed
- (set_property, get_property, nm_device_class_init): implement the
'managed' property
- (nm_device_state_changed): bring the device up if its now managed,
and deactivate it if it used to be active
- (nm_device_get_managed, nm_device_set_managed): do the right thing
with the managed state
* src/nm-hal-manager.c
- (wired_device_creator, wireless_device_creator, modem_device_creator):
take initial managed state and pass it along to device constructors
- (create_device_and_add_to_list): get managed state and pass to
type creators
* src/nm-device-802-11-wireless.c
- (real_can_activate): fold in most of
nm_device_802_11_wireless_can_activate()
- (can_scan): can't scan in UNAVAILABLE or UNMANAGED
- (link_timeout_cb): instead of deactivating, change device state and
let the device state handler to it
- (real_update_hw_address): clean up
- (state_changed_cb): when entering UNAVAILABLE state, schedule an idle
handler to transition to DISCONNECTED if the device isn't rfkilled
* src/nm-device-802-3-ethernet.c
- (set_carrier): move above callers and get rid of prototype
- (device_state_changed): when entering UNAVAILABLE state, schedule an
idle handler to transition to DISCONNECTED if the device has a
carrier
- (real_update_hw_address): clean up
- (link_timeout_cb, ppp_state_changed): change state instead of calling
deactivation directly as deactivation doesn't change state anymore
* src/NetworkManagerPolicy.c
- (schedule_activate_check): yay, remove wireless_enabled hack since
the NMManager and wireless devices work that out themselves now
- (device_state_changed): change to a switch and update for new device
states
- (device_carrier_changed): remove; device handles this now through
state changes
- (device_added): don't care about carrier any more; the initial
activation check will happen when the device transitions to
DISCONNECTED
* src/nm-manager.c
- (dispose): clear unmanaged devices
- (handle_unmanaged_devices): update unmanaged device list and toggle
the managed property on each device when needed
- (system_settings_properties_changed_cb): handle signals from the
system settings service
- (system_settings_get_unmanaged_devices_cb): handle callback from
getting the unmanaged device list method call
- (query_unmanaged_devices): ask the system settings service for its
list of unmanaged devices
- (nm_manager_name_owner_changed, initial_get_connections): get unmanaged
devices
- (manager_set_wireless_enabled): push rfkill state down to wireless
devices directly and let them handle the necessary state transitions
- (manager_device_state_changed): update for new device states
- (nm_manager_add_device): set initial rfkill state on wireless devices
- (nm_manager_remove_device): don't touch the device if it's unmanaged
- (nm_manager_activate_connection): return error if the device is
unmanaged
- (nm_manager_sleep): handle new device states correctly; don't change
the state of unavailable/unmanaged devices
* libnm-glib/nm-device-802-11-wireless.c
- (state_changed_cb): update for new device states
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3540 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-08 02:58:02 +00:00
|
|
|
state = nm_device_interface_get_state (NM_DEVICE_INTERFACE (device));
|
|
|
|
|
if (state < NM_DEVICE_STATE_DISCONNECTED) {
|
|
|
|
|
g_set_error (error,
|
|
|
|
|
NM_MANAGER_ERROR, NM_MANAGER_ERROR_UNMANAGED_DEVICE,
|
2010-10-26 13:42:43 +02:00
|
|
|
"%s", "Device not managed by NetworkManager or unavailable");
|
2008-04-07 Dan Williams <dcbw@redhat.com>
* include/NetworkManager.h
- Remove the DOWN and CANCELLED device states
- Add UNMANAGED and UNAVAILABLE device states
- Document the device states
* introspection/nm-device.xml
src/nm-device-interface.c
src/nm-device-interface.h
- Add the 'managed' property
* test/nm-tool.c
- (detail_device): print out device state
* src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerMandriva.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerSuSE.c
- (nm_system_device_get_system_config, nm_system_device_get_disabled
nm_system_device_free_system_config): remove; they were unused and
their functionality should be re-implemented in each distro's
system settings service plugin
* src/nm-gsm-device.c
src/nm-gsm-device.h
src/nm-cdma-device.c
src/nm-cdma-device.h
- (*_new): take the 'managed' argument
* src/nm-device.c
- (nm_device_set_address): remove, fold into nm_device_bring_up()
- (nm_device_init): start in unmanaged state, not disconnected
- (constructor): don't start device until the system settings service
has had a chance to figure out if the device is managed or not
- (nm_device_deactivate, nm_device_bring_up, nm_device_bring_down):
don't set device state here, let callers handle that as appropriate
- (nm_device_dispose): don't touch the device if it's not managed
- (set_property, get_property, nm_device_class_init): implement the
'managed' property
- (nm_device_state_changed): bring the device up if its now managed,
and deactivate it if it used to be active
- (nm_device_get_managed, nm_device_set_managed): do the right thing
with the managed state
* src/nm-hal-manager.c
- (wired_device_creator, wireless_device_creator, modem_device_creator):
take initial managed state and pass it along to device constructors
- (create_device_and_add_to_list): get managed state and pass to
type creators
* src/nm-device-802-11-wireless.c
- (real_can_activate): fold in most of
nm_device_802_11_wireless_can_activate()
- (can_scan): can't scan in UNAVAILABLE or UNMANAGED
- (link_timeout_cb): instead of deactivating, change device state and
let the device state handler to it
- (real_update_hw_address): clean up
- (state_changed_cb): when entering UNAVAILABLE state, schedule an idle
handler to transition to DISCONNECTED if the device isn't rfkilled
* src/nm-device-802-3-ethernet.c
- (set_carrier): move above callers and get rid of prototype
- (device_state_changed): when entering UNAVAILABLE state, schedule an
idle handler to transition to DISCONNECTED if the device has a
carrier
- (real_update_hw_address): clean up
- (link_timeout_cb, ppp_state_changed): change state instead of calling
deactivation directly as deactivation doesn't change state anymore
* src/NetworkManagerPolicy.c
- (schedule_activate_check): yay, remove wireless_enabled hack since
the NMManager and wireless devices work that out themselves now
- (device_state_changed): change to a switch and update for new device
states
- (device_carrier_changed): remove; device handles this now through
state changes
- (device_added): don't care about carrier any more; the initial
activation check will happen when the device transitions to
DISCONNECTED
* src/nm-manager.c
- (dispose): clear unmanaged devices
- (handle_unmanaged_devices): update unmanaged device list and toggle
the managed property on each device when needed
- (system_settings_properties_changed_cb): handle signals from the
system settings service
- (system_settings_get_unmanaged_devices_cb): handle callback from
getting the unmanaged device list method call
- (query_unmanaged_devices): ask the system settings service for its
list of unmanaged devices
- (nm_manager_name_owner_changed, initial_get_connections): get unmanaged
devices
- (manager_set_wireless_enabled): push rfkill state down to wireless
devices directly and let them handle the necessary state transitions
- (manager_device_state_changed): update for new device states
- (nm_manager_add_device): set initial rfkill state on wireless devices
- (nm_manager_remove_device): don't touch the device if it's unmanaged
- (nm_manager_activate_connection): return error if the device is
unmanaged
- (nm_manager_sleep): handle new device states correctly; don't change
the state of unavailable/unmanaged devices
* libnm-glib/nm-device-802-11-wireless.c
- (state_changed_cb): update for new device states
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3540 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-04-08 02:58:02 +00:00
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
path = internal_activate_device (manager,
|
|
|
|
|
device,
|
|
|
|
|
connection,
|
|
|
|
|
specific_object,
|
|
|
|
|
user_requested,
|
2009-08-05 18:03:09 -04:00
|
|
|
FALSE,
|
2009-06-11 00:39:12 -04:00
|
|
|
error);
|
2008-03-26 13:43:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return path;
|
|
|
|
|
}
|
|
|
|
|
|
2010-07-13 18:09:56 -04:00
|
|
|
/*
|
|
|
|
|
* TODO this function was created and named in the era of user settings, where
|
|
|
|
|
* we could get activation requests for a connection before we got the settings
|
|
|
|
|
* data of that connection. Now that user settings are gone, flatten or rename
|
|
|
|
|
* it.
|
|
|
|
|
*/
|
2007-10-01 15:38:39 +00:00
|
|
|
static void
|
2010-06-03 23:20:11 -07:00
|
|
|
check_pending_ready (NMManager *self, PendingActivation *pending)
|
2007-10-01 15:38:39 +00:00
|
|
|
{
|
2010-10-27 15:47:10 -05:00
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
NMSysconfigConnection *connection;
|
2010-06-01 00:36:46 -07:00
|
|
|
const char *path = NULL;
|
2007-12-27 08:06:27 +00:00
|
|
|
GError *error = NULL;
|
2007-10-01 15:38:39 +00:00
|
|
|
|
2010-07-13 18:09:56 -04:00
|
|
|
/* Ok, we're authorized */
|
2010-06-03 23:20:11 -07:00
|
|
|
|
2010-10-27 20:05:23 -05:00
|
|
|
connection = nm_settings_get_connection_by_path (priv->settings, pending->connection_path);
|
2010-06-03 23:20:11 -07:00
|
|
|
if (!connection) {
|
|
|
|
|
error = g_error_new_literal (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_UNKNOWN_CONNECTION,
|
|
|
|
|
"Connection could not be found.");
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
path = nm_manager_activate_connection (self,
|
2010-10-27 15:47:10 -05:00
|
|
|
NM_CONNECTION (connection),
|
2010-06-01 00:36:46 -07:00
|
|
|
pending->specific_object_path,
|
|
|
|
|
pending->device_path,
|
2008-03-26 13:43:01 +00:00
|
|
|
TRUE,
|
|
|
|
|
&error);
|
2010-06-01 00:36:46 -07:00
|
|
|
if (!path) {
|
2010-07-13 18:09:56 -04:00
|
|
|
nm_log_warn (LOGD_CORE, "connection %s failed to activate: (%d) %s",
|
|
|
|
|
pending->connection_path, error->code, error->message);
|
2010-06-01 00:36:46 -07:00
|
|
|
} else
|
2010-06-03 23:20:11 -07:00
|
|
|
g_object_notify (G_OBJECT (pending->manager), NM_MANAGER_ACTIVE_CONNECTIONS);
|
2007-02-08 15:34:26 +00:00
|
|
|
|
2010-06-03 23:20:11 -07:00
|
|
|
out:
|
2010-06-01 00:36:46 -07:00
|
|
|
pending_activation_destroy (pending, error, path);
|
|
|
|
|
g_clear_error (&error);
|
2007-10-01 15:38:39 +00:00
|
|
|
}
|
|
|
|
|
|
2010-06-03 23:20:11 -07:00
|
|
|
static void
|
|
|
|
|
activation_auth_done (PendingActivation *pending, GError *error)
|
|
|
|
|
{
|
|
|
|
|
if (error) {
|
|
|
|
|
pending_activation_destroy (pending, error, NULL);
|
|
|
|
|
return;
|
|
|
|
|
} else {
|
|
|
|
|
pending->authorized = TRUE;
|
2008-11-21 18:11:15 +00:00
|
|
|
|
2010-06-03 23:20:11 -07:00
|
|
|
check_pending_ready (pending->manager, pending);
|
2008-11-21 18:11:15 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2007-10-01 15:38:39 +00:00
|
|
|
static void
|
2010-06-03 23:20:11 -07:00
|
|
|
impl_manager_activate_connection (NMManager *self,
|
2008-11-21 18:11:15 +00:00
|
|
|
const char *connection_path,
|
|
|
|
|
const char *device_path,
|
|
|
|
|
const char *specific_object_path,
|
|
|
|
|
DBusGMethodInvocation *context)
|
2007-10-01 15:38:39 +00:00
|
|
|
{
|
2010-06-03 23:20:11 -07:00
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
PendingActivation *pending;
|
2007-10-16 18:59:36 +00:00
|
|
|
|
2010-06-03 23:20:11 -07:00
|
|
|
/* Need to check the caller's permissions and stuff before we can
|
|
|
|
|
* activate the connection.
|
|
|
|
|
*/
|
|
|
|
|
pending = pending_activation_new (self,
|
|
|
|
|
priv->authority,
|
|
|
|
|
context,
|
|
|
|
|
device_path,
|
|
|
|
|
connection_path,
|
|
|
|
|
specific_object_path,
|
|
|
|
|
activation_auth_done);
|
|
|
|
|
|
2010-07-13 18:09:56 -04:00
|
|
|
pending_activation_check_authorized (pending, priv->dbus_mgr);
|
2007-02-08 15:34:26 +00:00
|
|
|
}
|
|
|
|
|
|
2008-03-26 13:43:01 +00:00
|
|
|
gboolean
|
|
|
|
|
nm_manager_deactivate_connection (NMManager *manager,
|
|
|
|
|
const char *connection_path,
|
2008-10-11 19:57:45 +00:00
|
|
|
NMDeviceStateReason reason,
|
2008-03-26 13:43:01 +00:00
|
|
|
GError **error)
|
2007-10-03 14:48:25 +00:00
|
|
|
{
|
2008-03-20 19:56:12 +00:00
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
|
2008-03-26 13:43:01 +00:00
|
|
|
NMVPNManager *vpn_manager;
|
2007-10-03 14:48:25 +00:00
|
|
|
GSList *iter;
|
2008-03-26 13:43:01 +00:00
|
|
|
gboolean success = FALSE;
|
2008-10-11 19:57:45 +00:00
|
|
|
NMVPNConnectionStateReason vpn_reason = NM_VPN_CONNECTION_STATE_REASON_USER_DISCONNECTED;
|
2007-10-03 14:48:25 +00:00
|
|
|
|
2008-03-26 13:43:01 +00:00
|
|
|
/* Check for device connections first */
|
2007-10-03 14:48:25 +00:00
|
|
|
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
|
2008-03-20 19:56:12 +00:00
|
|
|
NMDevice *device = NM_DEVICE (iter->data);
|
|
|
|
|
NMActRequest *req;
|
2007-10-03 14:48:25 +00:00
|
|
|
|
2008-03-20 19:56:12 +00:00
|
|
|
req = nm_device_get_act_request (device);
|
|
|
|
|
if (!req)
|
2007-10-03 14:48:25 +00:00
|
|
|
continue;
|
|
|
|
|
|
2008-03-20 19:56:12 +00:00
|
|
|
if (!strcmp (connection_path, nm_act_request_get_active_connection_path (req))) {
|
2008-07-11 10:28:53 +00:00
|
|
|
nm_device_state_changed (device,
|
|
|
|
|
NM_DEVICE_STATE_DISCONNECTED,
|
2008-10-11 19:57:45 +00:00
|
|
|
reason);
|
2008-03-26 13:43:01 +00:00
|
|
|
success = TRUE;
|
|
|
|
|
goto done;
|
2008-03-20 19:56:12 +00:00
|
|
|
}
|
2007-10-03 14:48:25 +00:00
|
|
|
}
|
|
|
|
|
|
2008-03-26 13:43:01 +00:00
|
|
|
/* Check for VPN connections next */
|
|
|
|
|
vpn_manager = nm_vpn_manager_get ();
|
2008-10-11 19:57:45 +00:00
|
|
|
if (reason == NM_DEVICE_STATE_REASON_CONNECTION_REMOVED)
|
|
|
|
|
vpn_reason = NM_VPN_CONNECTION_STATE_REASON_CONNECTION_REMOVED;
|
|
|
|
|
if (nm_vpn_manager_deactivate_connection (vpn_manager, connection_path, vpn_reason)) {
|
2008-03-26 13:43:01 +00:00
|
|
|
success = TRUE;
|
|
|
|
|
} else {
|
|
|
|
|
g_set_error (error,
|
|
|
|
|
NM_MANAGER_ERROR, NM_MANAGER_ERROR_CONNECTION_NOT_ACTIVE,
|
|
|
|
|
"%s", "The connection was not active.");
|
|
|
|
|
}
|
|
|
|
|
g_object_unref (vpn_manager);
|
|
|
|
|
|
|
|
|
|
done:
|
|
|
|
|
g_object_notify (G_OBJECT (manager), NM_MANAGER_ACTIVE_CONNECTIONS);
|
|
|
|
|
return success;
|
|
|
|
|
}
|
|
|
|
|
|
2010-06-04 00:42:10 -07:00
|
|
|
static void
|
|
|
|
|
deactivate_net_auth_done_cb (NMAuthChain *chain,
|
|
|
|
|
GError *error,
|
|
|
|
|
DBusGMethodInvocation *context,
|
|
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMManager *self = NM_MANAGER (user_data);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
GError *ret_error = NULL;
|
|
|
|
|
NMAuthCallResult result;
|
|
|
|
|
const char *active_path;
|
|
|
|
|
|
|
|
|
|
priv->auth_chains = g_slist_remove (priv->auth_chains, chain);
|
|
|
|
|
|
|
|
|
|
result = GPOINTER_TO_UINT (nm_auth_chain_get_data (chain, NM_AUTH_PERMISSION_NETWORK_CONTROL));
|
|
|
|
|
ret_error = deactivate_disconnect_check_error (error, result, "Deactivate");
|
|
|
|
|
if (ret_error) {
|
|
|
|
|
dbus_g_method_return_error (context, ret_error);
|
|
|
|
|
g_error_free (ret_error);
|
|
|
|
|
goto done;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
active_path = nm_auth_chain_get_data (chain, "path");
|
2010-07-13 18:09:56 -04:00
|
|
|
if (!nm_manager_deactivate_connection (self,
|
|
|
|
|
active_path,
|
|
|
|
|
NM_DEVICE_STATE_REASON_USER_REQUESTED,
|
|
|
|
|
&ret_error)) {
|
|
|
|
|
dbus_g_method_return_error (context, ret_error);
|
|
|
|
|
g_clear_error (&ret_error);
|
|
|
|
|
} else
|
|
|
|
|
dbus_g_method_return (context);
|
2010-06-04 00:42:10 -07:00
|
|
|
|
|
|
|
|
done:
|
|
|
|
|
nm_auth_chain_unref (chain);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
impl_manager_deactivate_connection (NMManager *self,
|
|
|
|
|
const char *active_path,
|
|
|
|
|
DBusGMethodInvocation *context)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
NMConnection *connection = NULL;
|
|
|
|
|
GError *error = NULL;
|
|
|
|
|
GSList *iter;
|
|
|
|
|
NMAuthChain *chain;
|
|
|
|
|
gulong sender_uid = G_MAXULONG;
|
2010-11-18 13:47:04 -06:00
|
|
|
char *error_desc = NULL;
|
2010-06-04 00:42:10 -07:00
|
|
|
|
|
|
|
|
/* Check for device connections first */
|
|
|
|
|
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
|
|
|
|
|
NMActRequest *req;
|
|
|
|
|
const char *req_path = NULL;
|
|
|
|
|
|
|
|
|
|
req = nm_device_get_act_request (NM_DEVICE (iter->data));
|
|
|
|
|
if (req)
|
|
|
|
|
req_path = nm_act_request_get_active_connection_path (req);
|
|
|
|
|
|
|
|
|
|
if (req_path && !strcmp (active_path, req_path)) {
|
|
|
|
|
connection = nm_act_request_get_connection (req);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Maybe it's a VPN */
|
|
|
|
|
if (!connection)
|
|
|
|
|
connection = nm_vpn_manager_get_connection_for_active (priv->vpn_manager, active_path);
|
|
|
|
|
|
|
|
|
|
if (!connection) {
|
|
|
|
|
error = g_error_new_literal (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_CONNECTION_NOT_ACTIVE,
|
|
|
|
|
"The connection was not active.");
|
|
|
|
|
dbus_g_method_return_error (context, error);
|
|
|
|
|
g_error_free (error);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Need to check the caller's permissions and stuff before we can
|
|
|
|
|
* deactivate the connection.
|
|
|
|
|
*/
|
2010-07-13 18:09:56 -04:00
|
|
|
if (!nm_auth_get_caller_uid (context,
|
|
|
|
|
priv->dbus_mgr,
|
|
|
|
|
&sender_uid,
|
|
|
|
|
&error_desc)) {
|
2010-06-04 00:42:10 -07:00
|
|
|
error = g_error_new_literal (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_PERMISSION_DENIED,
|
|
|
|
|
error_desc);
|
|
|
|
|
dbus_g_method_return_error (context, error);
|
|
|
|
|
g_error_free (error);
|
2010-11-18 13:47:04 -06:00
|
|
|
g_free (error_desc);
|
2010-06-04 00:42:10 -07:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Yay for root */
|
|
|
|
|
if (0 == sender_uid) {
|
|
|
|
|
if (!nm_manager_deactivate_connection (self,
|
|
|
|
|
active_path,
|
|
|
|
|
NM_DEVICE_STATE_REASON_USER_REQUESTED,
|
|
|
|
|
&error)) {
|
|
|
|
|
dbus_g_method_return_error (context, error);
|
|
|
|
|
g_clear_error (&error);
|
|
|
|
|
} else
|
|
|
|
|
dbus_g_method_return (context);
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Otherwise validate the user request */
|
|
|
|
|
chain = nm_auth_chain_new (priv->authority, context, NULL, deactivate_net_auth_done_cb, self);
|
|
|
|
|
g_assert (chain);
|
|
|
|
|
priv->auth_chains = g_slist_append (priv->auth_chains, chain);
|
|
|
|
|
|
|
|
|
|
nm_auth_chain_set_data (chain, "path", g_strdup (active_path), g_free);
|
|
|
|
|
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_NETWORK_CONTROL, TRUE);
|
2007-10-03 14:48:25 +00:00
|
|
|
}
|
|
|
|
|
|
2010-05-22 08:55:30 -07:00
|
|
|
static void
|
|
|
|
|
do_sleep_wake (NMManager *self)
|
2007-02-08 15:34:26 +00:00
|
|
|
{
|
2010-05-22 08:55:30 -07:00
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
const GSList *unmanaged_specs;
|
2009-06-11 00:39:12 -04:00
|
|
|
GSList *iter;
|
2007-02-08 15:34:26 +00:00
|
|
|
|
2010-05-22 08:55:30 -07:00
|
|
|
if (manager_sleeping (self)) {
|
|
|
|
|
nm_log_info (LOGD_SUSPEND, "sleeping or disabling...");
|
2007-02-08 15:34:26 +00:00
|
|
|
|
|
|
|
|
/* Just deactivate and down all devices from the device list,
|
2010-05-22 08:55:30 -07:00
|
|
|
* to keep things fast the device list will get resynced when
|
|
|
|
|
* the manager wakes up.
|
2007-02-08 15:34:26 +00:00
|
|
|
*/
|
2008-04-29 15:19:31 +00:00
|
|
|
for (iter = priv->devices; iter; iter = iter->next)
|
2008-10-11 19:57:45 +00:00
|
|
|
nm_device_set_managed (NM_DEVICE (iter->data), FALSE, NM_DEVICE_STATE_REASON_SLEEPING);
|
2009-06-11 00:39:12 -04:00
|
|
|
|
2010-05-22 08:55:30 -07:00
|
|
|
} else {
|
|
|
|
|
nm_log_info (LOGD_SUSPEND, "waking up and re-enabling...");
|
2007-02-08 15:34:26 +00:00
|
|
|
|
2010-10-27 20:05:23 -05:00
|
|
|
unmanaged_specs = nm_settings_get_unmanaged_specs (priv->settings);
|
2009-06-11 00:39:12 -04:00
|
|
|
|
2009-11-24 10:43:43 -08:00
|
|
|
/* Ensure rfkill state is up-to-date since we don't respond to state
|
|
|
|
|
* changes during sleep.
|
|
|
|
|
*/
|
2009-12-23 00:03:45 -08:00
|
|
|
nm_manager_rfkill_update (self, RFKILL_TYPE_UNKNOWN);
|
2009-11-24 10:43:43 -08:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
/* Re-manage managed devices */
|
|
|
|
|
for (iter = priv->devices; iter; iter = iter->next) {
|
|
|
|
|
NMDevice *device = NM_DEVICE (iter->data);
|
2009-12-23 00:03:45 -08:00
|
|
|
guint i;
|
2009-11-20 09:11:46 -08:00
|
|
|
|
|
|
|
|
/* enable/disable wireless devices since that we don't respond
|
|
|
|
|
* to killswitch changes during sleep.
|
|
|
|
|
*/
|
2009-12-23 00:03:45 -08:00
|
|
|
for (i = 0; i < RFKILL_TYPE_MAX; i++) {
|
|
|
|
|
RadioState *rstate = &priv->radio_states[i];
|
2010-09-01 17:08:10 -05:00
|
|
|
gboolean enabled = radio_enabled_for_rstate (rstate);
|
2010-03-25 11:36:19 -07:00
|
|
|
RfKillType devtype = RFKILL_TYPE_UNKNOWN;
|
2009-12-23 00:03:45 -08:00
|
|
|
|
2010-04-08 18:23:43 -07:00
|
|
|
if (rstate->desc) {
|
2010-09-01 17:08:10 -05:00
|
|
|
nm_log_dbg (LOGD_RFKILL, "%s %s devices (hw_enabled %d, sw_enabled %d, user_enabled %d)",
|
2010-04-08 18:23:43 -07:00
|
|
|
enabled ? "enabling" : "disabling",
|
2010-09-01 17:08:10 -05:00
|
|
|
rstate->desc, rstate->hw_enabled, rstate->sw_enabled, rstate->user_enabled);
|
2010-04-08 18:23:43 -07:00
|
|
|
}
|
|
|
|
|
|
2010-03-25 11:36:19 -07:00
|
|
|
g_object_get (G_OBJECT (device), NM_DEVICE_INTERFACE_RFKILL_TYPE, &devtype, NULL);
|
|
|
|
|
if (devtype == rstate->rtype)
|
2009-12-28 15:20:02 -06:00
|
|
|
nm_device_interface_set_enabled (NM_DEVICE_INTERFACE (device), enabled);
|
2009-12-23 00:03:45 -08:00
|
|
|
}
|
2009-06-11 00:39:12 -04:00
|
|
|
|
2009-09-16 13:18:24 +02:00
|
|
|
nm_device_clear_autoconnect_inhibit (device);
|
2009-06-11 00:39:12 -04:00
|
|
|
if (nm_device_interface_spec_match_list (NM_DEVICE_INTERFACE (device), unmanaged_specs))
|
|
|
|
|
nm_device_set_managed (device, FALSE, NM_DEVICE_STATE_REASON_NOW_UNMANAGED);
|
|
|
|
|
else
|
|
|
|
|
nm_device_set_managed (device, TRUE, NM_DEVICE_STATE_REASON_NOW_MANAGED);
|
2008-05-22 14:27:40 +00:00
|
|
|
}
|
2009-06-11 00:39:12 -04:00
|
|
|
|
|
|
|
|
/* Ask for new bluetooth devices */
|
|
|
|
|
bluez_manager_resync_devices (self);
|
2007-02-08 15:34:26 +00:00
|
|
|
}
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
nm_manager_update_state (self);
|
2010-05-22 08:55:30 -07:00
|
|
|
}
|
|
|
|
|
|
2010-05-29 23:00:46 -07:00
|
|
|
static gboolean
|
2010-05-30 08:30:37 -07:00
|
|
|
return_no_pk_error (PolkitAuthority *authority,
|
|
|
|
|
const char *detail,
|
|
|
|
|
DBusGMethodInvocation *context)
|
2010-05-29 23:00:46 -07:00
|
|
|
{
|
|
|
|
|
GError *error;
|
|
|
|
|
|
|
|
|
|
if (!authority) {
|
|
|
|
|
error = g_error_new (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_PERMISSION_DENIED,
|
|
|
|
|
"%s request failed: PolicyKit not initialized",
|
|
|
|
|
detail);
|
|
|
|
|
dbus_g_method_return_error (context, error);
|
|
|
|
|
g_error_free (error);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2010-05-29 23:11:45 -07:00
|
|
|
static void
|
|
|
|
|
_internal_sleep (NMManager *self, gboolean do_sleep)
|
2010-05-22 08:55:30 -07:00
|
|
|
{
|
2010-05-29 23:11:45 -07:00
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
2010-05-22 08:55:30 -07:00
|
|
|
|
2010-08-31 15:45:55 -05:00
|
|
|
if (priv->sleeping == do_sleep)
|
|
|
|
|
return;
|
|
|
|
|
|
2010-05-22 08:55:30 -07:00
|
|
|
nm_log_info (LOGD_SUSPEND, "%s requested (sleeping: %s enabled: %s)",
|
2010-05-28 13:06:14 -07:00
|
|
|
do_sleep ? "sleep" : "wake",
|
2010-05-22 08:55:30 -07:00
|
|
|
priv->sleeping ? "yes" : "no",
|
|
|
|
|
priv->net_enabled ? "yes" : "no");
|
|
|
|
|
|
2010-05-28 13:06:14 -07:00
|
|
|
priv->sleeping = do_sleep;
|
2010-05-22 08:55:30 -07:00
|
|
|
|
|
|
|
|
do_sleep_wake (self);
|
2009-10-20 15:25:04 -07:00
|
|
|
|
|
|
|
|
g_object_notify (G_OBJECT (self), NM_MANAGER_SLEEPING);
|
2010-05-29 23:11:45 -07:00
|
|
|
}
|
|
|
|
|
|
2010-10-15 10:28:38 -05:00
|
|
|
#if 0
|
2010-05-29 23:11:45 -07:00
|
|
|
static void
|
|
|
|
|
sleep_auth_done_cb (NMAuthChain *chain,
|
|
|
|
|
GError *error,
|
|
|
|
|
DBusGMethodInvocation *context,
|
|
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMManager *self = NM_MANAGER (user_data);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
GError *ret_error;
|
|
|
|
|
NMAuthCallResult result;
|
|
|
|
|
gboolean do_sleep;
|
|
|
|
|
|
|
|
|
|
priv->auth_chains = g_slist_remove (priv->auth_chains, chain);
|
2010-06-02 02:16:14 -07:00
|
|
|
|
|
|
|
|
result = GPOINTER_TO_UINT (nm_auth_chain_get_data (chain, NM_AUTH_PERMISSION_SLEEP_WAKE));
|
2010-05-29 23:11:45 -07:00
|
|
|
if (error) {
|
2010-08-31 15:45:55 -05:00
|
|
|
nm_log_dbg (LOGD_SUSPEND, "Sleep/wake request failed: %s", error->message);
|
2010-05-29 23:11:45 -07:00
|
|
|
ret_error = g_error_new (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_PERMISSION_DENIED,
|
|
|
|
|
"Sleep/wake request failed: %s",
|
|
|
|
|
error->message);
|
|
|
|
|
dbus_g_method_return_error (context, ret_error);
|
|
|
|
|
g_error_free (ret_error);
|
|
|
|
|
} else if (result != NM_AUTH_CALL_RESULT_YES) {
|
|
|
|
|
ret_error = g_error_new_literal (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_PERMISSION_DENIED,
|
|
|
|
|
"Not authorized to sleep/wake");
|
|
|
|
|
dbus_g_method_return_error (context, ret_error);
|
|
|
|
|
g_error_free (ret_error);
|
|
|
|
|
} else {
|
2010-06-02 02:16:14 -07:00
|
|
|
/* Auth success */
|
|
|
|
|
do_sleep = GPOINTER_TO_UINT (nm_auth_chain_get_data (chain, "sleep"));
|
2010-05-29 23:11:45 -07:00
|
|
|
_internal_sleep (self, do_sleep);
|
|
|
|
|
dbus_g_method_return (context);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nm_auth_chain_unref (chain);
|
|
|
|
|
}
|
2010-10-15 10:28:38 -05:00
|
|
|
#endif
|
2010-05-29 23:11:45 -07:00
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
impl_manager_sleep (NMManager *self,
|
|
|
|
|
gboolean do_sleep,
|
|
|
|
|
DBusGMethodInvocation *context)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv;
|
2010-05-30 08:30:37 -07:00
|
|
|
GError *error = NULL;
|
2010-10-15 10:28:38 -05:00
|
|
|
#if 0
|
|
|
|
|
NMAuthChain *chain;
|
2010-05-31 09:45:26 -07:00
|
|
|
gulong sender_uid = G_MAXULONG;
|
2010-05-30 08:30:37 -07:00
|
|
|
const char *error_desc = NULL;
|
2010-10-15 10:28:38 -05:00
|
|
|
#endif
|
2010-05-29 23:11:45 -07:00
|
|
|
|
|
|
|
|
g_return_if_fail (NM_IS_MANAGER (self));
|
|
|
|
|
|
|
|
|
|
priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
|
|
|
|
|
if (priv->sleeping == do_sleep) {
|
|
|
|
|
error = g_error_new (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_ALREADY_ASLEEP_OR_AWAKE,
|
|
|
|
|
"Already %s", do_sleep ? "asleep" : "awake");
|
|
|
|
|
dbus_g_method_return_error (context, error);
|
|
|
|
|
g_error_free (error);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2010-10-15 10:28:38 -05:00
|
|
|
/* Unconditionally allow the request. Previously it was polkit protected
|
|
|
|
|
* but unfortunately that doesn't work for short-lived processes like
|
|
|
|
|
* pm-utils. It uses dbus-send without --print-reply, which quits
|
|
|
|
|
* immediately after sending the request, and NM is unable to obtain the
|
|
|
|
|
* sender's UID as dbus-send has already dropped off the bus. Thus NM
|
|
|
|
|
* fails the request. Instead, don't validate the request, but rely on
|
|
|
|
|
* D-Bus permissions to restrict the call to root.
|
|
|
|
|
*/
|
|
|
|
|
_internal_sleep (self, do_sleep);
|
|
|
|
|
dbus_g_method_return (context);
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
#if 0
|
2010-05-31 09:45:26 -07:00
|
|
|
if (!nm_auth_get_caller_uid (context, priv->dbus_mgr, &sender_uid, &error_desc)) {
|
2010-05-30 08:30:37 -07:00
|
|
|
error = g_error_new_literal (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_PERMISSION_DENIED,
|
|
|
|
|
error_desc);
|
|
|
|
|
dbus_g_method_return_error (context, error);
|
|
|
|
|
g_error_free (error);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Root doesn't need PK authentication */
|
2010-05-31 09:45:26 -07:00
|
|
|
if (0 == sender_uid) {
|
2010-05-30 08:30:37 -07:00
|
|
|
_internal_sleep (self, do_sleep);
|
|
|
|
|
dbus_g_method_return (context);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2010-06-02 11:20:38 -07:00
|
|
|
if (!return_no_pk_error (priv->authority, "Sleep/wake", context))
|
2010-05-29 23:11:45 -07:00
|
|
|
return;
|
|
|
|
|
|
2010-06-03 13:03:07 -07:00
|
|
|
chain = nm_auth_chain_new (priv->authority, context, NULL, sleep_auth_done_cb, self);
|
2010-05-29 23:11:45 -07:00
|
|
|
g_assert (chain);
|
|
|
|
|
priv->auth_chains = g_slist_append (priv->auth_chains, chain);
|
|
|
|
|
|
|
|
|
|
nm_auth_chain_set_data (chain, "sleep", GUINT_TO_POINTER (do_sleep), NULL);
|
|
|
|
|
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_SLEEP_WAKE, TRUE);
|
2010-10-15 10:28:38 -05:00
|
|
|
#endif
|
2007-02-12 09:23:43 +00:00
|
|
|
}
|
|
|
|
|
|
2010-08-31 15:45:55 -05:00
|
|
|
static void
|
|
|
|
|
upower_sleeping_cb (DBusGProxy *proxy, gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
nm_log_dbg (LOGD_SUSPEND, "Received UPower sleeping signal");
|
|
|
|
|
_internal_sleep (NM_MANAGER (user_data), TRUE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
upower_resuming_cb (DBusGProxy *proxy, gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
nm_log_dbg (LOGD_SUSPEND, "Received UPower resuming signal");
|
|
|
|
|
_internal_sleep (NM_MANAGER (user_data), FALSE);
|
|
|
|
|
}
|
|
|
|
|
|
2010-05-29 23:00:46 -07:00
|
|
|
static void
|
|
|
|
|
_internal_enable (NMManager *self, gboolean enable)
|
2010-05-22 08:55:30 -07:00
|
|
|
{
|
2010-05-29 23:00:46 -07:00
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
GError *err = NULL;
|
2010-05-22 08:55:30 -07:00
|
|
|
|
|
|
|
|
/* Update "NetworkingEnabled" key in state file */
|
|
|
|
|
if (priv->state_file) {
|
|
|
|
|
if (!write_value_to_state_file (priv->state_file,
|
|
|
|
|
"main", "NetworkingEnabled",
|
|
|
|
|
G_TYPE_BOOLEAN, (gpointer) &enable,
|
|
|
|
|
&err)) {
|
|
|
|
|
/* Not a hard error */
|
|
|
|
|
nm_log_warn (LOGD_SUSPEND, "writing to state file %s failed: (%d) %s.",
|
|
|
|
|
priv->state_file,
|
|
|
|
|
err ? err->code : -1,
|
|
|
|
|
(err && err->message) ? err->message : "unknown");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nm_log_info (LOGD_SUSPEND, "%s requested (sleeping: %s enabled: %s)",
|
|
|
|
|
enable ? "enable" : "disable",
|
|
|
|
|
priv->sleeping ? "yes" : "no",
|
|
|
|
|
priv->net_enabled ? "yes" : "no");
|
|
|
|
|
|
|
|
|
|
priv->net_enabled = enable;
|
|
|
|
|
|
|
|
|
|
do_sleep_wake (self);
|
|
|
|
|
|
|
|
|
|
g_object_notify (G_OBJECT (self), NM_MANAGER_NETWORKING_ENABLED);
|
2010-05-29 23:00:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
enable_net_done_cb (NMAuthChain *chain,
|
|
|
|
|
GError *error,
|
|
|
|
|
DBusGMethodInvocation *context,
|
|
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMManager *self = NM_MANAGER (user_data);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
GError *ret_error;
|
|
|
|
|
NMAuthCallResult result;
|
|
|
|
|
gboolean enable;
|
|
|
|
|
|
|
|
|
|
priv->auth_chains = g_slist_remove (priv->auth_chains, chain);
|
2010-06-02 02:16:14 -07:00
|
|
|
|
|
|
|
|
result = GPOINTER_TO_UINT (nm_auth_chain_get_data (chain, NM_AUTH_PERMISSION_ENABLE_DISABLE_NETWORK));
|
2010-05-29 23:00:46 -07:00
|
|
|
if (error) {
|
|
|
|
|
nm_log_dbg (LOGD_CORE, "Enable request failed: %s", error->message);
|
|
|
|
|
ret_error = g_error_new (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_PERMISSION_DENIED,
|
|
|
|
|
"Enable request failed: %s",
|
|
|
|
|
error->message);
|
|
|
|
|
dbus_g_method_return_error (context, ret_error);
|
|
|
|
|
g_error_free (ret_error);
|
|
|
|
|
} else if (result != NM_AUTH_CALL_RESULT_YES) {
|
|
|
|
|
ret_error = g_error_new_literal (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_PERMISSION_DENIED,
|
|
|
|
|
"Not authorized to enable/disable networking");
|
|
|
|
|
dbus_g_method_return_error (context, ret_error);
|
|
|
|
|
g_error_free (ret_error);
|
|
|
|
|
} else {
|
2010-06-02 02:16:14 -07:00
|
|
|
/* Auth success */
|
|
|
|
|
enable = GPOINTER_TO_UINT (nm_auth_chain_get_data (chain, "enable"));
|
2010-05-29 23:00:46 -07:00
|
|
|
_internal_enable (self, enable);
|
|
|
|
|
dbus_g_method_return (context);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nm_auth_chain_unref (chain);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
impl_manager_enable (NMManager *self,
|
|
|
|
|
gboolean enable,
|
|
|
|
|
DBusGMethodInvocation *context)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv;
|
|
|
|
|
NMAuthChain *chain;
|
2010-05-30 08:30:37 -07:00
|
|
|
GError *error = NULL;
|
2010-05-31 09:45:26 -07:00
|
|
|
gulong sender_uid = G_MAXULONG;
|
2010-11-18 13:47:04 -06:00
|
|
|
char *error_desc = NULL;
|
2010-05-29 23:00:46 -07:00
|
|
|
|
|
|
|
|
g_return_if_fail (NM_IS_MANAGER (self));
|
|
|
|
|
|
|
|
|
|
priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
|
|
|
|
|
if (priv->net_enabled == enable) {
|
|
|
|
|
error = g_error_new (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_ALREADY_ENABLED_OR_DISABLED,
|
|
|
|
|
"Already %s", enable ? "enabled" : "disabled");
|
|
|
|
|
dbus_g_method_return_error (context, error);
|
|
|
|
|
g_error_free (error);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2010-05-31 09:45:26 -07:00
|
|
|
if (!nm_auth_get_caller_uid (context, priv->dbus_mgr, &sender_uid, &error_desc)) {
|
2010-05-30 08:30:37 -07:00
|
|
|
error = g_error_new_literal (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_PERMISSION_DENIED,
|
|
|
|
|
error_desc);
|
|
|
|
|
dbus_g_method_return_error (context, error);
|
|
|
|
|
g_error_free (error);
|
2010-11-18 13:47:04 -06:00
|
|
|
g_free (error_desc);
|
2010-05-30 08:30:37 -07:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Root doesn't need PK authentication */
|
2010-05-31 09:45:26 -07:00
|
|
|
if (0 == sender_uid) {
|
2010-05-30 08:30:37 -07:00
|
|
|
_internal_enable (self, enable);
|
|
|
|
|
dbus_g_method_return (context);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2010-06-02 11:20:38 -07:00
|
|
|
if (!return_no_pk_error (priv->authority, "Enable/disable", context))
|
2010-05-29 23:00:46 -07:00
|
|
|
return;
|
|
|
|
|
|
2010-06-03 13:03:07 -07:00
|
|
|
chain = nm_auth_chain_new (priv->authority, context, NULL, enable_net_done_cb, self);
|
2010-05-29 23:00:46 -07:00
|
|
|
g_assert (chain);
|
|
|
|
|
priv->auth_chains = g_slist_append (priv->auth_chains, chain);
|
|
|
|
|
|
|
|
|
|
nm_auth_chain_set_data (chain, "enable", GUINT_TO_POINTER (enable), NULL);
|
|
|
|
|
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_ENABLE_DISABLE_NETWORK, TRUE);
|
2010-05-22 08:55:30 -07:00
|
|
|
}
|
|
|
|
|
|
2010-05-28 18:23:00 -07:00
|
|
|
/* Permissions */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
pk_authority_changed_cb (GObject *object, gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
/* Let clients know they should re-check their authorization */
|
|
|
|
|
g_signal_emit (NM_MANAGER (user_data), signals[CHECK_PERMISSIONS], 0);
|
|
|
|
|
}
|
|
|
|
|
|
2010-06-02 02:16:14 -07:00
|
|
|
static void
|
|
|
|
|
get_perm_add_result (NMAuthChain *chain, GHashTable *results, const char *permission)
|
|
|
|
|
{
|
|
|
|
|
NMAuthCallResult result;
|
|
|
|
|
|
|
|
|
|
result = GPOINTER_TO_UINT (nm_auth_chain_get_data (chain, permission));
|
|
|
|
|
if (result == NM_AUTH_CALL_RESULT_YES)
|
|
|
|
|
g_hash_table_insert (results, (char *) permission, "yes");
|
|
|
|
|
else if (result == NM_AUTH_CALL_RESULT_NO)
|
|
|
|
|
g_hash_table_insert (results, (char *) permission, "no");
|
|
|
|
|
else if (result == NM_AUTH_CALL_RESULT_AUTH)
|
|
|
|
|
g_hash_table_insert (results, (char *) permission, "auth");
|
|
|
|
|
else {
|
|
|
|
|
nm_log_dbg (LOGD_CORE, "unknown auth chain result %d", result);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-05-28 18:23:00 -07:00
|
|
|
static void
|
|
|
|
|
get_permissions_done_cb (NMAuthChain *chain,
|
|
|
|
|
GError *error,
|
|
|
|
|
DBusGMethodInvocation *context,
|
2010-05-29 23:00:46 -07:00
|
|
|
gpointer user_data)
|
2010-05-28 18:23:00 -07:00
|
|
|
{
|
|
|
|
|
NMManager *self = NM_MANAGER (user_data);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
GError *ret_error;
|
2010-06-02 02:16:14 -07:00
|
|
|
GHashTable *results;
|
2010-05-28 18:23:00 -07:00
|
|
|
|
|
|
|
|
priv->auth_chains = g_slist_remove (priv->auth_chains, chain);
|
|
|
|
|
if (error) {
|
|
|
|
|
nm_log_dbg (LOGD_CORE, "Permissions request failed: %s", error->message);
|
|
|
|
|
ret_error = g_error_new (NM_MANAGER_ERROR,
|
|
|
|
|
NM_MANAGER_ERROR_PERMISSION_DENIED,
|
|
|
|
|
"Permissions request failed: %s",
|
|
|
|
|
error->message);
|
|
|
|
|
dbus_g_method_return_error (context, ret_error);
|
|
|
|
|
g_error_free (ret_error);
|
|
|
|
|
} else {
|
2010-06-02 02:16:14 -07:00
|
|
|
results = g_hash_table_new (g_str_hash, g_str_equal);
|
|
|
|
|
get_perm_add_result (chain, results, NM_AUTH_PERMISSION_ENABLE_DISABLE_NETWORK);
|
|
|
|
|
get_perm_add_result (chain, results, NM_AUTH_PERMISSION_SLEEP_WAKE);
|
|
|
|
|
get_perm_add_result (chain, results, NM_AUTH_PERMISSION_ENABLE_DISABLE_WIFI);
|
|
|
|
|
get_perm_add_result (chain, results, NM_AUTH_PERMISSION_ENABLE_DISABLE_WWAN);
|
2010-06-02 02:23:51 -07:00
|
|
|
get_perm_add_result (chain, results, NM_AUTH_PERMISSION_NETWORK_CONTROL);
|
2010-08-26 14:26:12 -05:00
|
|
|
get_perm_add_result (chain, results, NM_AUTH_PERMISSION_WIFI_SHARE_PROTECTED);
|
|
|
|
|
get_perm_add_result (chain, results, NM_AUTH_PERMISSION_WIFI_SHARE_OPEN);
|
|
|
|
|
get_perm_add_result (chain, results, NM_AUTH_PERMISSION_SETTINGS_CONNECTION_MODIFY);
|
|
|
|
|
get_perm_add_result (chain, results, NM_AUTH_PERMISSION_SETTINGS_HOSTNAME_MODIFY);
|
2010-06-02 02:16:14 -07:00
|
|
|
dbus_g_method_return (context, results);
|
|
|
|
|
g_hash_table_destroy (results);
|
2010-05-28 18:23:00 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nm_auth_chain_unref (chain);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
impl_manager_get_permissions (NMManager *self,
|
|
|
|
|
DBusGMethodInvocation *context)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
NMAuthChain *chain;
|
|
|
|
|
|
2010-06-02 11:20:38 -07:00
|
|
|
if (!return_no_pk_error (priv->authority, "Permissions", context))
|
2010-05-28 18:23:00 -07:00
|
|
|
return;
|
|
|
|
|
|
2010-06-03 13:03:07 -07:00
|
|
|
chain = nm_auth_chain_new (priv->authority, context, NULL, get_permissions_done_cb, self);
|
2010-05-28 18:23:00 -07:00
|
|
|
g_assert (chain);
|
|
|
|
|
priv->auth_chains = g_slist_append (priv->auth_chains, chain);
|
|
|
|
|
|
2010-05-29 23:00:46 -07:00
|
|
|
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_ENABLE_DISABLE_NETWORK, FALSE);
|
2010-05-29 23:11:45 -07:00
|
|
|
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_SLEEP_WAKE, FALSE);
|
2010-05-29 23:00:46 -07:00
|
|
|
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_ENABLE_DISABLE_WIFI, FALSE);
|
|
|
|
|
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_ENABLE_DISABLE_WWAN, FALSE);
|
2010-06-02 02:23:51 -07:00
|
|
|
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_NETWORK_CONTROL, FALSE);
|
2010-08-26 14:26:12 -05:00
|
|
|
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_WIFI_SHARE_PROTECTED, FALSE);
|
|
|
|
|
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_WIFI_SHARE_OPEN, FALSE);
|
|
|
|
|
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_SETTINGS_CONNECTION_MODIFY, FALSE);
|
|
|
|
|
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_SETTINGS_HOSTNAME_MODIFY, FALSE);
|
2010-05-28 18:23:00 -07:00
|
|
|
}
|
|
|
|
|
|
2007-08-15 07:52:25 +00:00
|
|
|
/* Legacy 0.6 compatibility interface */
|
|
|
|
|
|
2010-05-29 23:11:45 -07:00
|
|
|
static void
|
|
|
|
|
impl_manager_legacy_sleep (NMManager *manager, DBusGMethodInvocation *context)
|
2007-08-15 07:52:25 +00:00
|
|
|
{
|
2010-05-29 23:11:45 -07:00
|
|
|
return impl_manager_sleep (manager, TRUE, context);
|
2007-08-15 07:52:25 +00:00
|
|
|
}
|
|
|
|
|
|
2010-05-29 23:11:45 -07:00
|
|
|
static void
|
|
|
|
|
impl_manager_legacy_wake (NMManager *manager, DBusGMethodInvocation *context)
|
2007-08-15 07:52:25 +00:00
|
|
|
{
|
2010-05-29 23:11:45 -07:00
|
|
|
return impl_manager_sleep (manager, FALSE, context);
|
2007-08-15 07:52:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
2007-09-24 21:26:56 +00:00
|
|
|
impl_manager_legacy_state (NMManager *manager, guint32 *state, GError **err)
|
2007-08-15 07:52:25 +00:00
|
|
|
{
|
2007-09-25 16:47:53 +00:00
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
|
|
|
|
|
|
|
|
|
|
nm_manager_update_state (manager);
|
|
|
|
|
*state = priv->state;
|
2007-09-24 21:26:56 +00:00
|
|
|
return TRUE;
|
2007-08-15 07:52:25 +00:00
|
|
|
}
|
|
|
|
|
|
2010-04-08 08:56:17 -07:00
|
|
|
static gboolean
|
|
|
|
|
impl_manager_set_logging (NMManager *manager,
|
|
|
|
|
const char *level,
|
|
|
|
|
const char *domains,
|
|
|
|
|
GError **error)
|
|
|
|
|
{
|
|
|
|
|
if (nm_logging_setup (level, domains, error)) {
|
2010-05-04 12:06:00 -07:00
|
|
|
char *new_domains = nm_logging_domains_to_string ();
|
|
|
|
|
|
|
|
|
|
nm_log_info (LOGD_CORE, "logging: level '%s' domains '%s'",
|
|
|
|
|
nm_logging_level_to_string (),
|
|
|
|
|
new_domains);
|
|
|
|
|
g_free (new_domains);
|
2010-04-08 08:56:17 -07:00
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
2007-08-15 07:52:25 +00:00
|
|
|
|
2008-03-26 13:43:01 +00:00
|
|
|
GPtrArray *
|
|
|
|
|
nm_manager_get_active_connections_by_connection (NMManager *manager,
|
|
|
|
|
NMConnection *connection)
|
|
|
|
|
{
|
|
|
|
|
return get_active_connections (manager, connection);
|
|
|
|
|
}
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
void
|
|
|
|
|
nm_manager_start (NMManager *self)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
2009-12-23 00:03:45 -08:00
|
|
|
guint i;
|
2009-06-11 00:39:12 -04:00
|
|
|
|
2009-12-23 00:03:45 -08:00
|
|
|
/* Set initial radio enabled/disabled state */
|
|
|
|
|
for (i = 0; i < RFKILL_TYPE_MAX; i++) {
|
|
|
|
|
RadioState *rstate = &priv->radio_states[i];
|
2010-09-01 17:08:10 -05:00
|
|
|
RfKillState udev_state;
|
2009-06-11 00:39:12 -04:00
|
|
|
|
2009-12-23 00:03:45 -08:00
|
|
|
if (!rstate->desc)
|
|
|
|
|
continue;
|
|
|
|
|
|
2010-09-01 17:08:10 -05:00
|
|
|
udev_state = nm_udev_manager_get_rfkill_state (priv->udev_mgr, i);
|
|
|
|
|
update_rstate_from_rfkill (rstate, udev_state);
|
2009-06-11 00:39:12 -04:00
|
|
|
|
2010-09-01 17:08:10 -05:00
|
|
|
if (rstate->desc) {
|
|
|
|
|
nm_log_info (LOGD_RFKILL, "%s %s by radio killswitch; %s by state file",
|
|
|
|
|
rstate->desc,
|
|
|
|
|
(rstate->hw_enabled && rstate->sw_enabled) ? "enabled" : "disabled",
|
|
|
|
|
rstate->user_enabled ? "enabled" : "disabled");
|
|
|
|
|
}
|
|
|
|
|
manager_update_radio_enabled (self, rstate);
|
2009-12-23 00:03:45 -08:00
|
|
|
}
|
2009-06-11 00:39:12 -04:00
|
|
|
|
2010-05-22 08:55:30 -07:00
|
|
|
/* Log overall networking status - enabled/disabled */
|
2010-04-08 18:23:43 -07:00
|
|
|
nm_log_info (LOGD_CORE, "Networking is %s by state file",
|
2010-05-22 08:55:30 -07:00
|
|
|
priv->net_enabled ? "enabled" : "disabled");
|
2010-04-08 18:23:43 -07:00
|
|
|
|
2010-10-27 15:47:10 -05:00
|
|
|
system_unmanaged_devices_changed_cb (priv->settings, NULL, self);
|
|
|
|
|
system_hostname_changed_cb (priv->settings, NULL, self);
|
2009-06-11 00:39:12 -04:00
|
|
|
|
|
|
|
|
nm_udev_manager_query_devices (priv->udev_mgr);
|
|
|
|
|
bluez_manager_resync_devices (self);
|
|
|
|
|
}
|
|
|
|
|
|
2010-07-01 10:32:11 -07:00
|
|
|
static gboolean
|
|
|
|
|
handle_firmware_changed (gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMManager *self = NM_MANAGER (user_data);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
GSList *iter;
|
|
|
|
|
|
|
|
|
|
priv->fw_changed_id = 0;
|
|
|
|
|
|
|
|
|
|
if (manager_sleeping (self))
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
/* Try to re-enable devices with missing firmware */
|
|
|
|
|
for (iter = priv->devices; iter; iter = iter->next) {
|
|
|
|
|
NMDevice *candidate = NM_DEVICE (iter->data);
|
|
|
|
|
NMDeviceState state = nm_device_get_state (candidate);
|
|
|
|
|
|
|
|
|
|
if ( nm_device_get_firmware_missing (candidate)
|
|
|
|
|
&& (state == NM_DEVICE_STATE_UNAVAILABLE)) {
|
|
|
|
|
nm_log_info (LOGD_CORE, "(%s): firmware may now be available",
|
|
|
|
|
nm_device_get_iface (candidate));
|
|
|
|
|
|
|
|
|
|
/* Re-set unavailable state to try bringing the device up again */
|
|
|
|
|
nm_device_state_changed (candidate,
|
|
|
|
|
NM_DEVICE_STATE_UNAVAILABLE,
|
|
|
|
|
NM_DEVICE_STATE_REASON_NONE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
firmware_dir_changed (GFileMonitor *monitor,
|
|
|
|
|
GFile *file,
|
|
|
|
|
GFile *other_file,
|
|
|
|
|
GFileMonitorEvent event_type,
|
|
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMManager *self = NM_MANAGER (user_data);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
|
|
|
|
|
switch (event_type) {
|
|
|
|
|
case G_FILE_MONITOR_EVENT_CREATED:
|
|
|
|
|
case G_FILE_MONITOR_EVENT_CHANGED:
|
2010-07-12 18:21:27 -07:00
|
|
|
#if GLIB_CHECK_VERSION(2,23,4)
|
2010-07-01 10:32:11 -07:00
|
|
|
case G_FILE_MONITOR_EVENT_MOVED:
|
2010-07-12 18:21:27 -07:00
|
|
|
#endif
|
2010-07-01 10:32:11 -07:00
|
|
|
case G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED:
|
|
|
|
|
case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT:
|
|
|
|
|
if (!priv->fw_changed_id) {
|
|
|
|
|
priv->fw_changed_id = g_timeout_add_seconds (4, handle_firmware_changed, self);
|
|
|
|
|
nm_log_info (LOGD_CORE, "kernel firmware directory '%s' changed",
|
|
|
|
|
KERNEL_FIRMWARE_DIR);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-08-25 15:12:32 -05:00
|
|
|
#define PERM_DENIED_ERROR "org.freedesktop.NetworkManager.PermissionDenied"
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
prop_set_auth_done_cb (NMAuthChain *chain,
|
|
|
|
|
GError *error,
|
|
|
|
|
DBusGMethodInvocation *context,
|
|
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMManager *self = NM_MANAGER (user_data);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
DBusGConnection *bus;
|
|
|
|
|
DBusConnection *dbus_connection;
|
|
|
|
|
NMAuthCallResult result;
|
|
|
|
|
DBusMessage *reply, *request;
|
|
|
|
|
const char *permission, *prop;
|
|
|
|
|
gboolean set_enabled = TRUE;
|
|
|
|
|
|
|
|
|
|
priv->auth_chains = g_slist_remove (priv->auth_chains, chain);
|
|
|
|
|
|
|
|
|
|
request = nm_auth_chain_get_data (chain, "message");
|
|
|
|
|
permission = nm_auth_chain_get_data (chain, "permission");
|
|
|
|
|
prop = nm_auth_chain_get_data (chain, "prop");
|
|
|
|
|
set_enabled = GPOINTER_TO_UINT (nm_auth_chain_get_data (chain, "enabled"));
|
|
|
|
|
|
|
|
|
|
if (error) {
|
|
|
|
|
reply = dbus_message_new_error (request, PERM_DENIED_ERROR,
|
|
|
|
|
"Not authorized to perform this operation");
|
|
|
|
|
} else {
|
|
|
|
|
/* Caller has had a chance to obtain authorization, so we only need to
|
|
|
|
|
* check for 'yes' here.
|
|
|
|
|
*/
|
|
|
|
|
result = GPOINTER_TO_UINT (nm_auth_chain_get_data (chain, permission));
|
|
|
|
|
if (result != NM_AUTH_CALL_RESULT_YES) {
|
|
|
|
|
reply = dbus_message_new_error (request, PERM_DENIED_ERROR,
|
|
|
|
|
"Not authorized to perform this operation");
|
|
|
|
|
} else {
|
|
|
|
|
g_object_set (self, prop, set_enabled, NULL);
|
|
|
|
|
reply = dbus_message_new_method_return (request);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (reply) {
|
|
|
|
|
bus = nm_dbus_manager_get_connection (priv->dbus_mgr);
|
|
|
|
|
g_assert (bus);
|
|
|
|
|
dbus_connection = dbus_g_connection_get_connection (bus);
|
|
|
|
|
g_assert (dbus_connection);
|
|
|
|
|
|
|
|
|
|
dbus_connection_send (dbus_connection, reply, NULL);
|
|
|
|
|
dbus_message_unref (reply);
|
|
|
|
|
}
|
|
|
|
|
nm_auth_chain_unref (chain);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static DBusHandlerResult
|
|
|
|
|
prop_filter (DBusConnection *connection,
|
|
|
|
|
DBusMessage *message,
|
|
|
|
|
void *user_data)
|
|
|
|
|
{
|
|
|
|
|
NMManager *self = NM_MANAGER (user_data);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
DBusMessageIter iter;
|
|
|
|
|
DBusMessageIter sub;
|
|
|
|
|
const char *propiface = NULL;
|
|
|
|
|
const char *propname = NULL;
|
|
|
|
|
const char *sender = NULL;
|
|
|
|
|
const char *glib_propname = NULL, *permission = NULL;
|
|
|
|
|
DBusError dbus_error;
|
|
|
|
|
gulong uid = G_MAXULONG;
|
|
|
|
|
DBusMessage *reply = NULL;
|
|
|
|
|
gboolean set_enabled = FALSE;
|
|
|
|
|
NMAuthChain *chain;
|
|
|
|
|
|
|
|
|
|
/* The sole purpose of this function is to validate property accesses
|
|
|
|
|
* on the NMManager object since dbus-glib doesn't yet give us this
|
|
|
|
|
* functionality.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
if (!dbus_message_is_method_call (message, DBUS_INTERFACE_PROPERTIES, "Set"))
|
|
|
|
|
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
|
|
|
|
|
|
|
|
|
dbus_message_iter_init (message, &iter);
|
|
|
|
|
|
|
|
|
|
/* Get the D-Bus interface of the property to set */
|
|
|
|
|
if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_STRING)
|
|
|
|
|
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
|
|
|
|
dbus_message_iter_get_basic (&iter, &propiface);
|
|
|
|
|
if (!propiface || strcmp (propiface, NM_DBUS_INTERFACE))
|
|
|
|
|
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
|
|
|
|
dbus_message_iter_next (&iter);
|
|
|
|
|
|
|
|
|
|
/* Get the property name that's going to be set */
|
|
|
|
|
if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_STRING)
|
|
|
|
|
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
|
|
|
|
dbus_message_iter_get_basic (&iter, &propname);
|
|
|
|
|
dbus_message_iter_next (&iter);
|
|
|
|
|
|
|
|
|
|
if (!strcmp (propname, "WirelessEnabled")) {
|
|
|
|
|
glib_propname = NM_MANAGER_WIRELESS_ENABLED;
|
|
|
|
|
permission = NM_AUTH_PERMISSION_ENABLE_DISABLE_WIFI;
|
|
|
|
|
} else if (!strcmp (propname, "WwanEnabled")) {
|
|
|
|
|
glib_propname = NM_MANAGER_WWAN_ENABLED;
|
|
|
|
|
permission = NM_AUTH_PERMISSION_ENABLE_DISABLE_WWAN;
|
|
|
|
|
} else
|
|
|
|
|
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
|
|
|
|
|
|
|
|
|
/* Get the new value for the property */
|
|
|
|
|
if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_VARIANT)
|
|
|
|
|
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
|
|
|
|
dbus_message_iter_recurse (&iter, &sub);
|
|
|
|
|
if (dbus_message_iter_get_arg_type (&sub) != DBUS_TYPE_BOOLEAN)
|
|
|
|
|
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
|
|
|
|
dbus_message_iter_get_basic (&sub, &set_enabled);
|
|
|
|
|
|
|
|
|
|
sender = dbus_message_get_sender (message);
|
|
|
|
|
if (!sender) {
|
|
|
|
|
reply = dbus_message_new_error (message, PERM_DENIED_ERROR,
|
|
|
|
|
"Could not determine D-Bus requestor");
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dbus_error_init (&dbus_error);
|
|
|
|
|
uid = dbus_bus_get_unix_user (connection, sender, &dbus_error);
|
|
|
|
|
if (dbus_error_is_set (&dbus_error)) {
|
|
|
|
|
reply = dbus_message_new_error (message, PERM_DENIED_ERROR,
|
|
|
|
|
"Could not determine the user ID of the requestor");
|
|
|
|
|
dbus_error_free (&dbus_error);
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (uid > 0) {
|
|
|
|
|
/* Otherwise validate the user request */
|
|
|
|
|
chain = nm_auth_chain_new_raw_message (priv->authority, message, prop_set_auth_done_cb, self);
|
|
|
|
|
g_assert (chain);
|
|
|
|
|
priv->auth_chains = g_slist_append (priv->auth_chains, chain);
|
|
|
|
|
nm_auth_chain_set_data (chain, "prop", g_strdup (glib_propname), g_free);
|
|
|
|
|
nm_auth_chain_set_data (chain, "permission", g_strdup (permission), g_free);
|
|
|
|
|
nm_auth_chain_set_data (chain, "enabled", GUINT_TO_POINTER (set_enabled), NULL);
|
|
|
|
|
nm_auth_chain_set_data (chain, "message", dbus_message_ref (message), (GDestroyNotify) dbus_message_unref);
|
|
|
|
|
nm_auth_chain_add_call (chain, permission, TRUE);
|
|
|
|
|
} else {
|
|
|
|
|
/* Yay for root */
|
|
|
|
|
g_object_set (self, glib_propname, set_enabled, NULL);
|
|
|
|
|
reply = dbus_message_new_method_return (message);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
if (reply) {
|
|
|
|
|
dbus_connection_send (connection, reply, NULL);
|
|
|
|
|
dbus_message_unref (reply);
|
|
|
|
|
}
|
|
|
|
|
return DBUS_HANDLER_RESULT_HANDLED;
|
|
|
|
|
}
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
NMManager *
|
2010-10-27 20:05:23 -05:00
|
|
|
nm_manager_get (NMSettings *settings,
|
2010-10-27 15:47:10 -05:00
|
|
|
const char *config_file,
|
2009-11-02 17:29:53 -08:00
|
|
|
const char *plugins,
|
|
|
|
|
const char *state_file,
|
|
|
|
|
gboolean initial_net_enabled,
|
|
|
|
|
gboolean initial_wifi_enabled,
|
2009-12-22 23:51:08 -08:00
|
|
|
gboolean initial_wwan_enabled,
|
2009-11-02 17:29:53 -08:00
|
|
|
GError **error)
|
2009-06-11 00:39:12 -04:00
|
|
|
{
|
|
|
|
|
static NMManager *singleton = NULL;
|
|
|
|
|
NMManagerPrivate *priv;
|
2009-08-10 23:25:11 -05:00
|
|
|
DBusGConnection *bus;
|
2010-08-25 15:12:32 -05:00
|
|
|
DBusConnection *dbus_connection;
|
2009-06-11 00:39:12 -04:00
|
|
|
|
|
|
|
|
if (singleton)
|
|
|
|
|
return g_object_ref (singleton);
|
|
|
|
|
|
2010-10-27 15:47:10 -05:00
|
|
|
g_assert (settings);
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
singleton = (NMManager *) g_object_new (NM_TYPE_MANAGER, NULL);
|
|
|
|
|
g_assert (singleton);
|
|
|
|
|
|
|
|
|
|
priv = NM_MANAGER_GET_PRIVATE (singleton);
|
|
|
|
|
|
2009-08-10 23:25:11 -05:00
|
|
|
bus = nm_dbus_manager_get_connection (priv->dbus_mgr);
|
|
|
|
|
g_assert (bus);
|
2010-08-25 15:12:32 -05:00
|
|
|
dbus_connection = dbus_g_connection_get_connection (bus);
|
|
|
|
|
g_assert (dbus_connection);
|
|
|
|
|
|
|
|
|
|
if (!dbus_connection_add_filter (dbus_connection, prop_filter, singleton, NULL)) {
|
|
|
|
|
nm_log_err (LOGD_CORE, "failed to register DBus connection filter");
|
|
|
|
|
g_object_unref (singleton);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2009-08-10 23:25:11 -05:00
|
|
|
|
2010-10-27 16:50:57 -05:00
|
|
|
priv->settings = g_object_ref (settings);
|
2009-06-11 00:39:12 -04:00
|
|
|
|
2010-12-13 13:11:51 -06:00
|
|
|
priv->agent_mgr = nm_agent_manager_new (priv->dbus_mgr);
|
|
|
|
|
|
2009-07-09 11:06:31 -04:00
|
|
|
priv->config_file = g_strdup (config_file);
|
2009-11-02 17:29:53 -08:00
|
|
|
priv->state_file = g_strdup (state_file);
|
|
|
|
|
|
2010-05-22 08:55:30 -07:00
|
|
|
priv->net_enabled = initial_net_enabled;
|
2009-11-02 17:29:53 -08:00
|
|
|
|
2010-09-01 17:08:10 -05:00
|
|
|
priv->radio_states[RFKILL_TYPE_WLAN].user_enabled = initial_wifi_enabled;
|
|
|
|
|
priv->radio_states[RFKILL_TYPE_WWAN].user_enabled = initial_wwan_enabled;
|
2009-11-02 17:29:53 -08:00
|
|
|
|
2010-10-27 20:05:23 -05:00
|
|
|
g_signal_connect (priv->settings, "notify::" NM_SETTINGS_UNMANAGED_SPECS,
|
2009-06-11 00:39:12 -04:00
|
|
|
G_CALLBACK (system_unmanaged_devices_changed_cb), singleton);
|
2010-10-27 20:05:23 -05:00
|
|
|
g_signal_connect (priv->settings, "notify::" NM_SETTINGS_HOSTNAME,
|
2009-06-11 00:39:12 -04:00
|
|
|
G_CALLBACK (system_hostname_changed_cb), singleton);
|
2010-10-27 20:05:23 -05:00
|
|
|
g_signal_connect (priv->settings, NM_SETTINGS_CONNECTION_ADDED,
|
2010-10-27 15:47:10 -05:00
|
|
|
G_CALLBACK (connections_changed), singleton);
|
2010-10-27 20:05:23 -05:00
|
|
|
g_signal_connect (priv->settings, NM_SETTINGS_CONNECTION_UPDATED,
|
2010-10-27 15:47:10 -05:00
|
|
|
G_CALLBACK (connections_changed), singleton);
|
2010-10-27 20:05:23 -05:00
|
|
|
g_signal_connect (priv->settings, NM_SETTINGS_CONNECTION_REMOVED,
|
2010-10-27 15:47:10 -05:00
|
|
|
G_CALLBACK (connections_changed), singleton);
|
2010-10-27 20:05:23 -05:00
|
|
|
g_signal_connect (priv->settings, NM_SETTINGS_CONNECTION_VISIBILITY_CHANGED,
|
2010-10-27 15:47:10 -05:00
|
|
|
G_CALLBACK (connections_changed), singleton);
|
2009-06-11 00:39:12 -04:00
|
|
|
|
2010-10-27 20:05:23 -05:00
|
|
|
dbus_g_connection_register_g_object (bus, NM_DBUS_PATH, G_OBJECT (singleton));
|
2009-06-11 00:39:12 -04:00
|
|
|
|
|
|
|
|
priv->udev_mgr = nm_udev_manager_new ();
|
|
|
|
|
g_signal_connect (priv->udev_mgr,
|
|
|
|
|
"device-added",
|
|
|
|
|
G_CALLBACK (udev_device_added_cb),
|
|
|
|
|
singleton);
|
|
|
|
|
g_signal_connect (priv->udev_mgr,
|
|
|
|
|
"device-removed",
|
|
|
|
|
G_CALLBACK (udev_device_removed_cb),
|
|
|
|
|
singleton);
|
|
|
|
|
g_signal_connect (priv->udev_mgr,
|
|
|
|
|
"rfkill-changed",
|
|
|
|
|
G_CALLBACK (udev_manager_rfkill_changed_cb),
|
|
|
|
|
singleton);
|
|
|
|
|
|
|
|
|
|
priv->bluez_mgr = nm_bluez_manager_get ();
|
|
|
|
|
|
|
|
|
|
g_signal_connect (priv->bluez_mgr,
|
|
|
|
|
"bdaddr-added",
|
|
|
|
|
G_CALLBACK (bluez_manager_bdaddr_added_cb),
|
|
|
|
|
singleton);
|
|
|
|
|
|
|
|
|
|
g_signal_connect (priv->bluez_mgr,
|
|
|
|
|
"bdaddr-removed",
|
|
|
|
|
G_CALLBACK (bluez_manager_bdaddr_removed_cb),
|
|
|
|
|
singleton);
|
|
|
|
|
|
|
|
|
|
return singleton;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
dispose (GObject *object)
|
|
|
|
|
{
|
|
|
|
|
NMManager *manager = NM_MANAGER (object);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
|
2010-08-25 15:12:32 -05:00
|
|
|
DBusGConnection *bus;
|
|
|
|
|
DBusConnection *dbus_connection;
|
2009-06-11 00:39:12 -04:00
|
|
|
|
|
|
|
|
if (priv->disposed) {
|
|
|
|
|
G_OBJECT_CLASS (nm_manager_parent_class)->dispose (object);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
priv->disposed = TRUE;
|
|
|
|
|
|
2010-05-28 18:23:00 -07:00
|
|
|
g_slist_foreach (priv->auth_chains, (GFunc) nm_auth_chain_unref, NULL);
|
|
|
|
|
g_slist_free (priv->auth_chains);
|
|
|
|
|
g_object_unref (priv->authority);
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
while (g_slist_length (priv->devices)) {
|
2009-09-10 17:49:11 -07:00
|
|
|
priv->devices = remove_one_device (manager,
|
|
|
|
|
priv->devices,
|
|
|
|
|
NM_DEVICE (priv->devices->data),
|
2010-08-11 17:26:33 -05:00
|
|
|
TRUE);
|
2009-06-11 00:39:12 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g_free (priv->hostname);
|
2009-07-09 11:06:31 -04:00
|
|
|
g_free (priv->config_file);
|
2009-06-11 00:39:12 -04:00
|
|
|
|
2010-10-27 15:47:10 -05:00
|
|
|
g_object_unref (priv->settings);
|
2009-06-11 00:39:12 -04:00
|
|
|
|
2010-12-13 13:11:51 -06:00
|
|
|
g_object_unref (priv->agent_mgr);
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
if (priv->vpn_manager_id) {
|
|
|
|
|
g_source_remove (priv->vpn_manager_id);
|
|
|
|
|
priv->vpn_manager_id = 0;
|
|
|
|
|
}
|
|
|
|
|
g_object_unref (priv->vpn_manager);
|
|
|
|
|
|
|
|
|
|
if (priv->modem_added_id) {
|
|
|
|
|
g_source_remove (priv->modem_added_id);
|
|
|
|
|
priv->modem_added_id = 0;
|
|
|
|
|
}
|
|
|
|
|
if (priv->modem_removed_id) {
|
|
|
|
|
g_source_remove (priv->modem_removed_id);
|
|
|
|
|
priv->modem_removed_id = 0;
|
|
|
|
|
}
|
|
|
|
|
g_object_unref (priv->modem_manager);
|
|
|
|
|
|
2010-08-25 15:12:32 -05:00
|
|
|
/* Unregister property filter */
|
|
|
|
|
bus = nm_dbus_manager_get_connection (priv->dbus_mgr);
|
|
|
|
|
g_assert (bus);
|
|
|
|
|
dbus_connection = dbus_g_connection_get_connection (bus);
|
|
|
|
|
g_assert (dbus_connection);
|
|
|
|
|
dbus_connection_remove_filter (dbus_connection, prop_filter, manager);
|
2009-06-11 00:39:12 -04:00
|
|
|
g_object_unref (priv->dbus_mgr);
|
2010-08-25 15:12:32 -05:00
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
if (priv->bluez_mgr)
|
|
|
|
|
g_object_unref (priv->bluez_mgr);
|
|
|
|
|
|
2010-08-31 15:47:16 -05:00
|
|
|
if (priv->aipd_proxy)
|
|
|
|
|
g_object_unref (priv->aipd_proxy);
|
|
|
|
|
|
2010-08-31 15:45:55 -05:00
|
|
|
if (priv->upower_proxy)
|
|
|
|
|
g_object_unref (priv->upower_proxy);
|
|
|
|
|
|
2010-07-01 10:32:11 -07:00
|
|
|
if (priv->fw_monitor) {
|
|
|
|
|
if (priv->fw_monitor_id)
|
|
|
|
|
g_signal_handler_disconnect (priv->fw_monitor, priv->fw_monitor_id);
|
|
|
|
|
|
|
|
|
|
if (priv->fw_changed_id)
|
|
|
|
|
g_source_remove (priv->fw_changed_id);
|
|
|
|
|
|
|
|
|
|
g_file_monitor_cancel (priv->fw_monitor);
|
|
|
|
|
g_object_unref (priv->fw_monitor);
|
|
|
|
|
}
|
|
|
|
|
|
2010-10-19 11:10:17 +02:00
|
|
|
if (priv->timestamp_update_id) {
|
|
|
|
|
g_source_remove (priv->timestamp_update_id);
|
|
|
|
|
priv->timestamp_update_id = 0;
|
|
|
|
|
}
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
G_OBJECT_CLASS (nm_manager_parent_class)->dispose (object);
|
|
|
|
|
}
|
|
|
|
|
|
2010-09-01 17:08:10 -05:00
|
|
|
static void
|
|
|
|
|
manager_radio_user_toggled (NMManager *self,
|
|
|
|
|
RadioState *rstate,
|
|
|
|
|
gboolean enabled)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
GError *error = NULL;
|
|
|
|
|
gboolean old_enabled, new_enabled;
|
|
|
|
|
|
|
|
|
|
if (rstate->desc) {
|
|
|
|
|
nm_log_dbg (LOGD_RFKILL, "(%s): setting radio %s by user",
|
|
|
|
|
rstate->desc,
|
|
|
|
|
enabled ? "enabled" : "disabled");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Update enabled key in state file */
|
|
|
|
|
if (priv->state_file) {
|
|
|
|
|
if (!write_value_to_state_file (priv->state_file,
|
|
|
|
|
"main", rstate->key,
|
|
|
|
|
G_TYPE_BOOLEAN, (gpointer) &enabled,
|
|
|
|
|
&error)) {
|
|
|
|
|
nm_log_warn (LOGD_CORE, "writing to state file %s failed: (%d) %s.",
|
|
|
|
|
priv->state_file,
|
|
|
|
|
error ? error->code : -1,
|
|
|
|
|
(error && error->message) ? error->message : "unknown");
|
|
|
|
|
g_clear_error (&error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
old_enabled = radio_enabled_for_rstate (rstate);
|
|
|
|
|
rstate->user_enabled = enabled;
|
|
|
|
|
new_enabled = radio_enabled_for_rstate (rstate);
|
|
|
|
|
if (new_enabled != old_enabled)
|
|
|
|
|
manager_update_radio_enabled (self, rstate);
|
|
|
|
|
}
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
static void
|
|
|
|
|
set_property (GObject *object, guint prop_id,
|
|
|
|
|
const GValue *value, GParamSpec *pspec)
|
|
|
|
|
{
|
2009-12-23 00:03:45 -08:00
|
|
|
NMManager *self = NM_MANAGER (object);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
switch (prop_id) {
|
2010-05-22 08:55:30 -07:00
|
|
|
case PROP_NETWORKING_ENABLED:
|
|
|
|
|
/* Construct only for now */
|
|
|
|
|
priv->net_enabled = g_value_get_boolean (value);
|
|
|
|
|
break;
|
2009-06-11 00:39:12 -04:00
|
|
|
case PROP_WIRELESS_ENABLED:
|
2010-09-01 17:08:10 -05:00
|
|
|
manager_radio_user_toggled (NM_MANAGER (object),
|
|
|
|
|
&priv->radio_states[RFKILL_TYPE_WLAN],
|
|
|
|
|
g_value_get_boolean (value));
|
2009-06-11 00:39:12 -04:00
|
|
|
break;
|
2009-12-23 00:18:18 -08:00
|
|
|
case PROP_WWAN_ENABLED:
|
2010-09-01 17:08:10 -05:00
|
|
|
manager_radio_user_toggled (NM_MANAGER (object),
|
|
|
|
|
&priv->radio_states[RFKILL_TYPE_WWAN],
|
|
|
|
|
g_value_get_boolean (value));
|
2009-06-11 00:39:12 -04:00
|
|
|
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)
|
|
|
|
|
{
|
|
|
|
|
NMManager *self = NM_MANAGER (object);
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
|
|
|
|
|
|
|
|
switch (prop_id) {
|
2010-09-27 10:34:56 +02:00
|
|
|
case PROP_VERSION:
|
|
|
|
|
g_value_set_string (value, VERSION);
|
|
|
|
|
break;
|
2009-06-11 00:39:12 -04:00
|
|
|
case PROP_STATE:
|
|
|
|
|
nm_manager_update_state (self);
|
|
|
|
|
g_value_set_uint (value, priv->state);
|
|
|
|
|
break;
|
2010-05-22 08:55:30 -07:00
|
|
|
case PROP_NETWORKING_ENABLED:
|
|
|
|
|
g_value_set_boolean (value, priv->net_enabled);
|
|
|
|
|
break;
|
2009-06-11 00:39:12 -04:00
|
|
|
case PROP_WIRELESS_ENABLED:
|
2010-09-01 17:08:10 -05:00
|
|
|
g_value_set_boolean (value, radio_enabled_for_type (self, RFKILL_TYPE_WLAN));
|
2009-06-11 00:39:12 -04:00
|
|
|
break;
|
|
|
|
|
case PROP_WIRELESS_HARDWARE_ENABLED:
|
2009-12-23 00:03:45 -08:00
|
|
|
g_value_set_boolean (value, priv->radio_states[RFKILL_TYPE_WLAN].hw_enabled);
|
2009-06-11 00:39:12 -04:00
|
|
|
break;
|
2009-12-23 00:18:18 -08:00
|
|
|
case PROP_WWAN_ENABLED:
|
2010-09-01 17:08:10 -05:00
|
|
|
g_value_set_boolean (value, radio_enabled_for_type (self, RFKILL_TYPE_WWAN));
|
2009-12-23 00:18:18 -08:00
|
|
|
break;
|
|
|
|
|
case PROP_WWAN_HARDWARE_ENABLED:
|
|
|
|
|
g_value_set_boolean (value, priv->radio_states[RFKILL_TYPE_WWAN].hw_enabled);
|
2009-06-11 00:39:12 -04:00
|
|
|
break;
|
|
|
|
|
case PROP_ACTIVE_CONNECTIONS:
|
|
|
|
|
g_value_take_boxed (value, get_active_connections (self, NULL));
|
|
|
|
|
break;
|
|
|
|
|
case PROP_HOSTNAME:
|
|
|
|
|
g_value_set_string (value, priv->hostname);
|
|
|
|
|
break;
|
2009-10-20 15:25:04 -07:00
|
|
|
case PROP_SLEEPING:
|
|
|
|
|
g_value_set_boolean (value, priv->sleeping);
|
|
|
|
|
break;
|
2009-06-11 00:39:12 -04:00
|
|
|
default:
|
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-10-19 11:10:17 +02:00
|
|
|
static gboolean
|
|
|
|
|
periodic_update_active_connection_timestamps (gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMManager *manager = NM_MANAGER (user_data);
|
|
|
|
|
GPtrArray *active;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
active = get_active_connections (manager, NULL);
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < active->len; i++) {
|
|
|
|
|
const char *active_path = g_ptr_array_index (active, i);
|
|
|
|
|
NMActRequest *req;
|
|
|
|
|
NMDevice *device = NULL;
|
|
|
|
|
|
|
|
|
|
req = nm_manager_get_act_request_by_path (manager, active_path, &device);
|
|
|
|
|
if (device && nm_device_get_state (device) == NM_DEVICE_STATE_ACTIVATED)
|
|
|
|
|
update_active_connection_timestamp (manager, device);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
static void
|
|
|
|
|
nm_manager_init (NMManager *manager)
|
|
|
|
|
{
|
|
|
|
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
|
|
|
|
|
DBusGConnection *g_connection;
|
2009-12-23 00:03:45 -08:00
|
|
|
guint id, i;
|
2010-07-01 10:32:11 -07:00
|
|
|
GFile *file;
|
2010-08-17 09:35:41 -05:00
|
|
|
GError *error = NULL;
|
2009-12-23 00:03:45 -08:00
|
|
|
|
|
|
|
|
/* Initialize rfkill structures and states */
|
|
|
|
|
memset (priv->radio_states, 0, sizeof (priv->radio_states));
|
|
|
|
|
|
2010-09-01 17:08:10 -05:00
|
|
|
priv->radio_states[RFKILL_TYPE_WLAN].user_enabled = TRUE;
|
2009-12-23 00:03:45 -08:00
|
|
|
priv->radio_states[RFKILL_TYPE_WLAN].key = "WirelessEnabled";
|
|
|
|
|
priv->radio_states[RFKILL_TYPE_WLAN].prop = NM_MANAGER_WIRELESS_ENABLED;
|
|
|
|
|
priv->radio_states[RFKILL_TYPE_WLAN].hw_prop = NM_MANAGER_WIRELESS_HARDWARE_ENABLED;
|
|
|
|
|
priv->radio_states[RFKILL_TYPE_WLAN].desc = "WiFi";
|
|
|
|
|
priv->radio_states[RFKILL_TYPE_WLAN].other_enabled_func = nm_manager_get_ipw_rfkill_state;
|
2010-03-25 11:36:19 -07:00
|
|
|
priv->radio_states[RFKILL_TYPE_WLAN].rtype = RFKILL_TYPE_WLAN;
|
2009-12-23 00:03:45 -08:00
|
|
|
|
2010-09-01 17:08:10 -05:00
|
|
|
priv->radio_states[RFKILL_TYPE_WWAN].user_enabled = TRUE;
|
2009-12-23 00:18:18 -08:00
|
|
|
priv->radio_states[RFKILL_TYPE_WWAN].key = "WWANEnabled";
|
|
|
|
|
priv->radio_states[RFKILL_TYPE_WWAN].prop = NM_MANAGER_WWAN_ENABLED;
|
|
|
|
|
priv->radio_states[RFKILL_TYPE_WWAN].hw_prop = NM_MANAGER_WWAN_HARDWARE_ENABLED;
|
|
|
|
|
priv->radio_states[RFKILL_TYPE_WWAN].desc = "WWAN";
|
|
|
|
|
priv->radio_states[RFKILL_TYPE_WWAN].other_enabled_func = nm_manager_get_modem_enabled_state;
|
2010-03-25 11:36:19 -07:00
|
|
|
priv->radio_states[RFKILL_TYPE_WWAN].rtype = RFKILL_TYPE_WWAN;
|
2009-12-23 00:18:18 -08:00
|
|
|
|
2010-09-01 17:08:10 -05:00
|
|
|
priv->radio_states[RFKILL_TYPE_WIMAX].user_enabled = TRUE;
|
2010-04-08 18:23:43 -07:00
|
|
|
priv->radio_states[RFKILL_TYPE_WIMAX].key = "WiMAXEnabled";
|
|
|
|
|
priv->radio_states[RFKILL_TYPE_WIMAX].prop = NULL;
|
|
|
|
|
priv->radio_states[RFKILL_TYPE_WIMAX].hw_prop = NULL;
|
|
|
|
|
priv->radio_states[RFKILL_TYPE_WIMAX].desc = "WiMAX";
|
|
|
|
|
priv->radio_states[RFKILL_TYPE_WIMAX].other_enabled_func = NULL;
|
|
|
|
|
priv->radio_states[RFKILL_TYPE_WIMAX].rtype = RFKILL_TYPE_WIMAX;
|
|
|
|
|
|
2009-12-23 00:03:45 -08:00
|
|
|
for (i = 0; i < RFKILL_TYPE_MAX; i++)
|
|
|
|
|
priv->radio_states[i].hw_enabled = TRUE;
|
2009-06-11 00:39:12 -04:00
|
|
|
|
|
|
|
|
priv->sleeping = FALSE;
|
|
|
|
|
priv->state = NM_STATE_DISCONNECTED;
|
|
|
|
|
|
|
|
|
|
priv->dbus_mgr = nm_dbus_manager_get ();
|
|
|
|
|
|
|
|
|
|
priv->modem_manager = nm_modem_manager_get ();
|
2009-10-04 23:35:20 -07:00
|
|
|
priv->modem_added_id = g_signal_connect (priv->modem_manager, "modem-added",
|
2009-06-11 00:39:12 -04:00
|
|
|
G_CALLBACK (modem_added), manager);
|
2009-10-04 23:35:20 -07:00
|
|
|
priv->modem_removed_id = g_signal_connect (priv->modem_manager, "modem-removed",
|
2009-06-11 00:39:12 -04:00
|
|
|
G_CALLBACK (modem_removed), manager);
|
|
|
|
|
|
|
|
|
|
priv->vpn_manager = nm_vpn_manager_get ();
|
|
|
|
|
id = g_signal_connect (G_OBJECT (priv->vpn_manager), "connection-deactivated",
|
|
|
|
|
G_CALLBACK (vpn_manager_connection_deactivated_cb), manager);
|
|
|
|
|
priv->vpn_manager_id = id;
|
|
|
|
|
|
|
|
|
|
g_connection = nm_dbus_manager_get_connection (priv->dbus_mgr);
|
|
|
|
|
|
|
|
|
|
/* avahi-autoipd stuff */
|
|
|
|
|
priv->aipd_proxy = dbus_g_proxy_new_for_name (g_connection,
|
|
|
|
|
NM_AUTOIP_DBUS_SERVICE,
|
|
|
|
|
"/",
|
|
|
|
|
NM_AUTOIP_DBUS_IFACE);
|
|
|
|
|
if (priv->aipd_proxy) {
|
|
|
|
|
dbus_g_object_register_marshaller (_nm_marshal_VOID__STRING_STRING_STRING,
|
|
|
|
|
G_TYPE_NONE,
|
|
|
|
|
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
|
|
|
|
|
G_TYPE_INVALID);
|
|
|
|
|
|
|
|
|
|
dbus_g_proxy_add_signal (priv->aipd_proxy,
|
|
|
|
|
"Event",
|
|
|
|
|
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
|
|
|
|
|
G_TYPE_INVALID);
|
|
|
|
|
|
|
|
|
|
dbus_g_proxy_connect_signal (priv->aipd_proxy, "Event",
|
|
|
|
|
G_CALLBACK (aipd_handle_event),
|
|
|
|
|
manager,
|
|
|
|
|
NULL);
|
|
|
|
|
} else
|
2010-04-06 16:20:11 -07:00
|
|
|
nm_log_warn (LOGD_AUTOIP4, "could not initialize avahi-autoipd D-Bus proxy");
|
2010-05-28 18:23:00 -07:00
|
|
|
|
2010-08-31 15:45:55 -05:00
|
|
|
/* upower sleep/wake handling */
|
|
|
|
|
priv->upower_proxy = dbus_g_proxy_new_for_name (g_connection,
|
|
|
|
|
UPOWER_DBUS_SERVICE,
|
|
|
|
|
"/org/freedesktop/UPower",
|
|
|
|
|
"org.freedesktop.UPower");
|
|
|
|
|
if (priv->upower_proxy) {
|
|
|
|
|
dbus_g_proxy_add_signal (priv->upower_proxy, "Sleeping", G_TYPE_INVALID);
|
|
|
|
|
dbus_g_proxy_connect_signal (priv->upower_proxy, "Sleeping",
|
|
|
|
|
G_CALLBACK (upower_sleeping_cb),
|
|
|
|
|
manager, NULL);
|
|
|
|
|
|
|
|
|
|
dbus_g_proxy_add_signal (priv->upower_proxy, "Resuming", G_TYPE_INVALID);
|
|
|
|
|
dbus_g_proxy_connect_signal (priv->upower_proxy, "Resuming",
|
|
|
|
|
G_CALLBACK (upower_resuming_cb),
|
|
|
|
|
manager, NULL);
|
|
|
|
|
} else
|
|
|
|
|
nm_log_warn (LOGD_SUSPEND, "could not initialize UPower D-Bus proxy");
|
|
|
|
|
|
2010-08-17 09:35:41 -05:00
|
|
|
priv->authority = polkit_authority_get_sync (NULL, &error);
|
2010-05-28 18:23:00 -07:00
|
|
|
if (priv->authority) {
|
|
|
|
|
priv->auth_changed_id = g_signal_connect (priv->authority,
|
|
|
|
|
"changed",
|
|
|
|
|
G_CALLBACK (pk_authority_changed_cb),
|
|
|
|
|
manager);
|
2010-08-17 09:35:41 -05:00
|
|
|
} else {
|
|
|
|
|
nm_log_warn (LOGD_CORE, "failed to create PolicyKit authority: (%d) %s",
|
|
|
|
|
error ? error->code : -1,
|
|
|
|
|
error && error->message ? error->message : "(unknown)");
|
|
|
|
|
g_clear_error (&error);
|
|
|
|
|
}
|
2010-07-01 10:32:11 -07:00
|
|
|
|
|
|
|
|
/* Monitor the firmware directory */
|
|
|
|
|
if (strlen (KERNEL_FIRMWARE_DIR)) {
|
|
|
|
|
file = g_file_new_for_path (KERNEL_FIRMWARE_DIR "/");
|
|
|
|
|
priv->fw_monitor = g_file_monitor_directory (file, G_FILE_MONITOR_NONE, NULL, NULL);
|
|
|
|
|
g_object_unref (file);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (priv->fw_monitor) {
|
|
|
|
|
priv->fw_monitor_id = g_signal_connect (priv->fw_monitor, "changed",
|
|
|
|
|
G_CALLBACK (firmware_dir_changed),
|
|
|
|
|
manager);
|
|
|
|
|
nm_log_info (LOGD_CORE, "monitoring kernel firmware directory '%s'.",
|
|
|
|
|
KERNEL_FIRMWARE_DIR);
|
|
|
|
|
} else {
|
|
|
|
|
nm_log_warn (LOGD_CORE, "failed to monitor kernel firmware directory '%s'.",
|
|
|
|
|
KERNEL_FIRMWARE_DIR);
|
|
|
|
|
}
|
2010-10-19 11:10:17 +02:00
|
|
|
|
|
|
|
|
/* Update timestamps in active connections */
|
|
|
|
|
priv->timestamp_update_id = g_timeout_add_seconds (300, (GSourceFunc) periodic_update_active_connection_timestamps, manager);
|
2009-06-11 00:39:12 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
nm_manager_class_init (NMManagerClass *manager_class)
|
|
|
|
|
{
|
|
|
|
|
GObjectClass *object_class = G_OBJECT_CLASS (manager_class);
|
|
|
|
|
|
|
|
|
|
g_type_class_add_private (manager_class, sizeof (NMManagerPrivate));
|
|
|
|
|
|
|
|
|
|
/* virtual methods */
|
|
|
|
|
object_class->set_property = set_property;
|
|
|
|
|
object_class->get_property = get_property;
|
|
|
|
|
object_class->dispose = dispose;
|
|
|
|
|
|
|
|
|
|
/* properties */
|
2010-09-27 10:34:56 +02:00
|
|
|
g_object_class_install_property
|
|
|
|
|
(object_class, PROP_VERSION,
|
|
|
|
|
g_param_spec_string (NM_MANAGER_VERSION,
|
|
|
|
|
"Version",
|
|
|
|
|
"NetworkManager version",
|
|
|
|
|
NULL,
|
|
|
|
|
G_PARAM_READABLE));
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
g_object_class_install_property
|
|
|
|
|
(object_class, PROP_STATE,
|
|
|
|
|
g_param_spec_uint (NM_MANAGER_STATE,
|
|
|
|
|
"State",
|
|
|
|
|
"Current state",
|
|
|
|
|
0, NM_STATE_DISCONNECTED, 0,
|
|
|
|
|
G_PARAM_READABLE));
|
|
|
|
|
|
2010-05-22 08:55:30 -07:00
|
|
|
g_object_class_install_property
|
|
|
|
|
(object_class, PROP_NETWORKING_ENABLED,
|
|
|
|
|
g_param_spec_boolean (NM_MANAGER_NETWORKING_ENABLED,
|
|
|
|
|
"NetworkingEnabled",
|
|
|
|
|
"Is networking enabled",
|
|
|
|
|
TRUE,
|
|
|
|
|
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
g_object_class_install_property
|
|
|
|
|
(object_class, PROP_WIRELESS_ENABLED,
|
|
|
|
|
g_param_spec_boolean (NM_MANAGER_WIRELESS_ENABLED,
|
|
|
|
|
"WirelessEnabled",
|
|
|
|
|
"Is wireless enabled",
|
|
|
|
|
TRUE,
|
|
|
|
|
G_PARAM_READWRITE));
|
|
|
|
|
|
|
|
|
|
g_object_class_install_property
|
|
|
|
|
(object_class, PROP_WIRELESS_HARDWARE_ENABLED,
|
|
|
|
|
g_param_spec_boolean (NM_MANAGER_WIRELESS_HARDWARE_ENABLED,
|
|
|
|
|
"WirelessHardwareEnabled",
|
|
|
|
|
"RF kill state",
|
|
|
|
|
TRUE,
|
|
|
|
|
G_PARAM_READABLE));
|
|
|
|
|
|
|
|
|
|
g_object_class_install_property
|
2009-12-23 00:18:18 -08:00
|
|
|
(object_class, PROP_WWAN_ENABLED,
|
|
|
|
|
g_param_spec_boolean (NM_MANAGER_WWAN_ENABLED,
|
|
|
|
|
"WwanEnabled",
|
|
|
|
|
"Is mobile broadband enabled",
|
|
|
|
|
TRUE,
|
|
|
|
|
G_PARAM_READWRITE));
|
|
|
|
|
|
|
|
|
|
g_object_class_install_property
|
|
|
|
|
(object_class, PROP_WWAN_HARDWARE_ENABLED,
|
|
|
|
|
g_param_spec_boolean (NM_MANAGER_WWAN_HARDWARE_ENABLED,
|
|
|
|
|
"WwanHardwareEnabled",
|
|
|
|
|
"Whether WWAN is disabled by a hardware switch or not",
|
|
|
|
|
TRUE,
|
|
|
|
|
G_PARAM_READABLE));
|
|
|
|
|
|
|
|
|
|
g_object_class_install_property
|
2009-06-11 00:39:12 -04:00
|
|
|
(object_class, PROP_ACTIVE_CONNECTIONS,
|
|
|
|
|
g_param_spec_boxed (NM_MANAGER_ACTIVE_CONNECTIONS,
|
|
|
|
|
"Active connections",
|
|
|
|
|
"Active connections",
|
|
|
|
|
DBUS_TYPE_G_ARRAY_OF_OBJECT_PATH,
|
|
|
|
|
G_PARAM_READABLE));
|
|
|
|
|
|
|
|
|
|
/* Hostname is not exported over D-Bus */
|
|
|
|
|
g_object_class_install_property
|
|
|
|
|
(object_class, PROP_HOSTNAME,
|
|
|
|
|
g_param_spec_string (NM_MANAGER_HOSTNAME,
|
|
|
|
|
"Hostname",
|
|
|
|
|
"Hostname",
|
|
|
|
|
NULL,
|
|
|
|
|
G_PARAM_READABLE | NM_PROPERTY_PARAM_NO_EXPORT));
|
|
|
|
|
|
2010-05-22 08:55:30 -07:00
|
|
|
/* Sleeping is not exported over D-Bus */
|
2009-10-20 15:25:04 -07:00
|
|
|
g_object_class_install_property
|
|
|
|
|
(object_class, PROP_SLEEPING,
|
|
|
|
|
g_param_spec_boolean (NM_MANAGER_SLEEPING,
|
|
|
|
|
"Sleeping",
|
|
|
|
|
"Sleeping",
|
|
|
|
|
FALSE,
|
|
|
|
|
G_PARAM_READABLE | NM_PROPERTY_PARAM_NO_EXPORT));
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
/* signals */
|
|
|
|
|
signals[DEVICE_ADDED] =
|
|
|
|
|
g_signal_new ("device-added",
|
|
|
|
|
G_OBJECT_CLASS_TYPE (object_class),
|
|
|
|
|
G_SIGNAL_RUN_FIRST,
|
|
|
|
|
G_STRUCT_OFFSET (NMManagerClass, device_added),
|
|
|
|
|
NULL, NULL,
|
|
|
|
|
g_cclosure_marshal_VOID__OBJECT,
|
|
|
|
|
G_TYPE_NONE, 1, G_TYPE_OBJECT);
|
|
|
|
|
|
|
|
|
|
signals[DEVICE_REMOVED] =
|
|
|
|
|
g_signal_new ("device-removed",
|
|
|
|
|
G_OBJECT_CLASS_TYPE (object_class),
|
|
|
|
|
G_SIGNAL_RUN_FIRST,
|
|
|
|
|
G_STRUCT_OFFSET (NMManagerClass, device_removed),
|
|
|
|
|
NULL, NULL,
|
|
|
|
|
g_cclosure_marshal_VOID__OBJECT,
|
|
|
|
|
G_TYPE_NONE, 1, G_TYPE_OBJECT);
|
|
|
|
|
|
|
|
|
|
signals[STATE_CHANGED] =
|
|
|
|
|
g_signal_new ("state-changed",
|
|
|
|
|
G_OBJECT_CLASS_TYPE (object_class),
|
|
|
|
|
G_SIGNAL_RUN_FIRST,
|
|
|
|
|
G_STRUCT_OFFSET (NMManagerClass, state_changed),
|
|
|
|
|
NULL, NULL,
|
|
|
|
|
g_cclosure_marshal_VOID__UINT,
|
|
|
|
|
G_TYPE_NONE, 1, G_TYPE_UINT);
|
|
|
|
|
|
|
|
|
|
signals[PROPERTIES_CHANGED] =
|
|
|
|
|
nm_properties_changed_signal_new (object_class,
|
|
|
|
|
G_STRUCT_OFFSET (NMManagerClass, properties_changed));
|
|
|
|
|
|
2010-05-28 18:23:00 -07:00
|
|
|
signals[CHECK_PERMISSIONS] =
|
|
|
|
|
g_signal_new ("check-permissions",
|
|
|
|
|
G_OBJECT_CLASS_TYPE (object_class),
|
|
|
|
|
G_SIGNAL_RUN_FIRST,
|
|
|
|
|
0, NULL, NULL,
|
|
|
|
|
g_cclosure_marshal_VOID__VOID,
|
|
|
|
|
G_TYPE_NONE, 0);
|
|
|
|
|
|
2010-06-04 13:05:27 -07:00
|
|
|
signals[USER_PERMISSIONS_CHANGED] =
|
|
|
|
|
g_signal_new ("user-permissions-changed",
|
|
|
|
|
G_OBJECT_CLASS_TYPE (object_class),
|
|
|
|
|
G_SIGNAL_RUN_FIRST,
|
|
|
|
|
0, NULL, NULL,
|
|
|
|
|
g_cclosure_marshal_VOID__VOID,
|
|
|
|
|
G_TYPE_NONE, 0);
|
|
|
|
|
|
2009-06-11 00:39:12 -04:00
|
|
|
/* StateChange is DEPRECATED */
|
|
|
|
|
signals[STATE_CHANGE] =
|
|
|
|
|
g_signal_new ("state-change",
|
|
|
|
|
G_OBJECT_CLASS_TYPE (object_class),
|
|
|
|
|
G_SIGNAL_RUN_FIRST,
|
|
|
|
|
0, NULL, NULL,
|
|
|
|
|
g_cclosure_marshal_VOID__UINT,
|
|
|
|
|
G_TYPE_NONE, 1, G_TYPE_UINT);
|
|
|
|
|
|
|
|
|
|
dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (manager_class),
|
|
|
|
|
&dbus_glib_nm_manager_object_info);
|
|
|
|
|
|
|
|
|
|
dbus_g_error_domain_register (NM_MANAGER_ERROR, NULL, NM_TYPE_MANAGER_ERROR);
|
2010-04-08 08:56:17 -07:00
|
|
|
dbus_g_error_domain_register (NM_LOGGING_ERROR, "org.freedesktop.NetworkManager.Logging", NM_TYPE_LOGGING_ERROR);
|
2009-06-11 00:39:12 -04:00
|
|
|
}
|
|
|
|
|
|