summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'net-misc/networkmanager/files/networkmanager-0.9.8.4-pre-sleep.patch')
-rw-r--r--net-misc/networkmanager/files/networkmanager-0.9.8.4-pre-sleep.patch131
1 files changed, 131 insertions, 0 deletions
diff --git a/net-misc/networkmanager/files/networkmanager-0.9.8.4-pre-sleep.patch b/net-misc/networkmanager/files/networkmanager-0.9.8.4-pre-sleep.patch
new file mode 100644
index 000000000000..6e6dfbe8ee29
--- /dev/null
+++ b/net-misc/networkmanager/files/networkmanager-0.9.8.4-pre-sleep.patch
@@ -0,0 +1,131 @@
+From ffb08fa288cea4c9ac8f18fd83e063b2e86ac51b Mon Sep 17 00:00:00 2001
+From: Alexandre Rostovtsev <tetromino@gentoo.org>
+Date: Sun, 27 Jan 2013 23:39:56 -0500
+Subject: [PATCH] Implement "pre-sleep" action dispatch
+
+Based on work by Christian Becke <christianbecke@gmail.com> in
+https://bugzilla.gnome.org/show_bug.cgi?id=387832
+---
+ callouts/nm-dispatcher-utils.c | 3 ++-
+ src/nm-dispatcher.c | 8 ++++++--
+ src/nm-dispatcher.h | 3 ++-
+ src/nm-manager.c | 28 +++++++++++++++++++++-------
+ 4 files changed, 31 insertions(+), 11 deletions(-)
+
+diff --git a/callouts/nm-dispatcher-utils.c b/callouts/nm-dispatcher-utils.c
+index 8824295..66cbc4b 100644
+--- a/callouts/nm-dispatcher-utils.c
++++ b/callouts/nm-dispatcher-utils.c
+@@ -409,7 +409,8 @@ nm_dispatcher_utils_construct_envp (const char *action,
+ g_return_val_if_fail (*out_iface == NULL, NULL);
+
+ /* Hostname changes don't require a device nor contain a connection */
+- if (!strcmp (action, "hostname"))
++ if (!strcmp (action, "hostname") ||
++ !strcmp (action, "pre-sleep"))
+ return g_new0 (char *, 1);
+
+ /* Canonicalize the VPN interface name; "" is used when passing it through
+diff --git a/src/nm-dispatcher.c b/src/nm-dispatcher.c
+index 12cd0f0..42d7e12 100644
+--- a/src/nm-dispatcher.c
++++ b/src/nm-dispatcher.c
+@@ -237,6 +237,8 @@ action_to_string (DispatcherAction action)
+ return "dhcp4-change";
+ case DISPATCHER_ACTION_DHCP6_CHANGE:
+ return "dhcp6-change";
++ case DISPATCHER_ACTION_PRE_SLEEP:
++ return "pre-sleep";
+ default:
+ break;
+ }
+@@ -269,7 +271,8 @@ _dispatcher_call (DispatcherAction action,
+ DispatchInfo *info;
+
+ /* All actions except 'hostname' require a device */
+- if (action != DISPATCHER_ACTION_HOSTNAME)
++ if (action != DISPATCHER_ACTION_HOSTNAME &&
++ action != DISPATCHER_ACTION_PRE_SLEEP)
+ g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
+ /* VPN actions require at least an IPv4 config (for now) */
+ if (action == DISPATCHER_ACTION_VPN_UP)
+@@ -308,7 +311,8 @@ _dispatcher_call (DispatcherAction action,
+ vpn_ip6_props = value_hash_create ();
+
+ /* hostname actions only send the hostname */
+- if (action != DISPATCHER_ACTION_HOSTNAME) {
++ if (action != DISPATCHER_ACTION_HOSTNAME &&
++ action != DISPATCHER_ACTION_PRE_SLEEP) {
+ fill_device_props (device,
+ device_props,
+ device_ip4_props,
+diff --git a/src/nm-dispatcher.h b/src/nm-dispatcher.h
+index 05a6c87..8e95834 100644
+--- a/src/nm-dispatcher.h
++++ b/src/nm-dispatcher.h
+@@ -39,7 +39,8 @@ typedef enum {
+ DISPATCHER_ACTION_VPN_PRE_DOWN,
+ DISPATCHER_ACTION_VPN_DOWN,
+ DISPATCHER_ACTION_DHCP4_CHANGE,
+- DISPATCHER_ACTION_DHCP6_CHANGE
++ DISPATCHER_ACTION_DHCP6_CHANGE,
++ DISPATCHER_ACTION_PRE_SLEEP = 999,
+ } DispatcherAction;
+
+ typedef void (*DispatcherFunc) (gconstpointer call, gpointer user_data);
+diff --git a/src/nm-manager.c b/src/nm-manager.c
+index 811f49d..f52956d 100644
+--- a/src/nm-manager.c
++++ b/src/nm-manager.c
+@@ -73,6 +73,7 @@
+ #include "nm-sleep-monitor.h"
+ #include "nm-connectivity.h"
+ #include "nm-policy.h"
++#include "nm-dispatcher.h"
+
+
+ #define NM_AUTOIP_DBUS_SERVICE "org.freedesktop.nm_avahi_autoipd"
+@@ -3350,6 +3351,23 @@ impl_manager_deactivate_connection (NMManager *self,
+ }
+
+ static void
++pre_sleep_dispatcher_done (gpointer call, gpointer user_data)
++{
++ NMManager *self = (NMManager *) user_data;
++ NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
++ GSList *iter;
++
++ /* Just deactivate and down all devices from the device list,
++ * to keep things fast the device list will get resynced when
++ * the manager wakes up.
++ */
++ for (iter = priv->devices; iter; iter = iter->next)
++ nm_device_set_managed (NM_DEVICE (iter->data), FALSE, NM_DEVICE_STATE_REASON_SLEEPING);
++
++ nm_manager_update_state (self);
++}
++
++static void
+ do_sleep_wake (NMManager *self)
+ {
+ NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
+@@ -3359,13 +3377,9 @@ do_sleep_wake (NMManager *self)
+ if (manager_sleeping (self)) {
+ nm_log_info (LOGD_SUSPEND, "sleeping or disabling...");
+
+- /* Just deactivate and down all devices from the device list,
+- * to keep things fast the device list will get resynced when
+- * the manager wakes up.
+- */
+- for (iter = priv->devices; iter; iter = iter->next)
+- nm_device_set_managed (NM_DEVICE (iter->data), FALSE, NM_DEVICE_STATE_REASON_SLEEPING);
+-
++ nm_dispatcher_call (DISPATCHER_ACTION_PRE_SLEEP, NULL, NULL,
++ pre_sleep_dispatcher_done, self);
++ return;
+ } else {
+ nm_log_info (LOGD_SUSPEND, "waking up and re-enabling...");
+
+--
+1.8.3.2
+