]>
Commit | Line | Data |
---|---|---|
8f9f9f5f MB |
1 | --- NetworkManager-1.0.0/configure.ac.orig 2014-12-19 23:27:36.133692361 +0100 |
2 | +++ NetworkManager-1.0.0/configure.ac 2014-12-19 23:29:57.159595024 +0100 | |
3 | @@ -348,7 +348,7 @@ AM_CONDITIONAL(SESSION_TRACKING_CK, test | |
4 | AM_CONDITIONAL(SESSION_TRACKING_SYSTEMD, test "$with_session_tracking" = "systemd") | |
d7d26b92 | 5 | if test "$with_session_tracking" = "systemd"; then |
8f9f9f5f MB |
6 | PKG_CHECK_MODULES(SYSTEMD_LOGIN, [libsystemd],, |
7 | - [PKG_CHECK_MODULES(SYSTEMD_LOGIN, [libsystemd-login])]) | |
8 | + [PKG_CHECK_MODULES(SYSTEMD_LOGIN, [libsystemd-daemon libsystemd-login])]) | |
d7d26b92 MB |
9 | AC_SUBST(SYSTEMD_LOGIN_CFLAGS) |
10 | AC_SUBST(SYSTEMD_LOGIN_LIBS) | |
11 | fi | |
8f9f9f5f MB |
12 | --- NetworkManager-1.0.0/src/nm-session-monitor-systemd.c.orig 2014-12-11 22:28:51.000000000 +0100 |
13 | +++ NetworkManager-1.0.0/src/nm-session-monitor-systemd.c 2014-12-21 11:30:09.859311469 +0100 | |
14 | @@ -29,10 +29,14 @@ | |
b761b8be ŁK |
15 | #include <glib/gstdio.h> |
16 | #include <systemd/sd-login.h> | |
17 | #include <stdlib.h> | |
18 | +#include <systemd/sd-daemon.h> | |
19 | +#include <sys/stat.h> | |
20 | +#include <gio/gio.h> | |
b761b8be ŁK |
21 | |
22 | #include "nm-session-utils.h" | |
23 | #include "nm-session-monitor.h" | |
8f9f9f5f MB |
24 | #include "nm-logging.h" |
25 | +#include "nm-errors.h" | |
26 | ||
27 | /********************************************************************/ | |
28 | ||
29 | @@ -109,10 +113,18 @@ sd_source_new (void) | |
b761b8be ŁK |
30 | return source; |
31 | } | |
32 | ||
b761b8be ŁK |
33 | +#define CKDB_PATH "/var/run/ConsoleKit/database" |
34 | + | |
35 | struct _NMSessionMonitor { | |
36 | GObject parent_instance; | |
37 | ||
38 | GSource *sd_source; | |
39 | + | |
40 | + GKeyFile *database; | |
41 | + GFileMonitor *database_monitor; | |
42 | + time_t database_mtime; | |
43 | + GHashTable *sessions_by_uid; | |
44 | + GHashTable *sessions_by_user; | |
45 | }; | |
46 | ||
47 | struct _NMSessionMonitorClass { | |
8f9f9f5f | 48 | @@ -132,6 +144,215 @@ G_DEFINE_TYPE (NMSessionMonitor, nm_sess |
b761b8be ŁK |
49 | |
50 | /* ---------------------------------------------------------------------------------------------------- */ | |
51 | ||
52 | +typedef struct { | |
53 | + char *user; | |
54 | + uid_t uid; | |
55 | + gboolean local; | |
56 | + gboolean active; | |
57 | +} Session; | |
58 | + | |
59 | +static void | |
60 | +session_free (Session *s) | |
61 | +{ | |
62 | + g_free (s->user); | |
63 | + memset (s, 0, sizeof (Session)); | |
64 | + g_free (s); | |
65 | +} | |
66 | + | |
67 | +static gboolean | |
68 | +check_key (GKeyFile *keyfile, const char *group, const char *key, GError **error) | |
69 | +{ | |
70 | + if (g_key_file_has_key (keyfile, group, key, error)) | |
71 | + return TRUE; | |
72 | + | |
73 | + if (!error) { | |
74 | + g_set_error (error, | |
8f9f9f5f MB |
75 | + NM_MANAGER_ERROR, |
76 | + NM_MANAGER_ERROR_FAILED, | |
b761b8be ŁK |
77 | + "ConsoleKit database " CKDB_PATH " group '%s' had no '%s' key", |
78 | + group, key); | |
79 | + } | |
80 | + return FALSE; | |
81 | +} | |
82 | + | |
83 | +static Session * | |
84 | +session_new (GKeyFile *keyfile, const char *group, GError **error) | |
85 | +{ | |
86 | + GError *local = NULL; | |
87 | + Session *s; | |
88 | + const char *uname = NULL; | |
89 | + | |
90 | + s = g_new0 (Session, 1); | |
91 | + g_assert (s); | |
92 | + | |
93 | + s->uid = G_MAXUINT; /* paranoia */ | |
94 | + if (!check_key (keyfile, group, "uid", &local)) | |
95 | + goto error; | |
96 | + s->uid = (uid_t) g_key_file_get_integer (keyfile, group, "uid", &local); | |
97 | + if (local) | |
98 | + goto error; | |
99 | + | |
100 | + if (!check_key (keyfile, group, "is_active", &local)) | |
101 | + goto error; | |
102 | + s->active = g_key_file_get_boolean (keyfile, group, "is_active", &local); | |
103 | + if (local) | |
104 | + goto error; | |
105 | + | |
106 | + if (!check_key (keyfile, group, "is_local", &local)) | |
107 | + goto error; | |
108 | + s->local = g_key_file_get_boolean (keyfile, group, "is_local", &local); | |
109 | + if (local) | |
110 | + goto error; | |
111 | + | |
112 | + if (!nm_session_uid_to_user (s->uid, &uname, error)) | |
113 | + return FALSE; | |
114 | + s->user = g_strdup (uname); | |
115 | + | |
116 | + return s; | |
117 | + | |
118 | +error: | |
119 | + session_free (s); | |
120 | + g_propagate_error (error, local); | |
121 | + return NULL; | |
122 | +} | |
123 | + | |
124 | +static void | |
125 | +session_merge (Session *src, Session *dest) | |
126 | +{ | |
127 | + g_return_if_fail (src != NULL); | |
128 | + g_return_if_fail (dest != NULL); | |
129 | + | |
130 | + g_warn_if_fail (g_strcmp0 (src->user, dest->user) == 0); | |
131 | + g_warn_if_fail (src->uid == dest->uid); | |
132 | + | |
133 | + dest->local = (dest->local || src->local); | |
134 | + dest->active = (dest->active || src->active); | |
135 | +} | |
136 | + | |
137 | +/********************************************************************/ | |
138 | + | |
139 | +static void | |
140 | +free_database (NMSessionMonitor *self) | |
141 | +{ | |
142 | + if (self->database != NULL) { | |
143 | + g_key_file_free (self->database); | |
144 | + self->database = NULL; | |
145 | + } | |
146 | + | |
147 | + g_hash_table_remove_all (self->sessions_by_uid); | |
148 | + g_hash_table_remove_all (self->sessions_by_user); | |
149 | +} | |
150 | + | |
151 | +static gboolean | |
152 | +reload_database (NMSessionMonitor *self, GError **error) | |
153 | +{ | |
154 | + struct stat statbuf; | |
155 | + char **groups = NULL; | |
156 | + gsize len = 0, i; | |
157 | + Session *s; | |
158 | + | |
159 | + free_database (self); | |
160 | + | |
161 | + errno = 0; | |
162 | + if (stat (CKDB_PATH, &statbuf) != 0) { | |
163 | + g_set_error (error, | |
8f9f9f5f MB |
164 | + NM_MANAGER_ERROR, |
165 | + NM_MANAGER_ERROR_FAILED, | |
b761b8be ŁK |
166 | + "Error statting file " CKDB_PATH ": %s", |
167 | + strerror (errno)); | |
168 | + goto error; | |
169 | + } | |
170 | + self->database_mtime = statbuf.st_mtime; | |
171 | + | |
172 | + self->database = g_key_file_new (); | |
173 | + if (!g_key_file_load_from_file (self->database, CKDB_PATH, G_KEY_FILE_NONE, error)) | |
174 | + goto error; | |
175 | + | |
176 | + groups = g_key_file_get_groups (self->database, &len); | |
177 | + if (!groups) { | |
178 | + g_set_error_literal (error, | |
8f9f9f5f MB |
179 | + NM_MANAGER_ERROR, |
180 | + NM_MANAGER_ERROR_FAILED, | |
b761b8be ŁK |
181 | + "Could not load groups from " CKDB_PATH ""); |
182 | + goto error; | |
183 | + } | |
184 | + | |
185 | + for (i = 0; i < len; i++) { | |
186 | + Session *found; | |
187 | + | |
188 | + if (!g_str_has_prefix (groups[i], "Session ")) | |
189 | + continue; | |
190 | + | |
191 | + s = session_new (self->database, groups[i], error); | |
192 | + if (!s) | |
193 | + goto error; | |
194 | + | |
195 | + found = g_hash_table_lookup (self->sessions_by_user, (gpointer) s->user); | |
196 | + if (found) { | |
197 | + session_merge (s, found); | |
198 | + session_free (s); | |
199 | + } else { | |
200 | + /* Entirely new user */ | |
201 | + g_hash_table_insert (self->sessions_by_user, (gpointer) s->user, s); | |
202 | + g_hash_table_insert (self->sessions_by_uid, GUINT_TO_POINTER (s->uid), s); | |
203 | + } | |
204 | + } | |
205 | + | |
206 | + g_strfreev (groups); | |
207 | + return TRUE; | |
208 | + | |
209 | +error: | |
210 | + if (groups) | |
211 | + g_strfreev (groups); | |
212 | + free_database (self); | |
213 | + return FALSE; | |
214 | +} | |
215 | + | |
216 | +static gboolean | |
217 | +ensure_database (NMSessionMonitor *self, GError **error) | |
218 | +{ | |
219 | + gboolean ret = FALSE; | |
220 | + | |
221 | + if (self->database != NULL) { | |
222 | + struct stat statbuf; | |
223 | + | |
224 | + errno = 0; | |
225 | + if (stat (CKDB_PATH, &statbuf) != 0) { | |
226 | + g_set_error (error, | |
8f9f9f5f MB |
227 | + NM_MANAGER_ERROR, |
228 | + NM_MANAGER_ERROR_FAILED, | |
b761b8be ŁK |
229 | + "Error statting file " CKDB_PATH " to check timestamp: %s", |
230 | + strerror (errno)); | |
231 | + goto out; | |
232 | + } | |
233 | + | |
234 | + if (statbuf.st_mtime == self->database_mtime) { | |
235 | + ret = TRUE; | |
236 | + goto out; | |
237 | + } | |
238 | + } | |
239 | + | |
240 | + ret = reload_database (self, error); | |
241 | + | |
242 | +out: | |
243 | + return ret; | |
244 | +} | |
245 | + | |
246 | +static void | |
247 | +on_file_monitor_changed (GFileMonitor * file_monitor, | |
248 | + GFile * file, | |
249 | + GFile * other_file, | |
250 | + GFileMonitorEvent event_type, | |
251 | + gpointer user_data) | |
252 | +{ | |
253 | + NMSessionMonitor *self = NM_SESSION_MONITOR (user_data); | |
254 | + | |
255 | + /* throw away cache */ | |
256 | + free_database (self); | |
257 | + | |
258 | + g_signal_emit (self, signals[CHANGED_SIGNAL], 0); | |
259 | +} | |
260 | + | |
261 | static gboolean | |
262 | sessions_changed (gpointer user_data) | |
263 | { | |
8f9f9f5f | 264 | @@ -145,9 +366,46 @@ sessions_changed (gpointer user_data) |
b761b8be ŁK |
265 | static void |
266 | nm_session_monitor_init (NMSessionMonitor *monitor) | |
267 | { | |
268 | - monitor->sd_source = sd_source_new (); | |
269 | - g_source_set_callback (monitor->sd_source, sessions_changed, monitor, NULL); | |
270 | - g_source_attach (monitor->sd_source, NULL); | |
271 | + if (sd_booted () > 0) { | |
272 | + monitor->sd_source = sd_source_new (); | |
273 | + g_source_set_callback (monitor->sd_source, sessions_changed, monitor, NULL); | |
274 | + g_source_attach (monitor->sd_source, NULL); | |
275 | + | |
276 | + monitor->database_monitor = NULL; | |
277 | + monitor->database = NULL; | |
278 | + } else { | |
b761b8be ŁK |
279 | + GError *error = NULL; |
280 | + GFile *file; | |
281 | + | |
8f9f9f5f MB |
282 | + monitor->sd_source = NULL; |
283 | + | |
b761b8be ŁK |
284 | + /* Sessions-by-user is responsible for destroying the Session objects */ |
285 | + monitor->sessions_by_user = g_hash_table_new_full (g_str_hash, g_str_equal, | |
8f9f9f5f | 286 | + NULL, (GDestroyNotify) session_free); |
b761b8be ŁK |
287 | + monitor->sessions_by_uid = g_hash_table_new (g_direct_hash, g_direct_equal); |
288 | + | |
289 | + | |
b761b8be | 290 | + if (!ensure_database (monitor, &error)) { |
8f9f9f5f MB |
291 | + nm_log_dbg (LOGD_CORE, "Error loading " CKDB_PATH ": %s", error->message); |
292 | + | |
293 | + /* Ignore the first error, the CK database might not exist yet */ | |
b761b8be | 294 | + g_error_free (error); |
8f9f9f5f | 295 | + error = NULL; |
b761b8be ŁK |
296 | + } |
297 | + | |
b761b8be ŁK |
298 | + file = g_file_new_for_path (CKDB_PATH); |
299 | + monitor->database_monitor = g_file_monitor_file (file, G_FILE_MONITOR_NONE, NULL, &error); | |
300 | + g_object_unref (file); | |
301 | + if (monitor->database_monitor == NULL) { | |
302 | + nm_log_err (LOGD_CORE, "Error monitoring " CKDB_PATH ": %s", error->message); | |
303 | + g_error_free (error); | |
304 | + } else { | |
305 | + g_signal_connect (monitor->database_monitor, | |
8f9f9f5f MB |
306 | + "changed", |
307 | + G_CALLBACK (on_file_monitor_changed), | |
308 | + monitor); | |
b761b8be ŁK |
309 | + } |
310 | + } | |
311 | } | |
312 | ||
313 | static void | |
8f9f9f5f MB |
314 | @@ -155,11 +413,19 @@ nm_session_monitor_finalize (GObject *ob |
315 | { | |
316 | NMSessionMonitor *monitor = NM_SESSION_MONITOR (object); | |
b761b8be | 317 | |
8f9f9f5f MB |
318 | - if (monitor->sd_source != NULL) { |
319 | - g_source_destroy (monitor->sd_source); | |
320 | - g_source_unref (monitor->sd_source); | |
321 | + if (sd_booted () > 0) { | |
322 | + if (monitor->sd_source != NULL) { | |
323 | + g_source_destroy (monitor->sd_source); | |
324 | + g_source_unref (monitor->sd_source); | |
325 | + } | |
326 | + } else { | |
327 | + if (monitor->database_monitor != NULL) | |
328 | + g_object_unref (monitor->database_monitor); | |
b761b8be | 329 | + |
b761b8be | 330 | + free_database (monitor); |
8f9f9f5f MB |
331 | } |
332 | ||
b761b8be ŁK |
333 | + |
334 | if (G_OBJECT_CLASS (nm_session_monitor_parent_class)->finalize != NULL) | |
335 | G_OBJECT_CLASS (nm_session_monitor_parent_class)->finalize (object); | |
336 | } | |
8f9f9f5f | 337 | @@ -205,15 +471,36 @@ nm_session_monitor_user_has_session (NMS |
b761b8be ŁK |
338 | uid_t *out_uid, |
339 | GError **error) | |
340 | { | |
341 | - uid_t uid; | |
8f9f9f5f | 342 | + if (sd_booted () > 0) { |
b761b8be ŁK |
343 | + uid_t uid; |
344 | ||
345 | - if (!nm_session_user_to_uid (username, &uid, error)) | |
346 | - return FALSE; | |
347 | + if (!nm_session_user_to_uid (username, &uid, error)) | |
348 | + return FALSE; | |
349 | ||
350 | - if (out_uid) | |
351 | - *out_uid = uid; | |
352 | + if (out_uid) | |
353 | + *out_uid = uid; | |
354 | ||
355 | - return nm_session_monitor_uid_has_session (monitor, uid, NULL, error); | |
356 | + return nm_session_monitor_uid_has_session (monitor, uid, NULL, error); | |
357 | + } else { | |
358 | + Session *s; | |
359 | + | |
360 | + if (!ensure_database (monitor, error)) | |
361 | + return FALSE; | |
362 | + | |
363 | + s = g_hash_table_lookup (monitor->sessions_by_user, (gpointer) username); | |
364 | + if (!s) { | |
365 | + g_set_error (error, | |
8f9f9f5f MB |
366 | + NM_MANAGER_ERROR, |
367 | + NM_MANAGER_ERROR_FAILED, | |
368 | + "No session found for user '%s'", | |
369 | + username); | |
b761b8be ŁK |
370 | + return FALSE; |
371 | + } | |
372 | + | |
373 | + if (out_uid) | |
374 | + *out_uid = s->uid; | |
375 | + return TRUE; | |
376 | + } | |
377 | } | |
378 | ||
379 | gboolean | |
8f9f9f5f | 380 | @@ -221,12 +508,31 @@ nm_session_monitor_user_active (NMSessio |
b761b8be ŁK |
381 | const char *username, |
382 | GError **error) | |
383 | { | |
384 | - uid_t uid; | |
8f9f9f5f | 385 | + if (sd_booted () > 0) { |
b761b8be ŁK |
386 | + uid_t uid; |
387 | ||
388 | - if (!nm_session_user_to_uid (username, &uid, error)) | |
389 | - return FALSE; | |
390 | + if (!nm_session_user_to_uid (username, &uid, error)) | |
391 | + return FALSE; | |
8f9f9f5f | 392 | + |
b761b8be ŁK |
393 | + return nm_session_monitor_uid_active (monitor, uid, error); |
394 | + } else { | |
395 | + Session *s; | |
396 | + | |
397 | + if (!ensure_database (monitor, error)) | |
398 | + return FALSE; | |
399 | + | |
400 | + s = g_hash_table_lookup (monitor->sessions_by_user, (gpointer) username); | |
401 | + if (!s) { | |
402 | + g_set_error (error, | |
8f9f9f5f MB |
403 | + NM_MANAGER_ERROR, |
404 | + NM_MANAGER_ERROR_FAILED, | |
405 | + "No session found for user '%s'", | |
406 | + username); | |
b761b8be ŁK |
407 | + return FALSE; |
408 | + } | |
8f9f9f5f MB |
409 | |
410 | - return nm_session_monitor_uid_active (monitor, uid, error); | |
b761b8be ŁK |
411 | + return s->active; |
412 | + } | |
413 | } | |
414 | ||
415 | gboolean | |
8f9f9f5f | 416 | @@ -235,19 +541,40 @@ nm_session_monitor_uid_has_session (NMSe |
5602b216 JB |
417 | const char **out_user, |
418 | GError **error) | |
b761b8be | 419 | { |
5602b216 | 420 | - int num_sessions; |
8f9f9f5f | 421 | + if (sd_booted () > 0) { |
5602b216 | 422 | + int num_sessions; |
75cfff58 | 423 | |
b761b8be ŁK |
424 | - if (!nm_session_uid_to_user (uid, out_user, error)) |
425 | - return FALSE; | |
b761b8be ŁK |
426 | + if (!nm_session_uid_to_user (uid, out_user, error)) |
427 | + return FALSE; | |
428 | ||
5602b216 JB |
429 | - /* Get all sessions (including inactive ones) for the user */ |
430 | - num_sessions = sd_uid_get_sessions (uid, 0, NULL); | |
431 | - if (num_sessions < 0) { | |
75cfff58 | 432 | - nm_log_warn (LOGD_CORE, "Failed to get systemd sessions for uid %d: %d", |
5602b216 | 433 | - uid, num_sessions); |
75cfff58 | 434 | - return FALSE; |
5602b216 JB |
435 | + /* Get all sessions (including inactive ones) for the user */ |
436 | + num_sessions = sd_uid_get_sessions (uid, 0, NULL); | |
437 | + if (num_sessions < 0) { | |
75cfff58 | 438 | + nm_log_warn (LOGD_CORE, "Failed to get systemd sessions for uid %d: %d", |
8f9f9f5f | 439 | + uid, num_sessions); |
75cfff58 JB |
440 | + return FALSE; |
441 | + } | |
5602b216 | 442 | + return num_sessions > 0; |
b761b8be ŁK |
443 | + } else { |
444 | + Session *s; | |
445 | + | |
446 | + if (!ensure_database (monitor, error)) | |
447 | + return FALSE; | |
448 | + | |
449 | + s = g_hash_table_lookup (monitor->sessions_by_uid, GUINT_TO_POINTER (uid)); | |
450 | + if (!s) { | |
451 | + g_set_error (error, | |
8f9f9f5f MB |
452 | + NM_MANAGER_ERROR, |
453 | + NM_MANAGER_ERROR_FAILED, | |
454 | + "No session found for uid %d", | |
455 | + uid); | |
b761b8be ŁK |
456 | + return FALSE; |
457 | + } | |
458 | + | |
459 | + if (out_user) | |
460 | + *out_user = s->user; | |
461 | + return TRUE; | |
75cfff58 | 462 | } |
5602b216 | 463 | - return num_sessions > 0; |
b761b8be ŁK |
464 | } |
465 | ||
466 | gboolean | |
8f9f9f5f | 467 | @@ -255,14 +582,33 @@ nm_session_monitor_uid_active (NMSession |
5602b216 JB |
468 | uid_t uid, |
469 | GError **error) | |
b761b8be | 470 | { |
5602b216 | 471 | - int num_sessions; |
8f9f9f5f | 472 | + if (sd_booted () > 0) { |
5602b216 | 473 | + int num_sessions; |
75cfff58 | 474 | |
5602b216 JB |
475 | - /* Get active sessions for the user */ |
476 | - num_sessions = sd_uid_get_sessions (uid, 1, NULL); | |
477 | - if (num_sessions < 0) { | |
75cfff58 | 478 | - nm_log_warn (LOGD_CORE, "Failed to get active systemd sessions for uid %d: %d", |
5602b216 | 479 | - uid, num_sessions); |
75cfff58 | 480 | - return FALSE; |
5602b216 JB |
481 | + /* Get active sessions for the user */ |
482 | + num_sessions = sd_uid_get_sessions (uid, 1, NULL); | |
483 | + if (num_sessions < 0) { | |
75cfff58 | 484 | + nm_log_warn (LOGD_CORE, "Failed to get active systemd sessions for uid %d: %d", |
8f9f9f5f | 485 | + uid, num_sessions); |
75cfff58 JB |
486 | + return FALSE; |
487 | + } | |
5602b216 | 488 | + return num_sessions > 0; |
75cfff58 | 489 | + } else { |
b761b8be ŁK |
490 | + Session *s; |
491 | + | |
492 | + if (!ensure_database (monitor, error)) | |
493 | + return FALSE; | |
494 | + | |
495 | + s = g_hash_table_lookup (monitor->sessions_by_uid, GUINT_TO_POINTER (uid)); | |
496 | + if (!s) { | |
497 | + g_set_error (error, | |
8f9f9f5f MB |
498 | + NM_MANAGER_ERROR, |
499 | + NM_MANAGER_ERROR_FAILED, | |
500 | + "No session found for uid '%d'", | |
501 | + uid); | |
b761b8be ŁK |
502 | + return FALSE; |
503 | + } | |
504 | + | |
505 | + return s->active; | |
75cfff58 | 506 | } |
5602b216 | 507 | - return num_sessions > 0; |
b761b8be | 508 | } |
8f9f9f5f MB |
509 | --- NetworkManager-1.0.0/src/nm-sleep-monitor-systemd.c.orig 2014-12-19 23:32:53.481973137 +0100 |
510 | +++ NetworkManager-1.0.0/src/nm-sleep-monitor-systemd.c 2014-12-20 00:12:04.572281013 +0100 | |
511 | @@ -35,12 +35,15 @@ | |
d7d26b92 MB |
512 | #define SD_PATH "/org/freedesktop/login1" |
513 | #define SD_INTERFACE "org.freedesktop.login1.Manager" | |
514 | ||
515 | +#define UPOWER_DBUS_SERVICE "org.freedesktop.UPower" | |
5602b216 JB |
516 | |
517 | struct _NMSleepMonitor { | |
518 | GObject parent_instance; | |
519 | ||
520 | GDBusProxy *sd_proxy; | |
d7d26b92 | 521 | gint inhibit_fd; |
8f9f9f5f | 522 | + |
d7d26b92 MB |
523 | + DBusGProxy *upower_proxy; |
524 | }; | |
525 | ||
526 | struct _NMSleepMonitorClass { | |
8f9f9f5f | 527 | @@ -62,6 +65,20 @@ G_DEFINE_TYPE (NMSleepMonitor, nm_sleep_ |
d7d26b92 MB |
528 | |
529 | /********************************************************************/ | |
530 | ||
531 | +static void | |
532 | +upower_sleeping_cb (DBusGProxy *proxy, gpointer user_data) | |
533 | +{ | |
534 | + nm_log_dbg (LOGD_SUSPEND, "Received UPower sleeping signal"); | |
535 | + g_signal_emit (user_data, signals[SLEEPING], 0); | |
536 | +} | |
537 | + | |
538 | +static void | |
539 | +upower_resuming_cb (DBusGProxy *proxy, gpointer user_data) | |
540 | +{ | |
541 | + nm_log_dbg (LOGD_SUSPEND, "Received UPower resuming signal"); | |
542 | + g_signal_emit (user_data, signals[RESUMING], 0); | |
543 | +} | |
544 | + | |
545 | static gboolean | |
546 | drop_inhibitor (NMSleepMonitor *self) | |
547 | { | |
8f9f9f5f | 548 | @@ -193,14 +210,37 @@ on_proxy_acquired (GObject *object, |
d7d26b92 MB |
549 | static void |
550 | nm_sleep_monitor_init (NMSleepMonitor *self) | |
551 | { | |
552 | - self->inhibit_fd = -1; | |
8f9f9f5f MB |
553 | - g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, |
554 | - G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START | | |
555 | - G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, | |
556 | - NULL, | |
557 | - SD_NAME, SD_PATH, SD_INTERFACE, | |
558 | - NULL, | |
559 | - (GAsyncReadyCallback) on_proxy_acquired, self); | |
d7d26b92 MB |
560 | + if (sd_booted () > 0) { |
561 | + self->inhibit_fd = -1; | |
8f9f9f5f MB |
562 | + g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, |
563 | + G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START | | |
564 | + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, | |
565 | + NULL, | |
566 | + SD_NAME, SD_PATH, SD_INTERFACE, | |
567 | + NULL, | |
568 | + (GAsyncReadyCallback) on_proxy_acquired, self); | |
d7d26b92 | 569 | + } else { |
d7d26b92 MB |
570 | + DBusGConnection *bus; |
571 | + | |
8f9f9f5f | 572 | + bus = nm_dbus_manager_get_connection (nm_dbus_manager_get ()); |
d7d26b92 MB |
573 | + self->upower_proxy = dbus_g_proxy_new_for_name (bus, |
574 | + UPOWER_DBUS_SERVICE, | |
575 | + "/org/freedesktop/UPower", | |
576 | + "org.freedesktop.UPower"); | |
577 | + if (self->upower_proxy) { | |
8f9f9f5f MB |
578 | + dbus_g_proxy_add_signal (self->upower_proxy, "Sleeping", G_TYPE_INVALID); |
579 | + dbus_g_proxy_connect_signal (self->upower_proxy, "Sleeping", | |
580 | + G_CALLBACK (upower_sleeping_cb), | |
581 | + self, NULL); | |
582 | + | |
583 | + dbus_g_proxy_add_signal (self->upower_proxy, "Resuming", G_TYPE_INVALID); | |
584 | + dbus_g_proxy_connect_signal (self->upower_proxy, "Resuming", | |
585 | + G_CALLBACK (upower_resuming_cb), | |
586 | + self, NULL); | |
587 | + } else { | |
588 | + nm_log_warn (LOGD_SUSPEND, "could not initialize UPower D-Bus proxy"); | |
589 | + } | |
d7d26b92 MB |
590 | + } |
591 | } | |
592 | ||
593 | static void | |
8f9f9f5f | 594 | @@ -208,9 +248,14 @@ finalize (GObject *object) |
d7d26b92 MB |
595 | { |
596 | NMSleepMonitor *self = NM_SLEEP_MONITOR (object); | |
597 | ||
598 | - drop_inhibitor (self); | |
599 | - if (self->sd_proxy) | |
600 | - g_object_unref (self->sd_proxy); | |
601 | + if (sd_booted () > 0) { | |
602 | + drop_inhibitor (self); | |
603 | + if (self->sd_proxy) | |
604 | + g_object_unref (self->sd_proxy); | |
605 | + } else { | |
606 | + if (self->upower_proxy) | |
8f9f9f5f | 607 | + g_object_unref (self->upower_proxy); |
d7d26b92 MB |
608 | + } |
609 | ||
610 | if (G_OBJECT_CLASS (nm_sleep_monitor_parent_class)->finalize != NULL) | |
611 | G_OBJECT_CLASS (nm_sleep_monitor_parent_class)->finalize (object); |