From dcc55a1cfa32068d0759c1c8307f6c07c11aec99 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 19 Oct 2012 08:15:39 -0700 Subject: Fri Oct 19 08:15:38 PDT 2012 --- testing/networkmanager/PKGBUILD | 34 +- testing/networkmanager/nm-polkit-permissive.patch | 12 + testing/networkmanager/repair-signals.patch | 37 ++ testing/networkmanager/systemd-sleep.patch | 616 ++++++++++++++++++++++ 4 files changed, 685 insertions(+), 14 deletions(-) create mode 100644 testing/networkmanager/nm-polkit-permissive.patch create mode 100644 testing/networkmanager/repair-signals.patch create mode 100644 testing/networkmanager/systemd-sleep.patch (limited to 'testing/networkmanager') diff --git a/testing/networkmanager/PKGBUILD b/testing/networkmanager/PKGBUILD index e4c927db3..9e763f63f 100644 --- a/testing/networkmanager/PKGBUILD +++ b/testing/networkmanager/PKGBUILD @@ -1,4 +1,5 @@ -# $Id: PKGBUILD 164974 2012-08-07 18:07:41Z heftig $ +# $Id: PKGBUILD 169165 2012-10-18 19:23:13Z jgc $ +# Maintainer: Jan Alexander Steffens (heftig) # Maintainer: Jan de Groot # Contributor: Wael Nasreddine # Contributor: Tor Krill @@ -8,35 +9,43 @@ pkgname=networkmanager _pkgname=NetworkManager pkgver=0.9.6.0 -pkgrel=1 +pkgrel=5 pkgdesc="Network Management daemon" arch=('i686' 'x86_64') 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) + NetworkManager.conf disable_set_hostname.patch dnsmasq-path.patch + nm-polkit-permissive.patch repair-signals.patch systemd-sleep.patch) sha256sums=('3982b623b7b199ac99e2ddd0840fe7d088245a49e3f680237e8baebf0cf86d07' '44b048804c7c0b8b3b0c29b8632b6ad613c397d0a1635ec918e10c0fbcdadf21' '25056837ea92e559f09563ed817e3e0cd9333be861b8914e45f62ceaae2e0460' - '65124505048cc8396daf0242c9f5d532fa669b4bbca305998c248ab2329490cb') + '65124505048cc8396daf0242c9f5d532fa669b4bbca305998c248ab2329490cb' + 'e23b651a90ef62d515921953b4c6779538d35a737fb74c266b7fce94d62fdb06' + 'a1c65a09e5e8ecb1004ab7922517aa7fbc9700dc61e3b2fd348d3d7c23808ce6' + '24c181ab69e769e703e45f64a552add5df5de22fbcd8899d588add053674420a') build() { cd $_pkgname-$pkgver patch -Np1 -i ../disable_set_hostname.patch 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 \ @@ -46,12 +55,12 @@ build() { --with-crypto=nss \ --with-distro=arch \ --with-dhclient=/usr/sbin/dhclient \ - --with-dhcpcd=/sbin/dhcpcd \ + --with-dhcpcd=/usr/sbin/dhcpcd \ --with-iptables=/usr/sbin/iptables \ --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 @@ -66,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/testing/networkmanager/nm-polkit-permissive.patch b/testing/networkmanager/nm-polkit-permissive.patch new file mode 100644 index 000000000..1ac406224 --- /dev/null +++ b/testing/networkmanager/nm-polkit-permissive.patch @@ -0,0 +1,12 @@ +diff -up NetworkManager-0.8.997/policy/org.freedesktop.NetworkManager.policy.in.permissive NetworkManager-0.8.997/policy/org.freedesktop.NetworkManager.policy.in +--- NetworkManager-0.8.997/policy/org.freedesktop.NetworkManager.policy.in.permissive 2011-03-24 14:21:35.100912222 -0500 ++++ NetworkManager-0.8.997/policy/org.freedesktop.NetworkManager.policy.in 2011-03-24 14:21:49.916726997 -0500 +@@ -95,7 +95,7 @@ + <_message>System policy prevents modification of network settings for all users + + no +- auth_admin_keep ++ yes + + + diff --git a/testing/networkmanager/repair-signals.patch b/testing/networkmanager/repair-signals.patch new file mode 100644 index 000000000..cf1319dc5 --- /dev/null +++ b/testing/networkmanager/repair-signals.patch @@ -0,0 +1,37 @@ +From 64342a313ef497fca8a4fb7567900d4a1460065f Mon Sep 17 00:00:00 2001 +From: Alexandre Rostovtsev +Date: Thu, 13 Sep 2012 09:32:53 +0000 +Subject: core: wait until we daemonized before setting up signals (bgo #683932) + +If we mask signals before daemonizing, the daemon process will not be +able to handle them, and thus would be unkillable with anything other +than SIGKILL. +--- +diff --git a/src/main.c b/src/main.c +index 8bc6d3f..5b82cfa 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -401,10 +401,6 @@ main (int argc, char *argv[]) + exit (1); + } + +- /* Set up unix signal handling */ +- if (!setup_signals ()) +- exit (1); +- + /* Set locale to be able to use environment variables */ + setlocale (LC_ALL, ""); + +@@ -501,6 +497,10 @@ main (int argc, char *argv[]) + wrote_pidfile = TRUE; + } + ++ /* Set up unix signal handling - before creating threads, but after daemonizing! */ ++ if (!setup_signals ()) ++ exit (1); ++ + if (g_fatal_warnings) { + GLogLevelFlags fatal_mask; + +-- +cgit v0.9.0.2-2-gbebe diff --git a/testing/networkmanager/systemd-sleep.patch b/testing/networkmanager/systemd-sleep.patch new file mode 100644 index 000000000..3470d4654 --- /dev/null +++ b/testing/networkmanager/systemd-sleep.patch @@ -0,0 +1,616 @@ +From b444d31cba5b8ac0c9771cc5a246dfd3af9dfd00 Mon Sep 17 00:00:00 2001 +From: Matthias Clasen +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 ++ */ ++ ++#include "config.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 ++ */ ++ ++#include "config.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#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 ++ */ ++ ++#ifndef NM_SLEEP_MONITOR_H ++#define NM_SLEEP_MONITOR_H ++ ++#include ++ ++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 + -- cgit v1.2.3-54-g00ecf