diff options
Diffstat (limited to 'extra/networkmanager')
-rw-r--r-- | extra/networkmanager/PKGBUILD | 31 | ||||
-rw-r--r-- | extra/networkmanager/systemd-sleep.patch | 616 |
2 files changed, 632 insertions, 15 deletions
diff --git a/extra/networkmanager/PKGBUILD b/extra/networkmanager/PKGBUILD index 3fea039bb..570f544c0 100644 --- a/extra/networkmanager/PKGBUILD +++ b/extra/networkmanager/PKGBUILD @@ -1,4 +1,5 @@ -# $Id: PKGBUILD 166778 2012-09-19 08:12:49Z heftig $ +# $Id: PKGBUILD 169996 2012-10-30 23:01:16Z heftig $ +# Maintainer: Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> # Maintainer: Jan de Groot <jgc@archlinxu.org> # Contributor: Wael Nasreddine <gandalf@siemens-mobiles.org> # Contributor: Tor Krill <tor@krill.nu> @@ -7,33 +8,34 @@ pkgname=networkmanager _pkgname=NetworkManager -pkgver=0.9.6.0 -pkgrel=2 +pkgver=0.9.6.4 +pkgrel=1 pkgdesc="Network Management daemon" arch=('i686' 'x86_64' 'mips64el') license=('GPL') url="http://www.gnome.org/projects/$_pkgname/" -depends=('dbus-glib' 'iproute2' 'libnl' 'nss' 'polkit' 'udev' 'wpa_supplicant' 'ppp' 'dhcpcd' - 'libsoup') -makedepends=('intltool' 'dhclient' 'iptables' 'gobject-introspection') +depends=(dbus-glib iproute2 libnl nss polkit udev wpa_supplicant ppp dhclient + libsoup systemd) +makedepends=(intltool dhcpcd iptables gobject-introspection) optdepends=('modemmanager: for modem management service' - 'dhclient: alternative DHCP/DHCPv6 client' + 'dhcpcd: alternative DHCP client; does not support DHCPv6' 'iptables: Connection sharing' 'dnsmasq: Connection sharing' 'bluez: Bluetooth support' - 'openresolv: openresolv support') + 'openresolv: resolvconf support') options=('!libtool') backup=('etc/NetworkManager/NetworkManager.conf') install=networkmanager.install source=(http://ftp.gnome.org/pub/gnome/sources/$_pkgname/${pkgver:0:3}/$_pkgname-$pkgver.tar.xz NetworkManager.conf disable_set_hostname.patch dnsmasq-path.patch - nm-polkit-permissive.patch repair-signals.patch) -sha256sums=('3982b623b7b199ac99e2ddd0840fe7d088245a49e3f680237e8baebf0cf86d07' + nm-polkit-permissive.patch repair-signals.patch systemd-sleep.patch) +sha256sums=('511b411e055d187bc8f26c519fdb3e55e07fc40d4adecbbec623c0249380a7eb' '44b048804c7c0b8b3b0c29b8632b6ad613c397d0a1635ec918e10c0fbcdadf21' '25056837ea92e559f09563ed817e3e0cd9333be861b8914e45f62ceaae2e0460' '65124505048cc8396daf0242c9f5d532fa669b4bbca305998c248ab2329490cb' 'e23b651a90ef62d515921953b4c6779538d35a737fb74c266b7fce94d62fdb06' - 'a1c65a09e5e8ecb1004ab7922517aa7fbc9700dc61e3b2fd348d3d7c23808ce6') + 'a1c65a09e5e8ecb1004ab7922517aa7fbc9700dc61e3b2fd348d3d7c23808ce6' + '24c181ab69e769e703e45f64a552add5df5de22fbcd8899d588add053674420a') build() { cd $_pkgname-$pkgver @@ -42,6 +44,8 @@ build() { patch -Np1 -i ../dnsmasq-path.patch patch -Np1 -i ../nm-polkit-permissive.patch patch -Np1 -i ../repair-signals.patch # FS#31115 + patch -Np1 -i ../systemd-sleep.patch + AUTOPOINT="intltoolize -f -c --automake" autoreconf -fi ./configure \ --prefix=/usr \ @@ -56,7 +60,7 @@ build() { --with-systemdsystemunitdir=/usr/lib/systemd/system \ --with-udev-dir=/usr/lib/udev \ --with-resolvconf=/usr/sbin/resolvconf \ - --with-session-tracking=ck \ + --with-session-tracking=systemd \ --disable-static \ --enable-more-warnings=no \ --disable-wimax @@ -71,7 +75,4 @@ package() { install -m644 ../NetworkManager.conf "$pkgdir/etc/NetworkManager/" rm -r "$pkgdir/var/run" - - # Provide native service for arch-daemons generator - ln -s NetworkManager.service "$pkgdir/usr/lib/systemd/system/networkmanager.service" } diff --git a/extra/networkmanager/systemd-sleep.patch b/extra/networkmanager/systemd-sleep.patch new file mode 100644 index 000000000..3470d4654 --- /dev/null +++ b/extra/networkmanager/systemd-sleep.patch @@ -0,0 +1,616 @@ +From b444d31cba5b8ac0c9771cc5a246dfd3af9dfd00 Mon Sep 17 00:00:00 2001 +From: Matthias Clasen <mclasen@redhat.com> +Date: Tue, 9 Oct 2012 00:36:35 -0400 +Subject: [PATCH] core: factor out the upower suspend/resume code (bgo + #677694) + +Factor the code that listens for upower sleeping and resuming +signals out into a class code NMSleepMonitor. + +core: add a systemd suspend/resume monitor (bgo #677694) + +This implementation uses a delay inhibitor to get systemd to +emit PrepareForSleep, and then emits ::Sleeping and ::Resuming +when receiving the before/after PrepareForSleep emissions. + +core: DBusGConnections are not GObjects + +Introduced in 64fd8eea7706038e5d38c8463a1c765ed9331db2. + +core: fix suspend/resume signal names which the manager listens for + +Introduced in 64fd8eea7706038e5d38c8463a1c765ed9331db2; but honestly +I also thought GObject lower-cased signal names since it munges them +for - and _ too. Apparently not. +--- + configure.ac | 2 +- + src/Makefile.am | 9 +- + src/nm-manager.c | 40 +++----- + src/nm-sleep-monitor-systemd.c | 217 +++++++++++++++++++++++++++++++++++++++++ + src/nm-sleep-monitor-upower.c | 151 ++++++++++++++++++++++++++++ + src/nm-sleep-monitor.h | 46 +++++++++ + 6 files changed, 437 insertions(+), 28 deletions(-) + create mode 100644 src/nm-sleep-monitor-systemd.c + create mode 100644 src/nm-sleep-monitor-upower.c + create mode 100644 src/nm-sleep-monitor.h + +diff --git a/configure.ac b/configure.ac +index e76e193..9152c23 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -327,7 +327,7 @@ PKG_CHECK_MODULES(GUDEV, gudev-1.0 >= 147) + AC_SUBST(GUDEV_CFLAGS) + AC_SUBST(GUDEV_LIBS) + +-PKG_CHECK_MODULES(GIO, gio-2.0) ++PKG_CHECK_MODULES(GIO, gio-unix-2.0) + AC_SUBST(GIO_CFLAGS) + AC_SUBST(GIO_LIBS) + +diff --git a/src/Makefile.am b/src/Makefile.am +index b155209..ba7d2d6 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -191,6 +191,7 @@ NetworkManager_SOURCES = \ + nm-session-monitor.h \ + nm-session-utils.c \ + nm-session-utils.h \ ++ nm-sleep-monitor.h \ + nm-connection-provider.h \ + nm-connection-provider.c \ + nm-dispatcher.c \ +@@ -201,13 +202,18 @@ NetworkManager_SOURCES += nm-connectivity.c nm-connectivity.h + endif + + if SESSION_TRACKING_SYSTEMD +-NetworkManager_SOURCES += nm-session-monitor-systemd.c ++NetworkManager_SOURCES += \ ++ nm-session-monitor-systemd.c \ ++ nm-sleep-monitor-systemd.c + else + if SESSION_TRACKING_CK + NetworkManager_SOURCES += nm-session-monitor-ck.c + else + NetworkManager_SOURCES += nm-session-monitor-null.c + endif ++ ++# UPower suspend/resume used whenever systemd is not enabled ++NetworkManager_SOURCES += nm-sleep-monitor-upower.c + endif + + nm-access-point-glue.h: $(top_srcdir)/introspection/nm-access-point.xml +@@ -283,6 +289,7 @@ BUILT_SOURCES = \ + NetworkManager_CPPFLAGS = \ + $(DBUS_CFLAGS) \ + $(GLIB_CFLAGS) \ ++ $(GIO_CFLAGS) \ + $(GUDEV_CFLAGS) \ + $(LIBNL_CFLAGS) \ + $(GMODULE_CFLAGS) \ +diff --git a/src/nm-manager.c b/src/nm-manager.c +index 618c4ed..c8ce115 100644 +--- a/src/nm-manager.c ++++ b/src/nm-manager.c +@@ -69,6 +69,7 @@ + #include "nm-device-factory.h" + #include "wifi-utils.h" + #include "nm-enum-types.h" ++#include "nm-sleep-monitor.h" + + #if WITH_CONCHECK + #include "nm-connectivity.h" +@@ -78,8 +79,6 @@ + #define NM_AUTOIP_DBUS_SERVICE "org.freedesktop.nm_avahi_autoipd" + #define NM_AUTOIP_DBUS_IFACE "org.freedesktop.nm_avahi_autoipd" + +-#define UPOWER_DBUS_SERVICE "org.freedesktop.UPower" +- + static gboolean impl_manager_get_devices (NMManager *manager, + GPtrArray **devices, + GError **err); +@@ -228,7 +227,7 @@ typedef struct { + guint modem_removed_id; + + DBusGProxy *aipd_proxy; +- DBusGProxy *upower_proxy; ++ NMSleepMonitor *sleep_monitor; + + GSList *auth_chains; + +@@ -3288,16 +3287,16 @@ impl_manager_sleep (NMManager *self, + } + + static void +-upower_sleeping_cb (DBusGProxy *proxy, gpointer user_data) ++sleeping_cb (DBusGProxy *proxy, gpointer user_data) + { +- nm_log_dbg (LOGD_SUSPEND, "Received UPower sleeping signal"); ++ nm_log_dbg (LOGD_SUSPEND, "Received sleeping signal"); + _internal_sleep (NM_MANAGER (user_data), TRUE); + } + + static void +-upower_resuming_cb (DBusGProxy *proxy, gpointer user_data) ++resuming_cb (DBusGProxy *proxy, gpointer user_data) + { +- nm_log_dbg (LOGD_SUSPEND, "Received UPower resuming signal"); ++ nm_log_dbg (LOGD_SUSPEND, "Received resuming signal"); + _internal_sleep (NM_MANAGER (user_data), FALSE); + } + +@@ -4049,8 +4048,8 @@ dispose (GObject *object) + if (priv->aipd_proxy) + g_object_unref (priv->aipd_proxy); + +- if (priv->upower_proxy) +- g_object_unref (priv->upower_proxy); ++ if (priv->sleep_monitor) ++ g_object_unref (priv->sleep_monitor); + + if (priv->fw_monitor) { + if (priv->fw_monitor_id) +@@ -4372,23 +4371,12 @@ nm_manager_init (NMManager *manager) + } else + nm_log_warn (LOGD_AUTOIP4, "could not initialize avahi-autoipd D-Bus proxy"); + +- /* 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"); ++ /* sleep/wake handling */ ++ priv->sleep_monitor = nm_sleep_monitor_get (); ++ g_signal_connect (priv->sleep_monitor, "sleeping", ++ G_CALLBACK (sleeping_cb), manager); ++ g_signal_connect (priv->sleep_monitor, "resuming", ++ G_CALLBACK (resuming_cb), manager); + + /* Listen for authorization changes */ + nm_auth_changed_func_register (authority_changed_cb, manager); +diff --git a/src/nm-sleep-monitor-systemd.c b/src/nm-sleep-monitor-systemd.c +new file mode 100644 +index 0000000..70adc89 +--- /dev/null ++++ b/src/nm-sleep-monitor-systemd.c +@@ -0,0 +1,217 @@ ++/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ ++/* 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. ++ * ++ * (C) Copyright 2012 Red Hat, Inc. ++ * Author: Matthias Clasen <mclasen@redhat.com> ++ */ ++ ++#include "config.h" ++#include <errno.h> ++#include <string.h> ++#include <sys/stat.h> ++#include <dbus/dbus-glib-lowlevel.h> ++#include <dbus/dbus-glib.h> ++#include <gio/gio.h> ++#include <gio/gunixfdlist.h> ++ ++#include "nm-logging.h" ++#include "nm-dbus-manager.h" ++ ++#include "nm-sleep-monitor.h" ++ ++#define SD_NAME "org.freedesktop.login1" ++#define SD_PATH "/org/freedesktop/login1" ++#define SD_INTERFACE "org.freedesktop.login1.Manager" ++ ++ ++struct _NMSleepMonitor { ++ GObject parent_instance; ++ ++ GDBusProxy *sd_proxy; ++ gint inhibit_fd; ++}; ++ ++struct _NMSleepMonitorClass { ++ GObjectClass parent_class; ++ ++ void (*sleeping) (NMSleepMonitor *monitor); ++ void (*resuming) (NMSleepMonitor *monitor); ++}; ++ ++ ++enum { ++ SLEEPING, ++ RESUMING, ++ LAST_SIGNAL, ++}; ++static guint signals[LAST_SIGNAL] = {0}; ++ ++G_DEFINE_TYPE (NMSleepMonitor, nm_sleep_monitor, G_TYPE_OBJECT); ++ ++/********************************************************************/ ++ ++static void ++inhibit_done (GObject *source, ++ GAsyncResult *result, ++ gpointer user_data) ++{ ++ GDBusProxy *sd_proxy = G_DBUS_PROXY (source); ++ NMSleepMonitor *self = user_data; ++ GError *error = NULL; ++ GVariant *res; ++ GUnixFDList *fd_list; ++ ++ res = g_dbus_proxy_call_with_unix_fd_list_finish (sd_proxy, &fd_list, result, &error); ++ if (!res) { ++ nm_log_warn (LOGD_SUSPEND, "Inhibit failed: %s", error->message); ++ g_error_free (error); ++ } else { ++ if (!fd_list || g_unix_fd_list_get_length (fd_list) != 1) ++ nm_log_warn (LOGD_SUSPEND, "Didn't get a single fd back"); ++ ++ self->inhibit_fd = g_unix_fd_list_get (fd_list, 0, NULL); ++ ++ nm_log_dbg (LOGD_SUSPEND, "Inhibitor fd is %d", self->inhibit_fd); ++ g_object_unref (fd_list); ++ g_variant_unref (res); ++ } ++} ++ ++static void ++take_inhibitor (NMSleepMonitor *self) ++{ ++ g_assert (self->inhibit_fd == -1); ++ ++ nm_log_dbg (LOGD_SUSPEND, "Taking systemd sleep inhibitor"); ++ g_dbus_proxy_call_with_unix_fd_list (self->sd_proxy, ++ "Inhibit", ++ g_variant_new ("(ssss)", ++ "sleep", ++ g_get_user_name (), ++ "inhibited", ++ "delay"), ++ 0, ++ G_MAXINT, ++ NULL, ++ NULL, ++ inhibit_done, ++ self); ++} ++ ++static gboolean ++drop_inhibitor (NMSleepMonitor *self) ++{ ++ if (self->inhibit_fd >= 0) { ++ nm_log_dbg (LOGD_SUSPEND, "Dropping systemd sleep inhibitor"); ++ close (self->inhibit_fd); ++ self->inhibit_fd = -1; ++ return TRUE; ++ } ++ return FALSE; ++} ++ ++static void ++signal_cb (GDBusProxy *proxy, ++ const gchar *sendername, ++ const gchar *signalname, ++ GVariant *args, ++ gpointer data) ++{ ++ NMSleepMonitor *self = data; ++ gboolean is_about_to_suspend; ++ ++ if (strcmp (signalname, "PrepareForSleep") != 0) ++ return; ++ ++ g_variant_get (args, "(b)", &is_about_to_suspend); ++ nm_log_dbg (LOGD_SUSPEND, "Received PrepareForSleep signal: %d", is_about_to_suspend); ++ ++ if (is_about_to_suspend) { ++ g_signal_emit (self, signals[SLEEPING], 0); ++ drop_inhibitor (self); ++ } else { ++ take_inhibitor (self); ++ g_signal_emit (self, signals[RESUMING], 0); ++ } ++} ++ ++static void ++nm_sleep_monitor_init (NMSleepMonitor *self) ++{ ++ GDBusConnection *bus; ++ ++ self->inhibit_fd = -1; ++ bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL); ++ self->sd_proxy = g_dbus_proxy_new_sync (bus, 0, NULL, ++ SD_NAME, SD_PATH, SD_INTERFACE, ++ NULL, NULL); ++ g_object_unref (bus); ++ g_signal_connect (self->sd_proxy, "g-signal", G_CALLBACK (signal_cb), self); ++ take_inhibitor (self); ++} ++ ++static void ++finalize (GObject *object) ++{ ++ NMSleepMonitor *self = NM_SLEEP_MONITOR (object); ++ ++ drop_inhibitor (self); ++ if (self->sd_proxy) ++ g_object_unref (self->sd_proxy); ++ ++ if (G_OBJECT_CLASS (nm_sleep_monitor_parent_class)->finalize != NULL) ++ G_OBJECT_CLASS (nm_sleep_monitor_parent_class)->finalize (object); ++} ++ ++static void ++nm_sleep_monitor_class_init (NMSleepMonitorClass *klass) ++{ ++ GObjectClass *gobject_class; ++ ++ gobject_class = G_OBJECT_CLASS (klass); ++ ++ gobject_class->finalize = finalize; ++ ++ signals[SLEEPING] = g_signal_new (NM_SLEEP_MONITOR_SLEEPING, ++ NM_TYPE_SLEEP_MONITOR, ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (NMSleepMonitorClass, sleeping), ++ NULL, /* accumulator */ ++ NULL, /* accumulator data */ ++ g_cclosure_marshal_VOID__VOID, ++ G_TYPE_NONE, 0); ++ signals[RESUMING] = g_signal_new (NM_SLEEP_MONITOR_RESUMING, ++ NM_TYPE_SLEEP_MONITOR, ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (NMSleepMonitorClass, resuming), ++ NULL, /* accumulator */ ++ NULL, /* accumulator data */ ++ g_cclosure_marshal_VOID__VOID, ++ G_TYPE_NONE, 0); ++} ++ ++NMSleepMonitor * ++nm_sleep_monitor_get (void) ++{ ++ static NMSleepMonitor *singleton = NULL; ++ ++ if (singleton) ++ return g_object_ref (singleton); ++ ++ singleton = NM_SLEEP_MONITOR (g_object_new (NM_TYPE_SLEEP_MONITOR, NULL)); ++ return singleton; ++} ++ ++/* ---------------------------------------------------------------------------------------------------- */ +diff --git a/src/nm-sleep-monitor-upower.c b/src/nm-sleep-monitor-upower.c +new file mode 100644 +index 0000000..3c93f66 +--- /dev/null ++++ b/src/nm-sleep-monitor-upower.c +@@ -0,0 +1,151 @@ ++/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ ++/* 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. ++ * ++ * (C) Copyright 2012 Red Hat, Inc. ++ * Author: Matthias Clasen <mclasen@redhat.com> ++ */ ++ ++#include "config.h" ++#include <errno.h> ++#include <string.h> ++#include <sys/stat.h> ++#include <dbus/dbus-glib-lowlevel.h> ++#include <dbus/dbus-glib.h> ++#include <gio/gio.h> ++#include "nm-logging.h" ++#include "nm-dbus-manager.h" ++ ++#include "nm-sleep-monitor.h" ++ ++#define UPOWER_DBUS_SERVICE "org.freedesktop.UPower" ++ ++struct _NMSleepMonitor { ++ GObject parent_instance; ++ ++ DBusGProxy *upower_proxy; ++}; ++ ++struct _NMSleepMonitorClass { ++ GObjectClass parent_class; ++ ++ void (*sleeping) (NMSleepMonitor *monitor); ++ void (*resuming) (NMSleepMonitor *monitor); ++}; ++ ++ ++enum { ++ SLEEPING, ++ RESUMING, ++ LAST_SIGNAL, ++}; ++static guint signals[LAST_SIGNAL] = {0}; ++ ++G_DEFINE_TYPE (NMSleepMonitor, nm_sleep_monitor, G_TYPE_OBJECT); ++ ++/********************************************************************/ ++ ++static void ++upower_sleeping_cb (DBusGProxy *proxy, gpointer user_data) ++{ ++ nm_log_dbg (LOGD_SUSPEND, "Received UPower sleeping signal"); ++ g_signal_emit (user_data, signals[SLEEPING], 0); ++} ++ ++static void ++upower_resuming_cb (DBusGProxy *proxy, gpointer user_data) ++{ ++ nm_log_dbg (LOGD_SUSPEND, "Received UPower resuming signal"); ++ g_signal_emit (user_data, signals[RESUMING], 0); ++} ++ ++static void ++nm_sleep_monitor_init (NMSleepMonitor *self) ++{ ++ NMDBusManager *dbus_mgr; ++ DBusGConnection *bus; ++ ++ dbus_mgr = nm_dbus_manager_get (); ++ bus = nm_dbus_manager_get_connection (dbus_mgr); ++ self->upower_proxy = dbus_g_proxy_new_for_name (bus, ++ UPOWER_DBUS_SERVICE, ++ "/org/freedesktop/UPower", ++ "org.freedesktop.UPower"); ++ if (self->upower_proxy) { ++ dbus_g_proxy_add_signal (self->upower_proxy, "Sleeping", G_TYPE_INVALID); ++ dbus_g_proxy_connect_signal (self->upower_proxy, "Sleeping", ++ G_CALLBACK (upower_sleeping_cb), ++ self, NULL); ++ ++ dbus_g_proxy_add_signal (self->upower_proxy, "Resuming", G_TYPE_INVALID); ++ dbus_g_proxy_connect_signal (self->upower_proxy, "Resuming", ++ G_CALLBACK (upower_resuming_cb), ++ self, NULL); ++ } else ++ nm_log_warn (LOGD_SUSPEND, "could not initialize UPower D-Bus proxy"); ++ g_object_unref (dbus_mgr); ++} ++ ++static void ++finalize (GObject *object) ++{ ++ NMSleepMonitor *self = NM_SLEEP_MONITOR (object); ++ ++ if (self->upower_proxy) ++ g_object_unref (self->upower_proxy); ++ ++ if (G_OBJECT_CLASS (nm_sleep_monitor_parent_class)->finalize != NULL) ++ G_OBJECT_CLASS (nm_sleep_monitor_parent_class)->finalize (object); ++} ++ ++static void ++nm_sleep_monitor_class_init (NMSleepMonitorClass *klass) ++{ ++ GObjectClass *gobject_class; ++ ++ gobject_class = G_OBJECT_CLASS (klass); ++ ++ gobject_class->finalize = finalize; ++ ++ signals[SLEEPING] = g_signal_new (NM_SLEEP_MONITOR_SLEEPING, ++ NM_TYPE_SLEEP_MONITOR, ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (NMSleepMonitorClass, sleeping), ++ NULL, /* accumulator */ ++ NULL, /* accumulator data */ ++ g_cclosure_marshal_VOID__VOID, ++ G_TYPE_NONE, 0); ++ signals[RESUMING] = g_signal_new (NM_SLEEP_MONITOR_RESUMING, ++ NM_TYPE_SLEEP_MONITOR, ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (NMSleepMonitorClass, resuming), ++ NULL, /* accumulator */ ++ NULL, /* accumulator data */ ++ g_cclosure_marshal_VOID__VOID, ++ G_TYPE_NONE, 0); ++} ++ ++NMSleepMonitor * ++nm_sleep_monitor_get (void) ++{ ++ static NMSleepMonitor *singleton = NULL; ++ ++ if (singleton) ++ return g_object_ref (singleton); ++ ++ singleton = NM_SLEEP_MONITOR (g_object_new (NM_TYPE_SLEEP_MONITOR, NULL)); ++ return singleton; ++} ++ ++/* ---------------------------------------------------------------------------------------------------- */ +diff --git a/src/nm-sleep-monitor.h b/src/nm-sleep-monitor.h +new file mode 100644 +index 0000000..173e6a1 +--- /dev/null ++++ b/src/nm-sleep-monitor.h +@@ -0,0 +1,46 @@ ++/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ ++/* 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. ++ * ++ * (C) Copyright 2012 Red Hat, Inc. ++ * Author: Matthias Clasen <mclasen@redhat.com> ++ */ ++ ++#ifndef NM_SLEEP_MONITOR_H ++#define NM_SLEEP_MONITOR_H ++ ++#include <glib-object.h> ++ ++G_BEGIN_DECLS ++ ++#define NM_TYPE_SLEEP_MONITOR (nm_sleep_monitor_get_type ()) ++#define NM_SLEEP_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), NM_TYPE_SLEEP_MONITOR, NMSleepMonitor)) ++#define NM_SLEEP_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), NM_TYPE_SLEEP_MONITOR, NMSleepMonitorClass)) ++#define NM_SLEEP_MONITOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NM_TYPE_SLEEP_MONITOR, NMSleepMonitorClass)) ++#define NM_IS_SLEEP_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), NM_TYPE_SLEEP_MONITOR)) ++#define NM_IS_SLEEP_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), NM_TYPE_SLEEP_MONITOR)) ++ ++#define NM_SLEEP_MONITOR_SLEEPING "sleeping" ++#define NM_SLEEP_MONITOR_RESUMING "resuming" ++ ++typedef struct _NMSleepMonitor NMSleepMonitor; ++typedef struct _NMSleepMonitorClass NMSleepMonitorClass; ++ ++GType nm_sleep_monitor_get_type (void) G_GNUC_CONST; ++NMSleepMonitor *nm_sleep_monitor_get (void); ++ ++G_END_DECLS ++ ++#endif /* NM_SLEEP_MONITOR_H */ ++ +-- +1.7.12.2 + |