From 93825e7065c0e1665edb7f0013a6265b9a44795a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 28 Jul 2011 04:18:16 +0200 Subject: [PATCH] at_console: ask systemd whether a user is at the console systemd manages seats and users. This patch optionally asks systemd whether a user is at the console. It used libsystemd-login for that, a low-level library that allows querying this kind of information without expensive round trips. In order to be nice to the Debian folks this patch falls back to traditional modes of operation if systemd is not found to be around. --- configure.ac | 22 ++++++++++++++++- dbus/dbus-userdb-util.c | 56 +++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index c9ebd11..2a1ccb5 100644 --- a/configure.ac +++ b/configure.ac @@ -137,6 +137,7 @@ AC_ARG_ENABLE(kqueue, AS_HELP_STRING([--enable-kqueue],[build with kqueue suppor AC_ARG_ENABLE(console-owner-file, AS_HELP_STRING([--enable-console-owner-file],[enable console owner file]),enable_console_owner_file=$enableval,enable_console_owner_file=auto) AC_ARG_ENABLE(userdb-cache, AS_HELP_STRING([--enable-userdb-cache],[build with userdb-cache support]),enable_userdb_cache=$enableval,enable_userdb_cache=yes) AC_ARG_ENABLE(launchd, AS_HELP_STRING([--enable-launchd],[build with launchd auto-launch support]),enable_launchd=$enableval,enable_launchd=auto) +AC_ARG_ENABLE(systemd, AS_HELP_STRING([--enable-systemd],[build with systemd at_console support]),enable_systemd=$enableval,enable_systemd=auto) AC_ARG_WITH(xml, AS_HELP_STRING([--with-xml=[libxml/expat]],[XML library to use (libxml may be named libxml2 on some systems)])) AC_ARG_WITH(init-scripts, AS_HELP_STRING([--with-init-scripts=[redhat]],[Style of init scripts to install])) @@ -1067,6 +1068,22 @@ fi AM_CONDITIONAL(HAVE_CONSOLE_OWNER_FILE, test x$have_console_owner_file = xyes) +dnl systemd detection +if test x$enable_systemd = xno ; then + have_systemd=no; +else + PKG_CHECK_MODULES(SYSTEMD, + [ libsystemd-login libsystemd-daemon ], + have_systemd=yes, + have_systemd=no) + AC_SUBST(SYSTEMD_CFLAGS) + AC_SUBST(SYSTEMD_LIBS) +fi + +if test x$have_systemd = xyes; then + AC_DEFINE(HAVE_SYSTEMD,1,[Have systemd]) +fi + # libaudit detection if test x$enable_libaudit = xno ; then have_libaudit=no; @@ -1125,8 +1142,8 @@ if test x$dbus_win = xyes ; then fi #### Set up final flags -DBUS_CLIENT_CFLAGS= -DBUS_CLIENT_LIBS="$THREAD_LIBS $NETWORK_libs" +DBUS_CLIENT_CFLAGS="$SYSTEMD_CFLAGS" +DBUS_CLIENT_LIBS="$THREAD_LIBS $NETWORK_libs $SYSTEMD_LIBS" AC_SUBST(DBUS_CLIENT_CFLAGS) AC_SUBST(DBUS_CLIENT_LIBS) @@ -1649,6 +1666,7 @@ echo " Building inotify support: ${have_inotify} Building dnotify support: ${have_dnotify} Building kqueue support: ${have_kqueue} + Building systemd support: ${have_systemd} Building X11 code: ${enable_x11} Building Doxygen docs: ${enable_doxygen_docs} Building XML docs: ${enable_xml_docs} diff --git a/dbus/dbus-userdb-util.c b/dbus/dbus-userdb-util.c index c44c014..b805d5b 100644 --- a/dbus/dbus-userdb-util.c +++ b/dbus/dbus-userdb-util.c @@ -27,6 +27,12 @@ #include "dbus-internals.h" #include "dbus-protocol.h" #include +#include + +#if HAVE_SYSTEMD +#include +#include +#endif /** * @addtogroup DBusInternalsUtils @@ -47,7 +53,46 @@ _dbus_is_console_user (dbus_uid_t uid, DBusUserDatabase *db; const DBusUserInfo *info; - dbus_bool_t result = FALSE; + dbus_bool_t result = FALSE; + +#ifdef HAVE_SYSTEMD + if (sd_booted() > 0) + { + int r; + char **seats; + dbus_bool_t have_seats = FALSE; + + /* Check whether this user is logged in on at least one physical + seat */ + r = sd_uid_get_seats (uid, 0, &seats); + if (r < 0) + { + dbus_set_error (error, _dbus_error_from_errno (-r), + "Failed to determine seats of user \"%lu\": %s", + (unsigned long) uid, + _dbus_strerror (-r)); + return FALSE; + } + + if (seats) + { + unsigned k; + + /* We can't use dbus_free_string_array() here since that + might be redirected to an alternative free() + implementation. */ + for (k = 0; seats[k]; k++) + { + free (seats[k]); + } + + free (seats); + have_seats = k > 0; + } + + return have_seats; + } +#endif #ifdef HAVE_CONSOLE_OWNER_FILE @@ -414,6 +459,7 @@ _dbus_userdb_test (const char *test_data_dir) dbus_uid_t uid; unsigned long *group_ids; int n_group_ids, i; + DBusError error; if (!_dbus_username_from_current_process (&username)) _dbus_assert_not_reached ("didn't get username"); @@ -435,7 +481,13 @@ _dbus_userdb_test (const char *test_data_dir) printf(" %ld", group_ids[i]); printf ("\n"); - + + dbus_error_init (&error); + printf ("Is Console user: %i\n", + _dbus_is_console_user(uid, &error)); + printf ("Invocation was OK: %s\n", error.message ? error.message : "yes"); + dbus_error_free (&error); + dbus_free (group_ids); return TRUE; -- 1.7.6