From 360e80b75faead6595ceb4ca8cd91dd7fbaa2f47 Mon Sep 17 00:00:00 2001 From: Sven Eden Date: Fri, 24 Feb 2017 12:37:34 +0100 Subject: session: add elogind support https://bugzilla.gnome.org/show_bug.cgi?id=779167 https://bugs.gentoo.org/show_bug.cgi?id=607352 --- configure.ac | 43 +++++++++++++++++++++++++++++++++++-------- src/nm-session-monitor.c | 17 +++++++++++++++++ src/nm-sleep-monitor.c | 4 ++-- 3 files changed, 54 insertions(+), 10 deletions(-) diff --git a/configure.ac b/configure.ac index 354db306e8..c5d43e5525 100644 --- a/configure.ac +++ b/configure.ac @@ -428,14 +428,15 @@ AC_ARG_WITH(systemd-logind, AS_HELP_STRING([--with-systemd-logind=yes|no], [Support systemd session tracking])) AC_ARG_WITH(consolekit, AS_HELP_STRING([--with-consolekit=yes|no], [Support consolekit session tracking])) -AC_ARG_WITH(session-tracking, AS_HELP_STRING([--with-session-tracking=systemd|consolekit|no], +AC_ARG_WITH(session-tracking, AS_HELP_STRING([--with-session-tracking=systemd|elogind|consolekit|no], [Compatibility option to choose one session tracking module])) # backwards compatibility -AS_IF([test "$with_session_tracking" = "ck"], [use_consolekit="yes" use_systemd_logind="no"]) -AS_IF([test "$with_session_tracking" = "consolekit"], [use_consolekit="yes" use_systemd_logind="no"]) -AS_IF([test "$with_session_tracking" = "systemd"], [use_consolekit="no" use_systemd_logind="yes"]) -AS_IF([test "$with_session_tracking" = "no"], [use_consolekit="no" use_systemd_logind="no"]) -AS_IF([test "$with_session_tracking" = "none"], [use_consolekit="no" use_systemd_logind="no"]) +AS_IF([test "$with_session_tracking" = "ck"], [use_consolekit="yes" use_systemd_logind="no" use_elogind="no"]) +AS_IF([test "$with_session_tracking" = "consolekit"], [use_consolekit="yes" use_systemd_logind="no" use_elogind="no"]) +AS_IF([test "$with_session_tracking" = "systemd"], [use_consolekit="no" use_systemd_logind="yes" use_elogind="no"]) +AS_IF([test "$with_session_tracking" = "elogind"], [use_consolekit="no" use_systemd_logind="no" use_elogind="yes"]) +AS_IF([test "$with_session_tracking" = "no"], [use_consolekit="no" use_systemd_logind="no" use_elogind="no"]) +AS_IF([test "$with_session_tracking" = "none"], [use_consolekit="no" use_systemd_logind="no" use_elogind="no"]) # current options AS_IF([test -n "$with_systemd_logind" ], [use_systemd_logind="$with_systemd_logind"]) AS_IF([test -n "$with_consolekit" ], [use_consolekit="$with_consolekit"]) @@ -456,6 +457,20 @@ if test "$have_systemd_logind" = "yes"; then AC_DEFINE([SESSION_TRACKING_SYSTEMD], 1, [Define to 1 if libsystemd-login is available]) session_tracking="$session_tracking, systemd-logind" fi + +if test "$use_elogind" = "yes" -o "$use_elogind" = "auto"; then + PKG_CHECK_MODULES(SYSTEMD_LOGIN, [libelogind], [have_elogind=yes], [PKG_CHECK_MODULES(SYSTEMD_LOGIN, [libelogind], [have_elogind=yes], [have_elogind=no])]) +else + have_elogind=no +fi +if test "$use_elogind" = "yes" -a "$have_elogind" = "no"; then + AC_MSG_ERROR([You must have libelogind installed to build with elogind support.]) +fi +if test "$have_elogind" = "yes"; then + AC_DEFINE([SESSION_TRACKING_ELOGIND], 1, [Define to 1 if libelogin is available]) + session_tracking="$session_tracking, elogind" +fi + if test "$use_consolekit" = "yes"; then AC_DEFINE([SESSION_TRACKING_CONSOLEKIT], 1, [Define to 1 if ConsoleKit is available]) AC_DEFINE([CKDB_PATH], "/var/run/ConsoleKit/database", [Path to ConsoleKit database]) @@ -463,7 +478,7 @@ if test "$use_consolekit" = "yes"; then fi session_tracking="$(printf '%s' "${session_tracking}" | sed 's/^, //')" -AC_ARG_WITH(suspend-resume, AS_HELP_STRING([--with-suspend-resume=upower|systemd|consolekit], [Build NetworkManager with specific suspend/resume support])) +AC_ARG_WITH(suspend-resume, AS_HELP_STRING([--with-suspend-resume=upower|systemd|elogind|consolekit], [Build NetworkManager with specific suspend/resume support])) if test "z$with_suspend_resume" = "z"; then PKG_CHECK_EXISTS([libsystemd >= 209], [have_systemd_inhibit=yes], [PKG_CHECK_EXISTS([libsystemd-login >= 183], [have_systemd_inhibit=yes], [have_systemd_inhibit=no])]) @@ -471,6 +486,12 @@ if test "z$with_suspend_resume" = "z"; then # Use systemd if it's new enough with_suspend_resume="systemd" else + PKG_CHECK_EXISTS([libelogind >= 219], [have_elogind_inhibit=yes], + [PKG_CHECK_EXISTS([libelogind >= 219], [have_elogind_inhibit=yes], [have_elogind_inhibit=no])]) + if test "z${have_elogind_inhibit}" = "zyes"; then + # Use elogind if it's new enough + with_suspend_resume="elogind" + else if test "$use_consolekit" = "yes"; then # Use consolekit suspend if session tracking is consolekit with_suspend_resume="consolekit" @@ -480,6 +501,7 @@ if test "z$with_suspend_resume" = "z"; then fi fi fi +fi case $with_suspend_resume in upower) @@ -490,11 +512,16 @@ case $with_suspend_resume in [PKG_CHECK_MODULES(SYSTEMD_INHIBIT, [libsystemd-login >= 183])]) AC_DEFINE([SUSPEND_RESUME_SYSTEMD], 1, [Define to 1 to use systemd suspend api]) ;; + elogind) + PKG_CHECK_MODULES(ELOGIND_INHIBIT, [libelogind >= 219],, + [PKG_CHECK_MODULES(ELOGIND_INHIBIT, [libelogind >= 219])]) + AC_DEFINE([SUSPEND_RESUME_ELOGIND], 1, [Define to 1 to use elogind suspend api]) + ;; consolekit) AC_DEFINE([SUSPEND_RESUME_CONSOLEKIT], 1, [Define to 1 to use ConsoleKit2 suspend api]) ;; *) - AC_MSG_ERROR(--with-suspend-resume must be one of [upower, systemd, consolekit]) + AC_MSG_ERROR(--with-suspend-resume must be one of [upower, systemd, elogind, consolekit]) ;; esac diff --git a/src/nm-session-monitor.c b/src/nm-session-monitor.c index b37db362fd..342ec55f94 100644 --- a/src/nm-session-monitor.c +++ b/src/nm-session-monitor.c @@ -31,6 +31,11 @@ #ifdef SESSION_TRACKING_SYSTEMD #include #endif +#ifdef SESSION_TRACKING_ELOGIND +#include +/* Re-Use SESSION_TRACKING_SYSTEMD as elogind substitutes systemd-login */ +#define SESSION_TRACKING_SYSTEMD 1 +#endif #include "NetworkManagerUtils.h" @@ -85,7 +90,11 @@ st_sd_session_exists (NMSessionMonitor *monitor, uid_t uid, gboolean active) status = sd_uid_get_sessions (uid, active, NULL); if (status < 0) +#ifdef SESSION_TRACKING_ELOGIND + _LOGE ("failed to get elogind sessions for uid %d: %d", uid, status); +#else _LOGE ("failed to get systemd sessions for uid %d: %d", uid, status); +#endif /* SESSION_TRACKING_ELOGIND */ return status > 0; } @@ -112,7 +121,11 @@ st_sd_init (NMSessionMonitor *monitor) return; if ((status = sd_login_monitor_new (NULL, &monitor->sd.monitor)) < 0) { +#ifdef SESSION_TRACKING_ELOGIND + _LOGE ("failed to create elogind monitor: %d", status); +#else _LOGE ("failed to create systemd login monitor: %d", status); +#endif /* SESSION_TRACKING_ELOGIND */ return; } @@ -357,7 +370,11 @@ nm_session_monitor_init (NMSessionMonitor *monitor) { #ifdef SESSION_TRACKING_SYSTEMD st_sd_init (monitor); +#ifdef SESSION_TRACKING_ELOGIND + _LOGD ("using elogind session tracking"); +#else _LOGD ("using systemd-logind session tracking"); +#endif /* SESSION_TRACKING_ELOGIND */ #endif #ifdef SESSION_TRACKING_CONSOLEKIT diff --git a/src/nm-sleep-monitor.c b/src/nm-sleep-monitor.c index 3be542c7dd..edef04f80f 100644 --- a/src/nm-sleep-monitor.c +++ b/src/nm-sleep-monitor.c @@ -38,7 +38,7 @@ #define USE_UPOWER 1 #define _NMLOG_PREFIX_NAME "sleep-monitor-up" -#elif defined (SUSPEND_RESUME_SYSTEMD) +#elif defined (SUSPEND_RESUME_SYSTEMD) || defined (SUSPEND_RESUME_ELOGIND) #define SUSPEND_DBUS_NAME "org.freedesktop.login1" #define SUSPEND_DBUS_PATH "/org/freedesktop/login1" @@ -60,7 +60,7 @@ #else -#error define one of SUSPEND_RESUME_SYSTEMD, SUSPEND_RESUME_CONSOLEKIT, or SUSPEND_RESUME_UPOWER +#error define one of SUSPEND_RESUME_SYSTEMD, SUSPEND_RESUME_ELOGIND, SUSPEND_RESUME_CONSOLEKIT, or SUSPEND_RESUME_UPOWER #endif -- cgit v1.2.1