REVERT: (breaks listing users in gdm and gnome-cc and unlocking screenshield) From c7fa612023a163e8b2352e1170c6df3fceb19b27 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 19 Jul 2018 13:14:09 -0400 Subject: [PATCH] lib: don't set loaded state until seat is fetched Index: src/libaccountsservice/act-user-manager.c --- src/libaccountsservice/act-user-manager.c.orig +++ src/libaccountsservice/act-user-manager.c @@ -40,7 +40,11 @@ #include #include #include +#ifdef __linux__ #include +#else +#include +#endif #include "act-user-manager.h" #include "act-user-private.h" @@ -100,9 +104,11 @@ typedef struct char *id; char *session_id; guint load_idle_id; +#ifdef __linux__ sd_login_monitor *session_monitor; GInputStream *session_monitor_stream; guint session_monitor_source_id; +#endif } ActUserManagerSeat; typedef enum @@ -274,6 +280,7 @@ activate_systemd_session_id (ActUserManager *manager, return FALSE; } +#ifdef __linux__ reply = g_dbus_connection_call_sync (connection, "org.freedesktop.login1", "/org/freedesktop/login1", @@ -287,6 +294,21 @@ activate_systemd_session_id (ActUserManager *manager, -1, NULL, &error); +#else + reply = g_dbus_connection_call_sync (connection, + "org.freedesktop.ConsoleKit", + "/org/freedesktop/ConsoleKit/Manager", + "org.freedesktop.ConsoleKit.Manager", + "ActivateSessionOnSeat", + g_variant_new ("(ss)", + seat_id, + session_id), + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); +#endif if (reply == NULL) { g_warning ("Unable to activate session: %s", error->message); return FALSE; @@ -322,9 +344,7 @@ session_is_on_our_seat (ActUserManager *manager, g_autofree gchar *session_seat = NULL; res = sd_session_get_seat (session_id, &session_seat); - if (res == -ENODATA) { - return FALSE; - } else if (res < 0) { + if (res < 0) { g_debug ("failed to determine seat of session %s: %s", session_id, strerror (-res)); @@ -641,9 +661,7 @@ get_seat_id_for_current_session (ActUserManager *manag res = sd_session_get_seat (priv->seat.session_id, &seat_id); - if (res == -ENODATA) { - seat_id = NULL; - } else if (res < 0) { + if (res < 0) { g_warning ("Could not get current seat: %s", strerror (-res)); unload_seat (manager); @@ -1391,8 +1409,12 @@ get_x11_display_for_new_session (ActUserManagerNewSess goto done; } +#ifndef __OpenBSD__ res = sd_session_get_display (new_session->id, &x11_display); +#else + res = -1; +#endif if (res < 0) { g_debug ("ActUserManager: Failed to get the x11 display of session '%s': %s", new_session->id, @@ -1671,6 +1693,7 @@ reload_systemd_sessions (ActUserManager *manager) _remove_stale_systemd_sessions (manager, systemd_sessions); } +#ifdef __linux__ static gboolean on_session_monitor_event (GPollableInputStream *stream, ActUserManager *manager) @@ -1681,10 +1704,12 @@ on_session_monitor_event (GPollableInputStream *stream reload_systemd_sessions (manager); return TRUE; } +#endif static void _monitor_for_systemd_session_changes (ActUserManager *manager) { +#ifdef __linux__ ActUserManagerPrivate *priv = act_user_manager_get_instance_private (manager); int res; int fd; @@ -1711,6 +1736,7 @@ _monitor_for_systemd_session_changes (ActUserManager * NULL); priv->seat.session_monitor_source_id = g_source_attach (source, NULL); g_source_unref (source); +#endif } static void @@ -2180,7 +2206,7 @@ maybe_set_is_loaded (ActUserManager *manager) /* Don't set is_loaded yet unless the seat is already loaded enough * or failed to load. */ - if (priv->seat.state > ACT_USER_MANAGER_SEAT_STATE_GET_ID) { + if (priv->seat.state >= ACT_USER_MANAGER_SEAT_STATE_GET_ID) { g_debug ("ActUserManager: Seat loaded, so now setting loaded property"); } else if (priv->seat.state == ACT_USER_MANAGER_SEAT_STATE_UNLOADED) { g_debug ("ActUserManager: Seat wouldn't load, so giving up on it and setting loaded property"); @@ -2670,6 +2696,7 @@ act_user_manager_finalize (GObject *object) g_source_remove (priv->seat.load_idle_id); } +#ifdef __linux__ if (priv->seat.session_monitor != NULL) { sd_login_monitor_unref (priv->seat.session_monitor); } @@ -2681,6 +2708,7 @@ act_user_manager_finalize (GObject *object) if (priv->seat.session_monitor_source_id != 0) { g_source_remove (priv->seat.session_monitor_source_id); } +#endif if (priv->accounts_proxy != NULL) { g_object_unref (priv->accounts_proxy);