summaryrefslogtreecommitdiff
blob: 6e6dfbe8ee293edefa25480e18d3fcbec1cca04a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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