-diff -u -Nr NetworkManager-0.9.3.995/configure.ac NetworkManager-0.9.3.995-systemd-fallback/configure.ac
---- NetworkManager-0.9.3.995/configure.ac 2012-03-02 01:05:21.000000000 +0100
-+++ NetworkManager-0.9.3.995-systemd-fallback/configure.ac 2012-03-06 16:55:58.294793902 +0100
-@@ -344,7 +344,7 @@
- case $with_session_tracking in
- ck|none) ;;
- systemd)
-- PKG_CHECK_MODULES(SYSTEMD, [libsystemd-login])
-+ PKG_CHECK_MODULES(SYSTEMD, [libsystemd-daemon libsystemd-login])
- ;;
- *)
- AC_MSG_ERROR(--with-session-tracking must be one of [none, ck, systemd])
---- NetworkManager-0.9.6.4/src/nm-session-monitor-systemd.c.orig 2012-09-12 22:37:01.000000000 +0200
-+++ NetworkManager-0.9.6.4/src/nm-session-monitor-systemd.c 2012-11-01 08:58:24.084129513 +0100
-@@ -28,6 +28,10 @@
+--- NetworkManager-1.0.0/configure.ac.orig 2014-12-19 23:27:36.133692361 +0100
++++ NetworkManager-1.0.0/configure.ac 2014-12-19 23:29:57.159595024 +0100
+@@ -348,7 +348,7 @@ AM_CONDITIONAL(SESSION_TRACKING_CK, test
+ AM_CONDITIONAL(SESSION_TRACKING_SYSTEMD, test "$with_session_tracking" = "systemd")
+ if test "$with_session_tracking" = "systemd"; then
+ PKG_CHECK_MODULES(SYSTEMD_LOGIN, [libsystemd],,
+- [PKG_CHECK_MODULES(SYSTEMD_LOGIN, [libsystemd-login])])
++ [PKG_CHECK_MODULES(SYSTEMD_LOGIN, [libsystemd-daemon libsystemd-login])])
+ AC_SUBST(SYSTEMD_LOGIN_CFLAGS)
+ AC_SUBST(SYSTEMD_LOGIN_LIBS)
+ fi
+--- NetworkManager-1.0.0/src/nm-session-monitor-systemd.c.orig 2014-12-11 22:28:51.000000000 +0100
++++ NetworkManager-1.0.0/src/nm-session-monitor-systemd.c 2014-12-21 11:30:09.859311469 +0100
+@@ -29,10 +29,14 @@
#include <glib/gstdio.h>
#include <systemd/sd-login.h>
#include <stdlib.h>
+#include <systemd/sd-daemon.h>
+#include <sys/stat.h>
+#include <gio/gio.h>
-+#include "nm-logging.h"
#include "nm-session-utils.h"
#include "nm-session-monitor.h"
-@@ -108,10 +112,20 @@
+ #include "nm-logging.h"
++#include "nm-errors.h"
+
+ /********************************************************************/
+
+@@ -109,10 +113,18 @@ sd_source_new (void)
return source;
}
-+/********************************************************************/
-+
+#define CKDB_PATH "/var/run/ConsoleKit/database"
+
struct _NMSessionMonitor {
};
struct _NMSessionMonitorClass {
-@@ -131,6 +145,215 @@
+@@ -132,6 +144,215 @@ G_DEFINE_TYPE (NMSessionMonitor, nm_sess
/* ---------------------------------------------------------------------------------------------------- */
+
+ if (!error) {
+ g_set_error (error,
-+ NM_SESSION_MONITOR_ERROR,
-+ NM_SESSION_MONITOR_ERROR_MALFORMED_DATABASE,
++ NM_MANAGER_ERROR,
++ NM_MANAGER_ERROR_FAILED,
+ "ConsoleKit database " CKDB_PATH " group '%s' had no '%s' key",
+ group, key);
+ }
+ errno = 0;
+ if (stat (CKDB_PATH, &statbuf) != 0) {
+ g_set_error (error,
-+ NM_SESSION_MONITOR_ERROR,
-+ errno == ENOENT ? NM_SESSION_MONITOR_ERROR_NO_DATABASE : NM_SESSION_MONITOR_ERROR_IO_ERROR,
++ NM_MANAGER_ERROR,
++ NM_MANAGER_ERROR_FAILED,
+ "Error statting file " CKDB_PATH ": %s",
+ strerror (errno));
+ goto error;
+ groups = g_key_file_get_groups (self->database, &len);
+ if (!groups) {
+ g_set_error_literal (error,
-+ NM_SESSION_MONITOR_ERROR,
-+ NM_SESSION_MONITOR_ERROR_IO_ERROR,
++ NM_MANAGER_ERROR,
++ NM_MANAGER_ERROR_FAILED,
+ "Could not load groups from " CKDB_PATH "");
+ goto error;
+ }
+ errno = 0;
+ if (stat (CKDB_PATH, &statbuf) != 0) {
+ g_set_error (error,
-+ NM_SESSION_MONITOR_ERROR,
-+ errno == ENOENT ? NM_SESSION_MONITOR_ERROR_NO_DATABASE : NM_SESSION_MONITOR_ERROR_IO_ERROR,
++ NM_MANAGER_ERROR,
++ NM_MANAGER_ERROR_FAILED,
+ "Error statting file " CKDB_PATH " to check timestamp: %s",
+ strerror (errno));
+ goto out;
static gboolean
sessions_changed (gpointer user_data)
{
-@@ -144,9 +367,50 @@
+@@ -145,9 +366,46 @@ sessions_changed (gpointer user_data)
static void
nm_session_monitor_init (NMSessionMonitor *monitor)
{
+ monitor->database_monitor = NULL;
+ monitor->database = NULL;
+ } else {
-+ monitor->sd_source = NULL;
-+
+ GError *error = NULL;
+ GFile *file;
+
++ monitor->sd_source = NULL;
++
+ /* Sessions-by-user is responsible for destroying the Session objects */
+ monitor->sessions_by_user = g_hash_table_new_full (g_str_hash, g_str_equal,
-+ NULL, (GDestroyNotify) session_free);
++ NULL, (GDestroyNotify) session_free);
+ monitor->sessions_by_uid = g_hash_table_new (g_direct_hash, g_direct_equal);
+
+
-+ error = NULL;
+ if (!ensure_database (monitor, &error)) {
-+ /* Ignore the first error if the CK database isn't found yet */
-+ if (g_error_matches (error,
-+ NM_SESSION_MONITOR_ERROR,
-+ NM_SESSION_MONITOR_ERROR_NO_DATABASE) == FALSE) {
-+ nm_log_err (LOGD_CORE, "Error loading " CKDB_PATH ": %s", error->message);
-+ }
++ nm_log_dbg (LOGD_CORE, "Error loading " CKDB_PATH ": %s", error->message);
++
++ /* Ignore the first error, the CK database might not exist yet */
+ g_error_free (error);
++ error = NULL;
+ }
+
-+ error = NULL;
+ file = g_file_new_for_path (CKDB_PATH);
+ monitor->database_monitor = g_file_monitor_file (file, G_FILE_MONITOR_NONE, NULL, &error);
+ g_object_unref (file);
+ g_error_free (error);
+ } else {
+ g_signal_connect (monitor->database_monitor,
-+ "changed",
-+ G_CALLBACK (on_file_monitor_changed),
-+ monitor);
++ "changed",
++ G_CALLBACK (on_file_monitor_changed),
++ monitor);
+ }
+ }
}
static void
-@@ -159,6 +423,12 @@
- g_source_unref (monitor->sd_source);
- }
+@@ -155,11 +413,19 @@ nm_session_monitor_finalize (GObject *ob
+ {
+ NMSessionMonitor *monitor = NM_SESSION_MONITOR (object);
-+ if (monitor->database_monitor != NULL)
-+ g_object_unref (monitor->database_monitor);
+- if (monitor->sd_source != NULL) {
+- g_source_destroy (monitor->sd_source);
+- g_source_unref (monitor->sd_source);
++ if (sd_booted () > 0) {
++ if (monitor->sd_source != NULL) {
++ g_source_destroy (monitor->sd_source);
++ g_source_unref (monitor->sd_source);
++ }
++ } else {
++ if (monitor->database_monitor != NULL)
++ g_object_unref (monitor->database_monitor);
+
-+ if (monitor->database != NULL)
+ free_database (monitor);
+ }
+
+
if (G_OBJECT_CLASS (nm_session_monitor_parent_class)->finalize != NULL)
G_OBJECT_CLASS (nm_session_monitor_parent_class)->finalize (object);
}
-@@ -207,15 +477,36 @@
+@@ -205,15 +471,36 @@ nm_session_monitor_user_has_session (NMS
uid_t *out_uid,
GError **error)
{
- uid_t uid;
-+ if (monitor->sd_source != NULL) {
++ if (sd_booted () > 0) {
+ uid_t uid;
- if (!nm_session_user_to_uid (username, &uid, error))
+ s = g_hash_table_lookup (monitor->sessions_by_user, (gpointer) username);
+ if (!s) {
+ g_set_error (error,
-+ NM_SESSION_MONITOR_ERROR,
-+ NM_SESSION_MONITOR_ERROR_UNKNOWN_USER,
-+ "No session found for user '%s'",
-+ username);
++ NM_MANAGER_ERROR,
++ NM_MANAGER_ERROR_FAILED,
++ "No session found for user '%s'",
++ username);
+ return FALSE;
+ }
+
}
gboolean
-@@ -223,12 +514,31 @@
+@@ -221,12 +508,31 @@ nm_session_monitor_user_active (NMSessio
const char *username,
GError **error)
{
- uid_t uid;
-+ if (monitor->sd_source != NULL) {
++ if (sd_booted () > 0) {
+ uid_t uid;
- if (!nm_session_user_to_uid (username, &uid, error))
- return FALSE;
+ if (!nm_session_user_to_uid (username, &uid, error))
+ return FALSE;
-
-- return nm_session_monitor_uid_active (monitor, uid, error);
++
+ return nm_session_monitor_uid_active (monitor, uid, error);
+ } else {
+ Session *s;
+ s = g_hash_table_lookup (monitor->sessions_by_user, (gpointer) username);
+ if (!s) {
+ g_set_error (error,
-+ NM_SESSION_MONITOR_ERROR,
-+ NM_SESSION_MONITOR_ERROR_UNKNOWN_USER,
-+ "No session found for user '%s'",
-+ username);
++ NM_MANAGER_ERROR,
++ NM_MANAGER_ERROR_FAILED,
++ "No session found for user '%s'",
++ username);
+ return FALSE;
+ }
-+
+
+- return nm_session_monitor_uid_active (monitor, uid, error);
+ return s->active;
+ }
}
gboolean
-@@ -239,16 +549,37 @@
+@@ -235,19 +541,40 @@ nm_session_monitor_uid_has_session (NMSe
+ const char **out_user,
+ GError **error)
{
- int ret;
+- int num_sessions;
++ if (sd_booted () > 0) {
++ int num_sessions;
- if (!nm_session_uid_to_user (uid, out_user, error))
- return FALSE;
-+ if (monitor->sd_source != NULL) {
+ if (!nm_session_uid_to_user (uid, out_user, error))
+ return FALSE;
-- ret = sd_uid_get_sessions (uid, FALSE, NULL) > 0;
-- if (ret < 0) {
+- /* Get all sessions (including inactive ones) for the user */
+- num_sessions = sd_uid_get_sessions (uid, 0, NULL);
+- if (num_sessions < 0) {
- nm_log_warn (LOGD_CORE, "Failed to get systemd sessions for uid %d: %d",
-- uid, ret);
+- uid, num_sessions);
- return FALSE;
-+ ret = sd_uid_get_sessions (uid, FALSE, NULL) > 0;
-+ if (ret < 0) {
++ /* Get all sessions (including inactive ones) for the user */
++ num_sessions = sd_uid_get_sessions (uid, 0, NULL);
++ if (num_sessions < 0) {
+ nm_log_warn (LOGD_CORE, "Failed to get systemd sessions for uid %d: %d",
-+ uid, ret);
++ uid, num_sessions);
+ return FALSE;
+ }
-+ return ret > 0 ? TRUE : FALSE;
++ return num_sessions > 0;
+ } else {
+ Session *s;
+
+ s = g_hash_table_lookup (monitor->sessions_by_uid, GUINT_TO_POINTER (uid));
+ if (!s) {
+ g_set_error (error,
-+ NM_SESSION_MONITOR_ERROR,
-+ NM_SESSION_MONITOR_ERROR_UNKNOWN_USER,
-+ "No session found for uid %d",
-+ uid);
++ NM_MANAGER_ERROR,
++ NM_MANAGER_ERROR_FAILED,
++ "No session found for uid %d",
++ uid);
+ return FALSE;
+ }
+
+ *out_user = s->user;
+ return TRUE;
}
-- return ret > 0 ? TRUE : FALSE;
+- return num_sessions > 0;
}
gboolean
-@@ -258,11 +589,30 @@
+@@ -255,14 +582,33 @@ nm_session_monitor_uid_active (NMSession
+ uid_t uid,
+ GError **error)
{
- int ret;
+- int num_sessions;
++ if (sd_booted () > 0) {
++ int num_sessions;
-- ret = sd_uid_get_sessions (uid, TRUE, NULL) > 0;
-- if (ret < 0) {
+- /* Get active sessions for the user */
+- num_sessions = sd_uid_get_sessions (uid, 1, NULL);
+- if (num_sessions < 0) {
- nm_log_warn (LOGD_CORE, "Failed to get active systemd sessions for uid %d: %d",
-- uid, ret);
+- uid, num_sessions);
- return FALSE;
-+ if (monitor->sd_source != NULL) {
-+ ret = sd_uid_get_sessions (uid, TRUE, NULL) > 0;
-+ if (ret < 0) {
++ /* Get active sessions for the user */
++ num_sessions = sd_uid_get_sessions (uid, 1, NULL);
++ if (num_sessions < 0) {
+ nm_log_warn (LOGD_CORE, "Failed to get active systemd sessions for uid %d: %d",
-+ uid, ret);
++ uid, num_sessions);
+ return FALSE;
+ }
-+ return ret > 0 ? TRUE : FALSE;
++ return num_sessions > 0;
+ } else {
+ Session *s;
+
+ s = g_hash_table_lookup (monitor->sessions_by_uid, GUINT_TO_POINTER (uid));
+ if (!s) {
+ g_set_error (error,
-+ NM_SESSION_MONITOR_ERROR,
-+ NM_SESSION_MONITOR_ERROR_UNKNOWN_USER,
-+ "No session found for uid '%d'",
-+ uid);
++ NM_MANAGER_ERROR,
++ NM_MANAGER_ERROR_FAILED,
++ "No session found for uid '%d'",
++ uid);
+ return FALSE;
+ }
+
+ return s->active;
}
-- return ret > 0 ? TRUE : FALSE;
+- return num_sessions > 0;
+ }
+--- NetworkManager-1.0.0/src/nm-sleep-monitor-systemd.c.orig 2014-12-19 23:32:53.481973137 +0100
++++ NetworkManager-1.0.0/src/nm-sleep-monitor-systemd.c 2014-12-20 00:12:04.572281013 +0100
+@@ -35,12 +35,15 @@
+ #define SD_PATH "/org/freedesktop/login1"
+ #define SD_INTERFACE "org.freedesktop.login1.Manager"
+
++#define UPOWER_DBUS_SERVICE "org.freedesktop.UPower"
+
+ struct _NMSleepMonitor {
+ GObject parent_instance;
+
+ GDBusProxy *sd_proxy;
+ gint inhibit_fd;
++
++ DBusGProxy *upower_proxy;
+ };
+
+ struct _NMSleepMonitorClass {
+@@ -62,6 +65,20 @@ G_DEFINE_TYPE (NMSleepMonitor, nm_sleep_
+
+ /********************************************************************/
+
++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 gboolean
+ drop_inhibitor (NMSleepMonitor *self)
+ {
+@@ -193,14 +210,37 @@ on_proxy_acquired (GObject *object,
+ static void
+ nm_sleep_monitor_init (NMSleepMonitor *self)
+ {
+- self->inhibit_fd = -1;
+- g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
+- G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START |
+- G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
+- NULL,
+- SD_NAME, SD_PATH, SD_INTERFACE,
+- NULL,
+- (GAsyncReadyCallback) on_proxy_acquired, self);
++ if (sd_booted () > 0) {
++ self->inhibit_fd = -1;
++ g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
++ G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START |
++ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
++ NULL,
++ SD_NAME, SD_PATH, SD_INTERFACE,
++ NULL,
++ (GAsyncReadyCallback) on_proxy_acquired, self);
++ } else {
++ DBusGConnection *bus;
++
++ bus = nm_dbus_manager_get_connection (nm_dbus_manager_get ());
++ 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");
++ }
++ }
}
+
+ static void
+@@ -208,9 +248,14 @@ finalize (GObject *object)
+ {
+ NMSleepMonitor *self = NM_SLEEP_MONITOR (object);
+
+- drop_inhibitor (self);
+- if (self->sd_proxy)
+- g_object_unref (self->sd_proxy);
++ if (sd_booted () > 0) {
++ drop_inhibitor (self);
++ if (self->sd_proxy)
++ g_object_unref (self->sd_proxy);
++ } else {
++ 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);