diff --git a/SOURCES/0001-display-factory-avoid-removing-a-display-from-store-.patch b/SOURCES/0001-display-factory-avoid-removing-a-display-from-store-.patch index 3176b34..bd73d6d 100644 --- a/SOURCES/0001-display-factory-avoid-removing-a-display-from-store-.patch +++ b/SOURCES/0001-display-factory-avoid-removing-a-display-from-store-.patch @@ -1,7 +1,7 @@ -From 25721ebd70cd8022b0acd95f1c7494ac2ef8b2d8 Mon Sep 17 00:00:00 2001 +From a9422c7b5f4200ad36300bb06134d545bb9d48d2 Mon Sep 17 00:00:00 2001 From: Lubomir Rintel Date: Tue, 17 Jul 2018 20:20:55 +0000 -Subject: [PATCH 01/48] display-factory: avoid removing a display from store +Subject: [PATCH 01/51] display-factory: avoid removing a display from store while iterating it --- @@ -316,7 +316,7 @@ index ab7e12e91..1a9196ee1 100644 /* workaround logind race for now * bug 1643874 */ - sleep (2); + g_usleep (2 * G_USEC_PER_SEC); } #endif @@ -429,5 +429,5 @@ index 46a0d9ffa..5b5786c6f 100644 static GdmDisplay * gdm_xdmcp_display_create (GdmXdmcpDisplayFactory *factory, -- -2.26.0 +2.27.0 diff --git a/SOURCES/0001-local-display-factory-pause-for-a-few-seconds-before.patch b/SOURCES/0001-local-display-factory-pause-for-a-few-seconds-before.patch index 543ecb9..56e096c 100644 --- a/SOURCES/0001-local-display-factory-pause-for-a-few-seconds-before.patch +++ b/SOURCES/0001-local-display-factory-pause-for-a-few-seconds-before.patch @@ -54,7 +54,7 @@ index 403921d32..ab7e12e91 100644 + /* workaround logind race for now + * bug 1643874 + */ -+ sleep (2); ++ g_usleep (2 * G_USEC_PER_SEC); } #endif diff --git a/SOURCES/0002-local-display-factory-Add-gdm_local_display_factory_.patch b/SOURCES/0002-local-display-factory-Add-gdm_local_display_factory_.patch index 79c717b..b93dbda 100644 --- a/SOURCES/0002-local-display-factory-Add-gdm_local_display_factory_.patch +++ b/SOURCES/0002-local-display-factory-Add-gdm_local_display_factory_.patch @@ -1,7 +1,7 @@ -From 1541f84c4e782ba5e403dd5fc4cbb2cede9ca568 Mon Sep 17 00:00:00 2001 +From 417f0aed42959719c40f0f8ec65050dcf2510bd1 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Wed, 16 May 2018 14:10:34 +0100 -Subject: [PATCH 02/48] local-display-factory: Add +Subject: [PATCH 02/51] local-display-factory: Add gdm_local_display_factory_use_wayland() helper Factor out the code which decides if Xorg or Wayland should be used into @@ -160,5 +160,5 @@ index 1a9196ee1..b21e3aee0 100644 on_seat_removed (GDBusConnection *connection, const gchar *sender_name, -- -2.26.0 +2.27.0 diff --git a/SOURCES/0003-local-display-factory-Use-correct-session-type-for-n.patch b/SOURCES/0003-local-display-factory-Use-correct-session-type-for-n.patch index edb6b82..3bc4336 100644 --- a/SOURCES/0003-local-display-factory-Use-correct-session-type-for-n.patch +++ b/SOURCES/0003-local-display-factory-Use-correct-session-type-for-n.patch @@ -1,7 +1,7 @@ -From 67f9363b7735654dda753512ac5d204d6349eae6 Mon Sep 17 00:00:00 2001 +From db47f4de3aab9f4cd6b381ecd9341c94add59bf9 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Wed, 16 May 2018 18:36:50 +0100 -Subject: [PATCH 03/48] local-display-factory: Use correct session-type for new +Subject: [PATCH 03/51] local-display-factory: Use correct session-type for new transient displays Use the new gdm_local_display_factory_use_wayland() helper to correctly @@ -79,5 +79,5 @@ index b21e3aee0..e52360a56 100644 out: /* ref either held by store or not at all */ -- -2.26.0 +2.27.0 diff --git a/SOURCES/0004-manager-make-get_login_window_session_id-fail-if-no-.patch b/SOURCES/0004-manager-make-get_login_window_session_id-fail-if-no-.patch index e5ace0e..5f95b3b 100644 --- a/SOURCES/0004-manager-make-get_login_window_session_id-fail-if-no-.patch +++ b/SOURCES/0004-manager-make-get_login_window_session_id-fail-if-no-.patch @@ -1,7 +1,7 @@ -From 3969532fd960915ddf835e4076489334c6264cf9 Mon Sep 17 00:00:00 2001 +From e2e5d2a7d73baa7c24d1f14b276cb653c06dd82f Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 1 Aug 2018 15:46:11 -0400 -Subject: [PATCH 04/48] manager: make get_login_window_session_id fail if no +Subject: [PATCH 04/51] manager: make get_login_window_session_id fail if no login screen Right now we oddly succeed from get_login_window_session_id @@ -133,5 +133,5 @@ index e44b94373..a9d5628ea 100644 GdmDisplay *old_display) { -- -2.26.0 +2.27.0 diff --git a/SOURCES/0005-manager-avoid-leaking-session_id.patch b/SOURCES/0005-manager-avoid-leaking-session_id.patch index 957b176..c287705 100644 --- a/SOURCES/0005-manager-avoid-leaking-session_id.patch +++ b/SOURCES/0005-manager-avoid-leaking-session_id.patch @@ -1,7 +1,7 @@ -From eda3497315a4c6210fe77316b943483aa397e7b0 Mon Sep 17 00:00:00 2001 +From 34238a9e845455ae2b92159c71b75b7abedc2eb9 Mon Sep 17 00:00:00 2001 From: Lubomir Rintel Date: Mon, 18 Jun 2018 12:33:42 +0200 -Subject: [PATCH 05/48] manager: avoid leaking session_id +Subject: [PATCH 05/51] manager: avoid leaking session_id get_login_window_session_id() duplicates the session id. --- @@ -75,5 +75,5 @@ index a9d5628ea..71f55ec65 100644 g_free (seat_id); } -- -2.26.0 +2.27.0 diff --git a/SOURCES/0006-manager-gracefully-handle-the-case-of-no-session-for.patch b/SOURCES/0006-manager-gracefully-handle-the-case-of-no-session-for.patch index de4daf7..f3dc218 100644 --- a/SOURCES/0006-manager-gracefully-handle-the-case-of-no-session-for.patch +++ b/SOURCES/0006-manager-gracefully-handle-the-case-of-no-session-for.patch @@ -1,7 +1,7 @@ -From 9ceb85f41a46165c46c82cf6947191fad864ec5b Mon Sep 17 00:00:00 2001 +From 454a3daad5148a8ef30cb298af82aa0713e73af7 Mon Sep 17 00:00:00 2001 From: Lubomir Rintel Date: Mon, 18 Jun 2018 12:33:51 +0200 -Subject: [PATCH 06/48] manager: gracefully handle the case of no session for +Subject: [PATCH 06/51] manager: gracefully handle the case of no session for login window get_login_window_session_id() will return TRUE with session_id=NULL when @@ -85,5 +85,5 @@ index 71f55ec65..7a5554e9d 100644 g_free (seat_id); } -- -2.26.0 +2.27.0 diff --git a/SOURCES/0007-common-dedupe-gdm_get_login_window_session_id.patch b/SOURCES/0007-common-dedupe-gdm_get_login_window_session_id.patch index 687804d..b2c2e03 100644 --- a/SOURCES/0007-common-dedupe-gdm_get_login_window_session_id.patch +++ b/SOURCES/0007-common-dedupe-gdm_get_login_window_session_id.patch @@ -1,7 +1,7 @@ -From f4e7c422bec2167c9648cb063f0cb204789d5f05 Mon Sep 17 00:00:00 2001 +From 2fc9a5f9db7c9d2ab828bcff4ee5dec9c3cf3d3c Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 1 Aug 2018 16:34:30 -0400 -Subject: [PATCH 07/48] common: dedupe gdm_get_login_window_session_id +Subject: [PATCH 07/51] common: dedupe gdm_get_login_window_session_id Right now there are two slightly different cut-and-pastes of the function to get the session id of the login session in @@ -428,5 +428,5 @@ index 7a5554e9d..375ef6f80 100644 if (client_is_ready) { -- -2.26.0 +2.27.0 diff --git a/SOURCES/0008-common-dedupe-activate_session_id.patch b/SOURCES/0008-common-dedupe-activate_session_id.patch index 32b99c7..3e99665 100644 --- a/SOURCES/0008-common-dedupe-activate_session_id.patch +++ b/SOURCES/0008-common-dedupe-activate_session_id.patch @@ -1,7 +1,7 @@ -From 7c09ab6a932bb6d7836aed51a9f590809d95b0f9 Mon Sep 17 00:00:00 2001 +From 9d8e72ea9171566e9d74caaf28c8b5933ef34874 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 2 Aug 2018 14:00:46 -0400 -Subject: [PATCH 08/48] common: dedupe activate_session_id +Subject: [PATCH 08/51] common: dedupe activate_session_id Right now there are three copies of activate_session_id. @@ -397,5 +397,5 @@ index 375ef6f80..617ee36f0 100644 return NULL; } -- -2.26.0 +2.27.0 diff --git a/SOURCES/0009-manager-plug-leak-in-maybe_activate_other_session.patch b/SOURCES/0009-manager-plug-leak-in-maybe_activate_other_session.patch index f0a3b95..f3236f8 100644 --- a/SOURCES/0009-manager-plug-leak-in-maybe_activate_other_session.patch +++ b/SOURCES/0009-manager-plug-leak-in-maybe_activate_other_session.patch @@ -1,7 +1,7 @@ -From cf679006446e7831c56f2883a6e7932d81655533 Mon Sep 17 00:00:00 2001 +From 5bc19a4eb6de02ba549252026911dcce86e0fc21 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 22 Jun 2018 14:44:11 -0400 -Subject: [PATCH 09/48] manager: plug leak in maybe_activate_other_session +Subject: [PATCH 09/51] manager: plug leak in maybe_activate_other_session The function asks logind what the currently active session is on the given seat. It then leaks the response. @@ -99,5 +99,5 @@ index 617ee36f0..a4dad92ee 100644 gboolean is_initial; -- -2.26.0 +2.27.0 diff --git a/SOURCES/0010-manager-start-login-screen-if-old-one-is-finished.patch b/SOURCES/0010-manager-start-login-screen-if-old-one-is-finished.patch index 56bd016..090b728 100644 --- a/SOURCES/0010-manager-start-login-screen-if-old-one-is-finished.patch +++ b/SOURCES/0010-manager-start-login-screen-if-old-one-is-finished.patch @@ -1,7 +1,7 @@ -From bd1bcea8be7b551da17ee5846ab968aacee322b7 Mon Sep 17 00:00:00 2001 +From 2ec1b65c7bc2cefeabbd9a7a3a50436e1233804c Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 22 Jun 2018 14:55:39 -0400 -Subject: [PATCH 10/48] manager: start login screen if old one is finished +Subject: [PATCH 10/51] manager: start login screen if old one is finished Since commit 22c332ba we try to start a login screen if we end up on an empty VT and there isn't one running. @@ -88,5 +88,5 @@ index a4dad92ee..a6f13dec7 100644 GdmDisplay *display) { -- -2.26.0 +2.27.0 diff --git a/SOURCES/0011-manager-don-t-bail-if-session-disappears-out-from-un.patch b/SOURCES/0011-manager-don-t-bail-if-session-disappears-out-from-un.patch index 642e25a..b843be7 100644 --- a/SOURCES/0011-manager-don-t-bail-if-session-disappears-out-from-un.patch +++ b/SOURCES/0011-manager-don-t-bail-if-session-disappears-out-from-un.patch @@ -1,7 +1,7 @@ -From 78e737441f32d408dbd66d1d1fee384c0b7f94b4 Mon Sep 17 00:00:00 2001 +From 67d29b19ff4e53d58879b14c2e79a3bda419576f Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 22 Jun 2018 15:26:03 -0400 -Subject: [PATCH 11/48] manager: don't bail if session disappears out from +Subject: [PATCH 11/51] manager: don't bail if session disappears out from under us It's entirely possible for a session returned by @@ -123,5 +123,5 @@ index a6f13dec7..ede22e771 100644 return ret; } -- -2.26.0 +2.27.0 diff --git a/SOURCES/0012-daemon-try-harder-to-get-to-a-login-screen-at-logout.patch b/SOURCES/0012-daemon-try-harder-to-get-to-a-login-screen-at-logout.patch index d0a54c5..55868c2 100644 --- a/SOURCES/0012-daemon-try-harder-to-get-to-a-login-screen-at-logout.patch +++ b/SOURCES/0012-daemon-try-harder-to-get-to-a-login-screen-at-logout.patch @@ -1,7 +1,7 @@ -From 3a3b24a4dc6596bb70be86a68f3a228048472c7c Mon Sep 17 00:00:00 2001 +From 9a3e9cb9a6bbf68ed6eb9f13d143a63af940f3ae Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 30 Jul 2018 16:21:29 -0400 -Subject: [PATCH 12/48] daemon: try harder to get to a login screen at logout +Subject: [PATCH 12/51] daemon: try harder to get to a login screen at logout commit 22c332ba and some follow up commits try to ensure the user never stays on a blank VT by jumping to a login screen in @@ -178,7 +178,7 @@ index e52360a56..0e454c880 100644 /* workaround logind race for now * bug 1643874 */ - sleep (2); + g_usleep (2 * G_USEC_PER_SEC); } #endif @@ -559,5 +559,5 @@ index ede22e771..80f60d24c 100644 NULL); g_object_unref (operation->session); -- -2.26.0 +2.27.0 diff --git a/SOURCES/0013-local-display-factory-ensure-non-seat0-codepath-does.patch b/SOURCES/0013-local-display-factory-ensure-non-seat0-codepath-does.patch index 4cbc514..34f4120 100644 --- a/SOURCES/0013-local-display-factory-ensure-non-seat0-codepath-does.patch +++ b/SOURCES/0013-local-display-factory-ensure-non-seat0-codepath-does.patch @@ -1,7 +1,7 @@ -From e9dc7113942146f26745494f6177d49fb9b97efb Mon Sep 17 00:00:00 2001 +From 299a0981f4e9fc02716d64abf5e5e692e2ad2951 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 3 Aug 2018 16:50:36 -0400 -Subject: [PATCH 13/48] local-display-factory: ensure non-seat0 codepath +Subject: [PATCH 13/51] local-display-factory: ensure non-seat0 codepath doesn't affect seat0 create_display currently bails in some cases if any display is running @@ -83,5 +83,5 @@ index 0e454c880..7f7735ca1 100644 g_object_set (display, "is-initial", initial, NULL); -- -2.26.0 +2.27.0 diff --git a/SOURCES/0014-daemon-kill-and-restart-greeter-on-demand-under-wayl.patch b/SOURCES/0014-daemon-kill-and-restart-greeter-on-demand-under-wayl.patch index 7ae3218..84b33da 100644 --- a/SOURCES/0014-daemon-kill-and-restart-greeter-on-demand-under-wayl.patch +++ b/SOURCES/0014-daemon-kill-and-restart-greeter-on-demand-under-wayl.patch @@ -1,7 +1,7 @@ -From 67c08ab2df5f86626b6e13f3318e41187bde0737 Mon Sep 17 00:00:00 2001 +From 08f5f88ca6fb0edfc94af4c85912484b6048691b Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 2 Aug 2018 15:06:09 -0400 -Subject: [PATCH 14/48] daemon: kill and restart greeter on demand under +Subject: [PATCH 14/51] daemon: kill and restart greeter on demand under wayland Right now we leave the greeter alive after the user logs in. @@ -365,5 +365,5 @@ index 7f7735ca1..4ae656ab3 100644 } -- -2.26.0 +2.27.0 diff --git a/SOURCES/0015-local-display-factory-add-more-debug-messages-to-new.patch b/SOURCES/0015-local-display-factory-add-more-debug-messages-to-new.patch index bfb601e..456bc34 100644 --- a/SOURCES/0015-local-display-factory-add-more-debug-messages-to-new.patch +++ b/SOURCES/0015-local-display-factory-add-more-debug-messages-to-new.patch @@ -1,7 +1,7 @@ -From 0c8edb1580637502f9f1a0bae4535942eebee551 Mon Sep 17 00:00:00 2001 +From 59533722f1749d4e71360c5d717a18006c1f64c0 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 7 Aug 2018 13:55:06 -0400 -Subject: [PATCH 15/48] local-display-factory: add more debug messages to new +Subject: [PATCH 15/51] local-display-factory: add more debug messages to new vt handling code commit c0188a7030 added some complex code for starting and stopping @@ -231,5 +231,5 @@ index 4ae656ab3..2a2259f2a 100644 on_seat_removed, g_object_ref (factory), -- -2.26.0 +2.27.0 diff --git a/SOURCES/0016-local-display-factory-don-t-start-two-greeters-at-st.patch b/SOURCES/0016-local-display-factory-don-t-start-two-greeters-at-st.patch index dad8b18..dc9b1b7 100644 --- a/SOURCES/0016-local-display-factory-don-t-start-two-greeters-at-st.patch +++ b/SOURCES/0016-local-display-factory-don-t-start-two-greeters-at-st.patch @@ -1,7 +1,7 @@ -From 171ea8c0310a215d278d3532232488987317f4aa Mon Sep 17 00:00:00 2001 +From e5bf6d78ff8f54bbb74e572f05ccbf1c0df24017 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 7 Aug 2018 13:55:06 -0400 -Subject: [PATCH 16/48] local-display-factory: don't start two greeters at +Subject: [PATCH 16/51] local-display-factory: don't start two greeters at startup commit c0188a7030 added some complex code for starting @@ -93,5 +93,5 @@ index 2a2259f2a..9f377ba9a 100644 g_debug ("GdmLocalDisplayFactory: VT switched from login window"); -- -2.26.0 +2.27.0 diff --git a/SOURCES/0017-session-worker-don-t-switch-VTs-if-we-re-already-on-.patch b/SOURCES/0017-session-worker-don-t-switch-VTs-if-we-re-already-on-.patch index ef9db9b..76ab241 100644 --- a/SOURCES/0017-session-worker-don-t-switch-VTs-if-we-re-already-on-.patch +++ b/SOURCES/0017-session-worker-don-t-switch-VTs-if-we-re-already-on-.patch @@ -1,7 +1,7 @@ -From db7e9f8306716c4338b7de01cb1026d8e1dd8afa Mon Sep 17 00:00:00 2001 +From de4b24f63e62a39b2cb10a8c58c54d86559f7f26 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 7 Aug 2018 14:04:44 -0400 -Subject: [PATCH 17/48] session-worker: don't switch VTs if we're already on +Subject: [PATCH 17/51] session-worker: don't switch VTs if we're already on the right VT commit 5b5dccbd shows that switching VTs to the same VT isn't @@ -124,5 +124,5 @@ index 0322037e0..fd6470bab 100644 pam_close_session (worker->priv->pam_handle, 0); gdm_session_auditor_report_logout (worker->priv->auditor); -- -2.26.0 +2.27.0 diff --git a/SOURCES/0018-session-worker-fix-current-vt-detection-short-circui.patch b/SOURCES/0018-session-worker-fix-current-vt-detection-short-circui.patch index fc55b96..c9a114c 100644 --- a/SOURCES/0018-session-worker-fix-current-vt-detection-short-circui.patch +++ b/SOURCES/0018-session-worker-fix-current-vt-detection-short-circui.patch @@ -1,7 +1,7 @@ -From a77803467601cebc60ecc1c56105960a1aeb1a50 Mon Sep 17 00:00:00 2001 +From b9e5a2879a410b6a85be6c01c6f49cd7eb24c800 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 31 Aug 2018 15:20:39 -0400 -Subject: [PATCH 18/48] session-worker: fix current vt detection short-circuit +Subject: [PATCH 18/51] session-worker: fix current vt detection short-circuit logic commit 8169cd4 attempts to avoid changing VTs if the active VT @@ -83,5 +83,5 @@ index fd6470bab..391969d96 100644 static void -- -2.26.0 +2.27.0 diff --git a/SOURCES/0019-local-display-factory-don-t-jump-to-failed-display.patch b/SOURCES/0019-local-display-factory-don-t-jump-to-failed-display.patch index 2a5288f..45148f2 100644 --- a/SOURCES/0019-local-display-factory-don-t-jump-to-failed-display.patch +++ b/SOURCES/0019-local-display-factory-don-t-jump-to-failed-display.patch @@ -1,7 +1,7 @@ -From d8a5641bf96c7081e2050c76e5381a82535d67b4 Mon Sep 17 00:00:00 2001 +From fe680d77cff9272843cb171c7e590c239f7afe5a Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 9 Aug 2018 12:32:31 -0400 -Subject: [PATCH 19/48] local-display-factory: don't jump to failed display +Subject: [PATCH 19/51] local-display-factory: don't jump to failed display Since commit 5e737a57 `create_display` will jump to any already running login screen if it can find one. @@ -164,5 +164,5 @@ index 9f377ba9a..c58de9c17 100644 } -- -2.26.0 +2.27.0 diff --git a/SOURCES/0020-local-display-factory-add-some-more-debug-statements.patch b/SOURCES/0020-local-display-factory-add-some-more-debug-statements.patch index ea10278..31d91a0 100644 --- a/SOURCES/0020-local-display-factory-add-some-more-debug-statements.patch +++ b/SOURCES/0020-local-display-factory-add-some-more-debug-statements.patch @@ -1,7 +1,7 @@ -From d2cf186fd0f0b860c6dd282cf8630c3a0f4935a6 Mon Sep 17 00:00:00 2001 +From 94207dd5699f1cd2fe7d516c20e1de2b2e2778fb Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 9 Aug 2018 12:48:25 -0400 -Subject: [PATCH 20/48] local-display-factory: add some more debug statements +Subject: [PATCH 20/51] local-display-factory: add some more debug statements This commit just sprinkles in a few more `g_debug`'s for log file clarity. @@ -157,5 +157,5 @@ index c58de9c17..6f3a4c391 100644 } else { is_initial = FALSE; -- -2.26.0 +2.27.0 diff --git a/SOURCES/0021-local-display-factory-ignore-spurios-SeatNew-signal-.patch b/SOURCES/0021-local-display-factory-ignore-spurios-SeatNew-signal-.patch index 2e21977..f605db9 100644 --- a/SOURCES/0021-local-display-factory-ignore-spurios-SeatNew-signal-.patch +++ b/SOURCES/0021-local-display-factory-ignore-spurios-SeatNew-signal-.patch @@ -1,7 +1,7 @@ -From 31ba433072715f4f6e8eb2b1a65941469c27dbd8 Mon Sep 17 00:00:00 2001 +From abd8e1ef71d093a3ab5c110aea5fa2012d59d5e2 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 14 Aug 2018 10:21:17 -0400 -Subject: [PATCH 21/48] local-display-factory: ignore spurios SeatNew signal at +Subject: [PATCH 21/51] local-display-factory: ignore spurios SeatNew signal at start up Sometimes during startup, logind will send a `SeatNew` signal for @@ -158,5 +158,5 @@ index 6f3a4c391..127127005 100644 if (! gdm_display_manage (display)) { -- -2.26.0 +2.27.0 diff --git a/SOURCES/0022-common-remove-unnecessary-free.patch b/SOURCES/0022-common-remove-unnecessary-free.patch index 1c86eba..5c78e7d 100644 --- a/SOURCES/0022-common-remove-unnecessary-free.patch +++ b/SOURCES/0022-common-remove-unnecessary-free.patch @@ -1,7 +1,7 @@ -From d48fec7e35fb828b6ce8e0312579212a7be48c4f Mon Sep 17 00:00:00 2001 +From 9b8c21080286f943d0a19431bc8c0061f4833443 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 30 Aug 2018 13:04:56 -0400 -Subject: [PATCH 22/48] common: remove unnecessary free +Subject: [PATCH 22/51] common: remove unnecessary free This commit drops an erroneous free call, that would potentially free a dangling pointer. @@ -87,5 +87,5 @@ index 59317a889..c909aceee 100644 g_debug ("failed to determine service of session %s: %s", sessions[i], strerror (-res)); ret = FALSE; -- -2.26.0 +2.27.0 diff --git a/SOURCES/0023-common-don-t-bail-if-session-disappears-out-from-und.patch b/SOURCES/0023-common-don-t-bail-if-session-disappears-out-from-und.patch index 95a759f..c27d5bf 100644 --- a/SOURCES/0023-common-don-t-bail-if-session-disappears-out-from-und.patch +++ b/SOURCES/0023-common-don-t-bail-if-session-disappears-out-from-und.patch @@ -1,7 +1,7 @@ -From 72ca16c8c256e9b5f3fdf81163d5ef90b9c170b2 Mon Sep 17 00:00:00 2001 +From 4a948e4b203fdf5fcd9b5e53dd4a80ef2786c0cd Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 30 Aug 2018 13:06:54 -0400 -Subject: [PATCH 23/48] common: don't bail if session disappears out from under +Subject: [PATCH 23/51] common: don't bail if session disappears out from under us It's entirely possible for a session returned by @@ -129,5 +129,5 @@ index c909aceee..59b8dfc44 100644 return ret; } -- -2.26.0 +2.27.0 diff --git a/SOURCES/0024-manager-better-logind-handling.patch b/SOURCES/0024-manager-better-logind-handling.patch index 5dddea3..194c156 100644 --- a/SOURCES/0024-manager-better-logind-handling.patch +++ b/SOURCES/0024-manager-better-logind-handling.patch @@ -1,7 +1,7 @@ -From 685cac010ad94534b1b4f73b28768cad92b54703 Mon Sep 17 00:00:00 2001 +From fac23cfa3e8e9fe21563733c0c1b739ddecead8a Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 30 Aug 2018 14:01:55 -0400 -Subject: [PATCH 24/48] manager: better logind handling +Subject: [PATCH 24/51] manager: better logind handling commit 9ee68d5c8 highlights we've incorrectly used ENOENT instead of ENXIO when checking for @@ -134,5 +134,5 @@ index 80f60d24c..367a731cc 100644 gboolean *out_is_remote) { -- -2.26.0 +2.27.0 diff --git a/SOURCES/0025-session-worker-clear-VT-before-jumping-to-it.patch b/SOURCES/0025-session-worker-clear-VT-before-jumping-to-it.patch index faed97f..cc3744a 100644 --- a/SOURCES/0025-session-worker-clear-VT-before-jumping-to-it.patch +++ b/SOURCES/0025-session-worker-clear-VT-before-jumping-to-it.patch @@ -1,7 +1,7 @@ -From a497c065b1ac546cd28d3ef75f90b4592a5ee3c5 Mon Sep 17 00:00:00 2001 +From cabcd21c17ca98e517a3eea7c9d5ce269445e3e0 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 31 Aug 2018 15:46:55 -0400 -Subject: [PATCH 25/48] session-worker: clear VT before jumping to it +Subject: [PATCH 25/51] session-worker: clear VT before jumping to it If we're going to jump to a new VT we should make sure it's free of residual console text. That way if there's flicker the user @@ -86,5 +86,5 @@ index 391969d96..7ed2789da 100644 g_debug ("GdmSessionWorker: couldn't initiate jump to VT %d: %m", vt_number); -- -2.26.0 +2.27.0 diff --git a/SOURCES/0026-manager-don-t-set-ran_once-after-running-initial-set.patch b/SOURCES/0026-manager-don-t-set-ran_once-after-running-initial-set.patch index af73a27..5a98652 100644 --- a/SOURCES/0026-manager-don-t-set-ran_once-after-running-initial-set.patch +++ b/SOURCES/0026-manager-don-t-set-ran_once-after-running-initial-set.patch @@ -1,7 +1,7 @@ -From cfc1dd96dee55afde7f377878905302db9cbdcf6 Mon Sep 17 00:00:00 2001 +From b773eb570d8c5f9d2222ee39eecbc6a622d108d8 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 30 Aug 2018 16:04:41 -0400 -Subject: [PATCH 26/48] manager: don't set ran_once after running initial-setup +Subject: [PATCH 26/51] manager: don't set ran_once after running initial-setup GdmManager tracks whether or not the user session has ran once, so it won't autologin a user again after logout. @@ -129,5 +129,5 @@ index 367a731cc..c8197a043 100644 { g_object_set_data (G_OBJECT (operation->session), -- -2.26.0 +2.27.0 diff --git a/SOURCES/0027-manager-start-initial-setup-right-away.patch b/SOURCES/0027-manager-start-initial-setup-right-away.patch index 30306a3..b16bcfb 100644 --- a/SOURCES/0027-manager-start-initial-setup-right-away.patch +++ b/SOURCES/0027-manager-start-initial-setup-right-away.patch @@ -1,7 +1,7 @@ -From 0eada264dbce111730a8859152a7821a9df9c692 Mon Sep 17 00:00:00 2001 +From 3d4199f82136e7046b5b08fc7c583e3fce2d04a2 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 31 Aug 2018 14:33:58 -0400 -Subject: [PATCH 27/48] manager: start initial setup right away +Subject: [PATCH 27/51] manager: start initial setup right away We no longer restart the greeter as soon as it dies, since we start the greeter on demand. This means, we no longer need to @@ -414,5 +414,5 @@ index c8197a043..fb7b1ec4b 100644 start_when_ready = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (session), "start-when-ready")); if (start_when_ready) { -- -2.26.0 +2.27.0 diff --git a/SOURCES/0028-gdm-wayland-session-gdm-x-session-register-after-del.patch b/SOURCES/0028-gdm-wayland-session-gdm-x-session-register-after-del.patch index ca43916..67ee336 100644 --- a/SOURCES/0028-gdm-wayland-session-gdm-x-session-register-after-del.patch +++ b/SOURCES/0028-gdm-wayland-session-gdm-x-session-register-after-del.patch @@ -1,7 +1,7 @@ -From 00954e2f7a5668e582c7b498f9f1548c7d07ed33 Mon Sep 17 00:00:00 2001 +From 3073c23c673ede5093c1f93fb0775c2cd3203d7f Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 30 Aug 2018 16:09:02 -0400 -Subject: [PATCH 28/48] gdm-wayland-session,gdm-x-session: register after delay +Subject: [PATCH 28/51] gdm-wayland-session,gdm-x-session: register after delay Right now gdm-x-session registers with GDM as soon as the X server is started, and gdm-wayland-session registers as @@ -305,5 +305,5 @@ index 3b2fcef47..412999cf5 100644 return exit_status; } -- -2.26.0 +2.27.0 diff --git a/SOURCES/0029-local-display-factory-defer-killing-greeter-until-ne.patch b/SOURCES/0029-local-display-factory-defer-killing-greeter-until-ne.patch index b19aed3..df23fbd 100644 --- a/SOURCES/0029-local-display-factory-defer-killing-greeter-until-ne.patch +++ b/SOURCES/0029-local-display-factory-defer-killing-greeter-until-ne.patch @@ -1,7 +1,7 @@ -From 7bd3a19ad434754a91887c8b4baaaa23e9b30710 Mon Sep 17 00:00:00 2001 +From d85448e2e523deb1487e7e405a480e1c4e6a5f6f Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 31 Aug 2018 15:33:00 -0400 -Subject: [PATCH 29/48] local-display-factory: defer killing greeter until new +Subject: [PATCH 29/51] local-display-factory: defer killing greeter until new session registers At the moment we kill the greeter the second the VT change to the new @@ -197,7 +197,7 @@ index 127127005..bc6ac6855 100644 /* workaround logind race for now * bug 1643874 */ - sleep (2); + g_usleep (2 * G_USEC_PER_SEC); } #endif @@ -395,5 +395,5 @@ index 127127005..bc6ac6855 100644 if (gdm_local_display_factory_use_wayland ()) session_type = "wayland"; -- -2.26.0 +2.27.0 diff --git a/SOURCES/0030-daemon-Move-the-waiting-the-session-to-have-taken-ov.patch b/SOURCES/0030-daemon-Move-the-waiting-the-session-to-have-taken-ov.patch index fcafa2d..889088d 100644 --- a/SOURCES/0030-daemon-Move-the-waiting-the-session-to-have-taken-ov.patch +++ b/SOURCES/0030-daemon-Move-the-waiting-the-session-to-have-taken-ov.patch @@ -1,7 +1,7 @@ -From e3083a2a97aeda3fa1155c1cd9c4458a918a8ccb Mon Sep 17 00:00:00 2001 +From 0ff911467265831006aac6216060dbecff84c1cb Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Tue, 4 Sep 2018 10:56:45 +0200 -Subject: [PATCH 30/48] daemon: Move the waiting the session to have taken over +Subject: [PATCH 30/51] daemon: Move the waiting the session to have taken over the fb to gdm-local-display-factory Commit 708618746683 ("gdm-wayland-session,gdm-x-session: register after @@ -145,7 +145,7 @@ index bc6ac6855..be6b377be 100644 /* workaround logind race for now * bug 1643874 */ - sleep (2); + g_usleep (2 * G_USEC_PER_SEC); } #endif @@ -704,5 +704,5 @@ index 412999cf5..3b2fcef47 100644 return exit_status; } -- -2.26.0 +2.27.0 diff --git a/SOURCES/0031-local-display-factory-don-t-autoreap-initial-setup.patch b/SOURCES/0031-local-display-factory-don-t-autoreap-initial-setup.patch index 3285094..5605385 100644 --- a/SOURCES/0031-local-display-factory-don-t-autoreap-initial-setup.patch +++ b/SOURCES/0031-local-display-factory-don-t-autoreap-initial-setup.patch @@ -1,7 +1,7 @@ -From 9a78b7fe13a425d23ecbf13527daf425663fba8e Mon Sep 17 00:00:00 2001 +From 59b3b809400dfac25410cf99dbc15cb5f66f85a3 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 25 Sep 2018 14:52:15 -0400 -Subject: [PATCH 31/48] local-display-factory: don't autoreap initial-setup +Subject: [PATCH 31/51] local-display-factory: don't autoreap initial-setup We automatically kill the login screen when switching VTs away from it, but we should never kill the initial-setup screen in @@ -96,5 +96,5 @@ index be6b377be..13d56dcff 100644 g_autofree char *tty_of_active_vt = NULL; g_autofree char *login_session_id = NULL; -- -2.26.0 +2.27.0 diff --git a/SOURCES/0032-manager-rework-how-autologin-is-figured-out.patch b/SOURCES/0032-manager-rework-how-autologin-is-figured-out.patch index 5b825bc..adf484e 100644 --- a/SOURCES/0032-manager-rework-how-autologin-is-figured-out.patch +++ b/SOURCES/0032-manager-rework-how-autologin-is-figured-out.patch @@ -1,7 +1,7 @@ -From a539080c470125871aa1774318a0b5aca14ce91d Mon Sep 17 00:00:00 2001 +From 566720ce07db8745c0ae6780ff289292dc0a9b60 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 25 Sep 2018 10:59:37 -0400 -Subject: [PATCH 32/48] manager: rework how autologin is figured out +Subject: [PATCH 32/51] manager: rework how autologin is figured out At the moment we decide whether or not to perform autologin, by looking at if the display is the initial VT display and if autologin @@ -456,5 +456,5 @@ index fb7b1ec4b..228cec6ff 100644 g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (manager)); } -- -2.26.0 +2.27.0 diff --git a/SOURCES/0033-manager-correct-display-confusion.patch b/SOURCES/0033-manager-correct-display-confusion.patch index 0bb3d86..a898d87 100644 --- a/SOURCES/0033-manager-correct-display-confusion.patch +++ b/SOURCES/0033-manager-correct-display-confusion.patch @@ -1,7 +1,7 @@ -From 60fff836d8ad0c6dcc35854c7d5d576d17bdeeee Mon Sep 17 00:00:00 2001 +From 05e49542a9de81731fce68614babe22d437e8fff Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 1 Oct 2018 11:05:57 -0400 -Subject: [PATCH 33/48] manager: correct display confusion +Subject: [PATCH 33/51] manager: correct display confusion commit c5c5bf1f reworked autologin and broke it. @@ -81,5 +81,5 @@ index 228cec6ff..4c81dac7f 100644 const char *service_name) { -- -2.26.0 +2.27.0 diff --git a/SOURCES/0034-manager-don-t-run-autologin-display-on-tty1.patch b/SOURCES/0034-manager-don-t-run-autologin-display-on-tty1.patch index b0f8c16..757ec9e 100644 --- a/SOURCES/0034-manager-don-t-run-autologin-display-on-tty1.patch +++ b/SOURCES/0034-manager-don-t-run-autologin-display-on-tty1.patch @@ -1,7 +1,7 @@ -From f40be88d090ecdef4cf877d8c3aeb7b76f9cb785 Mon Sep 17 00:00:00 2001 +From e4c9a998f89d429d31b02997f146c8218c0742bc Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 24 Sep 2018 14:45:38 -0400 -Subject: [PATCH 34/48] manager: don't run autologin display on tty1 +Subject: [PATCH 34/51] manager: don't run autologin display on tty1 tty1 is really meant for the login screen. If a user autologins on it and we need a login @@ -95,5 +95,5 @@ index 4c81dac7f..e896c8945 100644 GdmDisplay *display) { -- -2.26.0 +2.27.0 diff --git a/SOURCES/0035-local-display-factory-Remove-initial-VT-is-in-use-ch.patch b/SOURCES/0035-local-display-factory-Remove-initial-VT-is-in-use-ch.patch index 834f65b..e53ccef 100644 --- a/SOURCES/0035-local-display-factory-Remove-initial-VT-is-in-use-ch.patch +++ b/SOURCES/0035-local-display-factory-Remove-initial-VT-is-in-use-ch.patch @@ -1,7 +1,7 @@ -From c3d61627cfdfc41d89e21e57006f9cadb3917a79 Mon Sep 17 00:00:00 2001 +From 2843a951ef826afd01fa3c7340780b1929db38c7 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Tue, 4 Sep 2018 08:12:34 +0200 -Subject: [PATCH 35/48] local-display-factory: Remove initial VT is in use +Subject: [PATCH 35/51] local-display-factory: Remove initial VT is in use check The initial VT is in use check in on_vt_changed() is racy, when switching @@ -106,5 +106,5 @@ index 13d56dcff..8e46dbca2 100644 "org.freedesktop.login1.Manager", "SeatRemoved", -- -2.26.0 +2.27.0 diff --git a/SOURCES/0036-local-display-factory-Remove-same-VT-so-don-t-switch.patch b/SOURCES/0036-local-display-factory-Remove-same-VT-so-don-t-switch.patch index 7d3b9ed..85f9af9 100644 --- a/SOURCES/0036-local-display-factory-Remove-same-VT-so-don-t-switch.patch +++ b/SOURCES/0036-local-display-factory-Remove-same-VT-so-don-t-switch.patch @@ -1,7 +1,7 @@ -From f9021afe364c757e0f2f129987e5ca466f05f1c9 Mon Sep 17 00:00:00 2001 +From f5acee2766c05403235c06da6b1bb68af744da79 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 25 Sep 2018 14:30:16 -0400 -Subject: [PATCH 36/48] local-display-factory: Remove same VT so don't switch +Subject: [PATCH 36/51] local-display-factory: Remove same VT so don't switch check We avoid changing to the login screen vt if we're already on it, @@ -136,5 +136,5 @@ index 8e46dbca2..be7b43cff 100644 if (! gdm_display_manage (display)) { -- -2.26.0 +2.27.0 diff --git a/SOURCES/0037-local-display-factory-handle-reviving-displays-that-.patch b/SOURCES/0037-local-display-factory-handle-reviving-displays-that-.patch index 18e5520..35639e9 100644 --- a/SOURCES/0037-local-display-factory-handle-reviving-displays-that-.patch +++ b/SOURCES/0037-local-display-factory-handle-reviving-displays-that-.patch @@ -1,7 +1,7 @@ -From 9c962b87b4e3d07b5ab2b212f0bcb662d7f4f7a2 Mon Sep 17 00:00:00 2001 +From 59a4538e335362a92186217be03529f3694697e1 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Tue, 25 Sep 2018 14:39:42 -0400 -Subject: [PATCH 37/48] local-display-factory: handle reviving displays that +Subject: [PATCH 37/51] local-display-factory: handle reviving displays that are waiting to die We may end up re-using a display in waiting-to-finish state before it gets @@ -84,5 +84,5 @@ index be7b43cff..d999596b5 100644 store_display (factory, display); -- -2.26.0 +2.27.0 diff --git a/SOURCES/0038-manager-don-t-kill-initial-setup-before-starting-use.patch b/SOURCES/0038-manager-don-t-kill-initial-setup-before-starting-use.patch index 5c283cc..1925cab 100644 --- a/SOURCES/0038-manager-don-t-kill-initial-setup-before-starting-use.patch +++ b/SOURCES/0038-manager-don-t-kill-initial-setup-before-starting-use.patch @@ -1,7 +1,7 @@ -From 1624c4229c83e7fcdb9a57ef59cd1e57257b5b2c Mon Sep 17 00:00:00 2001 +From c65a0dbd195be52f0db0c49ea0355fe1b5eb4c09 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 31 Aug 2018 15:48:38 -0400 -Subject: [PATCH 38/48] manager: don't kill initial-setup before starting user +Subject: [PATCH 38/51] manager: don't kill initial-setup before starting user session on wayland Right now we kill initial-setup before starting the session for the user @@ -147,5 +147,5 @@ index e896c8945..0823e8638 100644 start_user_session (operation->manager, operation); -- -2.26.0 +2.27.0 diff --git a/SOURCES/0039-manager-do-initial-setup-post-work-in-manager-code.patch b/SOURCES/0039-manager-do-initial-setup-post-work-in-manager-code.patch index 70b9357..dff5a1f 100644 --- a/SOURCES/0039-manager-do-initial-setup-post-work-in-manager-code.patch +++ b/SOURCES/0039-manager-do-initial-setup-post-work-in-manager-code.patch @@ -1,7 +1,7 @@ -From 0f1826708cc233bb9e538c029afa96c85ef62d56 Mon Sep 17 00:00:00 2001 +From c08afca0807d8820030c19a40e7590f72878c788 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 6 Sep 2018 19:31:50 -0400 -Subject: [PATCH 39/48] manager: do initial-setup post work in manager code +Subject: [PATCH 39/51] manager: do initial-setup post work in manager code Right now we do the initial-setup related post work when stopping the greeter, but the problem is we delay @@ -690,5 +690,5 @@ index 0823e8638..cf982870c 100644 start_user_session (operation->manager, operation); -- -2.26.0 +2.27.0 diff --git a/SOURCES/0040-display-store-make-foreach-ignore-callback-return-va.patch b/SOURCES/0040-display-store-make-foreach-ignore-callback-return-va.patch index 60f7ddc..622db0c 100644 --- a/SOURCES/0040-display-store-make-foreach-ignore-callback-return-va.patch +++ b/SOURCES/0040-display-store-make-foreach-ignore-callback-return-va.patch @@ -1,7 +1,7 @@ -From 91c47f81635a77e803a1f6ff412bb6e2a2012d37 Mon Sep 17 00:00:00 2001 +From 49383786d96414e7204ea50ca5ea0263be97b581 Mon Sep 17 00:00:00 2001 From: xiaoguang wang Date: Wed, 20 Feb 2019 09:26:02 +0800 -Subject: [PATCH 40/48] display-store: make foreach ignore callback return +Subject: [PATCH 40/51] display-store: make foreach ignore callback return value gdm_display_store_foreach is designed to iterate through all @@ -113,5 +113,5 @@ index fd24334eb..910468cd7 100644 g_return_val_if_fail (store != NULL, NULL); g_return_val_if_fail (predicate != NULL, NULL); -- -2.26.0 +2.27.0 diff --git a/SOURCES/0041-xdmcp-display-factory-don-t-return-value-from-foreac.patch b/SOURCES/0041-xdmcp-display-factory-don-t-return-value-from-foreac.patch index 87878db..7b8cf5c 100644 --- a/SOURCES/0041-xdmcp-display-factory-don-t-return-value-from-foreac.patch +++ b/SOURCES/0041-xdmcp-display-factory-don-t-return-value-from-foreac.patch @@ -1,7 +1,7 @@ -From 53132e40e407e4af455504f08d733e485b6bd48e Mon Sep 17 00:00:00 2001 +From 323358ef61d969588ea048d5b0eba6fd102d3dcf Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 21 Feb 2019 15:20:01 -0500 -Subject: [PATCH 41/48] xdmcp-display-factory: don't return value from foreach +Subject: [PATCH 41/51] xdmcp-display-factory: don't return value from foreach funcs The xdmcp code is returning TRUE from its display store foreach @@ -176,5 +176,5 @@ index 5b5786c6f..2e14beab4 100644 acctime = gdm_display_get_creation_time (display); -- -2.26.0 +2.27.0 diff --git a/SOURCES/0042-GdmLocalDisplayFactory-Store-VT-number-not-tty-ident.patch b/SOURCES/0042-GdmLocalDisplayFactory-Store-VT-number-not-tty-ident.patch index b18ff53..c03b87f 100644 --- a/SOURCES/0042-GdmLocalDisplayFactory-Store-VT-number-not-tty-ident.patch +++ b/SOURCES/0042-GdmLocalDisplayFactory-Store-VT-number-not-tty-ident.patch @@ -1,7 +1,7 @@ -From e2a85ed5bf731d36575ae6d6ea899599589a12d0 Mon Sep 17 00:00:00 2001 +From 3cf5b4b12d3d39fa858ff593adeecfe711cdddaf Mon Sep 17 00:00:00 2001 From: Iain Lane Date: Tue, 7 May 2019 15:35:23 +0100 -Subject: [PATCH 42/48] GdmLocalDisplayFactory: Store VT number, not tty +Subject: [PATCH 42/51] GdmLocalDisplayFactory: Store VT number, not tty identifier This makes the code a fair bit simpler. @@ -534,5 +534,5 @@ index 7ed2789da..b4befaa83 100644 return TRUE; -- -2.26.0 +2.27.0 diff --git a/SOURCES/0043-gdm-session-worker-Drop-login_vt-assuming-it-is-GDM_.patch b/SOURCES/0043-gdm-session-worker-Drop-login_vt-assuming-it-is-GDM_.patch index 80b2640..ea5f20c 100644 --- a/SOURCES/0043-gdm-session-worker-Drop-login_vt-assuming-it-is-GDM_.patch +++ b/SOURCES/0043-gdm-session-worker-Drop-login_vt-assuming-it-is-GDM_.patch @@ -1,7 +1,7 @@ -From 9d3d6d5b4ebe604959d2d718cefd658a85195409 Mon Sep 17 00:00:00 2001 +From 476230f7b721781c682d26983c9a2fd82afc45e1 Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Wed, 25 Sep 2019 14:51:40 +0200 -Subject: [PATCH 43/48] gdm-session-worker: Drop login_vt assuming it is +Subject: [PATCH 43/51] gdm-session-worker: Drop login_vt assuming it is GDM_INITIAL_VT When a session ends, its "session worker" is closed. Since @@ -340,5 +340,5 @@ index b4befaa83..0bd78cfaf 100644 /* blocking call, does the actual conversation */ -- -2.26.0 +2.27.0 diff --git a/SOURCES/0044-session-worker-ensure-initial-vt-is-never-picked-for.patch b/SOURCES/0044-session-worker-ensure-initial-vt-is-never-picked-for.patch index ee72cf6..0e55560 100644 --- a/SOURCES/0044-session-worker-ensure-initial-vt-is-never-picked-for.patch +++ b/SOURCES/0044-session-worker-ensure-initial-vt-is-never-picked-for.patch @@ -1,7 +1,7 @@ -From 1b5a79dfcd083537c8e3d3dfcd26b7b1d19c51ca Mon Sep 17 00:00:00 2001 +From 75b65846ca77bd2d42e25365b4b7242a406330cf Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 7 Apr 2020 14:37:41 -0400 -Subject: [PATCH 44/48] session-worker: ensure initial vt is never picked for +Subject: [PATCH 44/51] session-worker: ensure initial vt is never picked for !is_initial displays Normally, a !is_initial display would never "get" tty1, since the system @@ -156,5 +156,5 @@ index 0bd78cfaf..42c415837 100644 "XDG_VTNR", vt_string); -- -2.26.0 +2.27.0 diff --git a/SOURCES/0045-local-display-factory-Always-force-login-screen-to-V.patch b/SOURCES/0045-local-display-factory-Always-force-login-screen-to-V.patch index a2e7f6b..d464a2a 100644 --- a/SOURCES/0045-local-display-factory-Always-force-login-screen-to-V.patch +++ b/SOURCES/0045-local-display-factory-Always-force-login-screen-to-V.patch @@ -1,7 +1,7 @@ -From e071fe9ff6808c9910854755fb975a800ffdd142 Mon Sep 17 00:00:00 2001 +From fc3503f16e9de535d2a36b904720b360370f880f Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 15 May 2020 10:08:24 -0400 -Subject: [PATCH 45/48] local-display-factory: Always force login screen to VT +Subject: [PATCH 45/51] local-display-factory: Always force login screen to VT 1 These days we always want the login screen on VT 1, even @@ -110,5 +110,5 @@ index 7a013c694..a288f8765 100644 return FALSE; -- -2.26.0 +2.27.0 diff --git a/SOURCES/0046-gdm-x-session-tell-x-server-to-not-vt-switch.patch b/SOURCES/0046-gdm-x-session-tell-x-server-to-not-vt-switch.patch index baea8fc..e29138c 100644 --- a/SOURCES/0046-gdm-x-session-tell-x-server-to-not-vt-switch.patch +++ b/SOURCES/0046-gdm-x-session-tell-x-server-to-not-vt-switch.patch @@ -1,7 +1,7 @@ -From 8af83d1468b033b00a91298a5b569d74b88a29f8 Mon Sep 17 00:00:00 2001 +From 763e31a576a4cd665e5ad06ad0eb4610cecc0b42 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 10 Jul 2020 10:45:52 -0400 -Subject: [PATCH 46/48] gdm-x-session: tell x server to not vt switch +Subject: [PATCH 46/51] gdm-x-session: tell x server to not vt switch gdm already handles the VT switching on X's behalf, so it's redundant, and X does it at inopportune times, @@ -77,5 +77,5 @@ index 3b2fcef47..d8e3c7d53 100644 display_number = g_data_input_stream_read_line (data_stream, -- -2.26.0 +2.27.0 diff --git a/SOURCES/0047-local-display-factory-kill-X-on-login-just-like-wayl.patch b/SOURCES/0047-local-display-factory-kill-X-on-login-just-like-wayl.patch index d5c315c..306b7fb 100644 --- a/SOURCES/0047-local-display-factory-kill-X-on-login-just-like-wayl.patch +++ b/SOURCES/0047-local-display-factory-kill-X-on-login-just-like-wayl.patch @@ -1,7 +1,7 @@ -From 053106dc82ff66206a78a496b845249be9173584 Mon Sep 17 00:00:00 2001 +From a1c74e2e42dea464ab0b439b767da5c12cbf3986 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 11 Oct 2018 07:15:56 -0400 -Subject: [PATCH 47/48] local-display-factory: kill X on login just like +Subject: [PATCH 47/51] local-display-factory: kill X on login just like wayland These days we kill the wayland login screen during login to @@ -111,5 +111,5 @@ index a288f8765..aae226750 100644 if (condition & G_IO_PRI) { -- -2.26.0 +2.27.0 diff --git a/SOURCES/0048-manager-don-t-kill-initial-setup-right-away-with-Xor.patch b/SOURCES/0048-manager-don-t-kill-initial-setup-right-away-with-Xor.patch index b667d46..041a8be 100644 --- a/SOURCES/0048-manager-don-t-kill-initial-setup-right-away-with-Xor.patch +++ b/SOURCES/0048-manager-don-t-kill-initial-setup-right-away-with-Xor.patch @@ -1,7 +1,7 @@ -From dbb50dee49fd68ba0983f8889d54191bf8acfe04 Mon Sep 17 00:00:00 2001 +From f1b7d85b46dfc253176d6a043dcce26da3a26dfb Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 13 Jul 2020 09:23:06 -0400 -Subject: [PATCH 48/48] manager: don't kill initial-setup right away with Xorg +Subject: [PATCH 48/51] manager: don't kill initial-setup right away with Xorg either The login screen for both Xorg and wayland sessions is now silently @@ -145,5 +145,5 @@ index cf982870c..b147d73db 100644 if ((g_strcmp0 (operation->service_name, "gdm-autologin") == 0) && -- -2.26.0 +2.27.0 diff --git a/SOURCES/0049-GdmManager-GdmDisplay-Add-RegisterSession-method.patch b/SOURCES/0049-GdmManager-GdmDisplay-Add-RegisterSession-method.patch new file mode 100644 index 0000000..0fb7dbd --- /dev/null +++ b/SOURCES/0049-GdmManager-GdmDisplay-Add-RegisterSession-method.patch @@ -0,0 +1,554 @@ +From ac45b0745db7a8e8cbdd3a2880c0e39f0f3681a3 Mon Sep 17 00:00:00 2001 +From: Iain Lane +Date: Tue, 7 May 2019 15:57:43 +0100 +Subject: [PATCH 49/51] GdmManager, GdmDisplay: Add RegisterSession method + +Window managers can use this to register with GDM when they've finished +starting up and started displaying. +--- + daemon/gdm-display.c | 27 +++++++++++++++++++++++++++ + daemon/gdm-manager.c | 30 ++++++++++++++++++++++++++++++ + daemon/gdm-manager.xml | 3 +++ + 3 files changed, 60 insertions(+) + +diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c +index 1cef8c7c1..09cc2e116 100644 +--- a/daemon/gdm-display.c ++++ b/daemon/gdm-display.c +@@ -64,82 +64,84 @@ struct GdmDisplayPrivate + char *remote_hostname; + int x11_display_number; + char *x11_display_name; + int status; + time_t creation_time; + GTimer *server_timer; + + char *x11_cookie; + gsize x11_cookie_size; + GdmDisplayAccessFile *access_file; + + guint finish_idle_id; + + xcb_connection_t *xcb_connection; + int xcb_screen_number; + + GDBusConnection *connection; + GdmDisplayAccessFile *user_access_file; + + GdmDBusDisplay *display_skeleton; + GDBusObjectSkeleton *object_skeleton; + + /* this spawns and controls the greeter session */ + GdmLaunchEnvironment *launch_environment; + + guint is_local : 1; + guint is_initial : 1; + guint allow_timed_login : 1; + guint have_existing_user_accounts : 1; + guint doing_initial_setup : 1; ++ guint session_registered : 1; + }; + + enum { + PROP_0, + PROP_ID, + PROP_STATUS, + PROP_SEAT_ID, + PROP_SESSION_ID, + PROP_SESSION_CLASS, + PROP_SESSION_TYPE, + PROP_REMOTE_HOSTNAME, + PROP_X11_DISPLAY_NUMBER, + PROP_X11_DISPLAY_NAME, + PROP_X11_COOKIE, + PROP_X11_AUTHORITY_FILE, + PROP_IS_CONNECTED, + PROP_IS_LOCAL, + PROP_LAUNCH_ENVIRONMENT, + PROP_IS_INITIAL, + PROP_ALLOW_TIMED_LOGIN, + PROP_HAVE_EXISTING_USER_ACCOUNTS, + PROP_DOING_INITIAL_SETUP, ++ PROP_SESSION_REGISTERED, + }; + + static void gdm_display_class_init (GdmDisplayClass *klass); + static void gdm_display_init (GdmDisplay *self); + static void gdm_display_finalize (GObject *object); + static void queue_finish (GdmDisplay *self); + static void _gdm_display_set_status (GdmDisplay *self, + int status); + static gboolean wants_initial_setup (GdmDisplay *self); + G_DEFINE_ABSTRACT_TYPE (GdmDisplay, gdm_display, G_TYPE_OBJECT) + + GQuark + gdm_display_error_quark (void) + { + static GQuark ret = 0; + if (ret == 0) { + ret = g_quark_from_static_string ("gdm_display_error"); + } + + return ret; + } + + time_t + gdm_display_get_creation_time (GdmDisplay *self) + { + g_return_val_if_fail (GDM_IS_DISPLAY (self), 0); + + return self->priv->creation_time; + } + +@@ -733,60 +735,71 @@ static void + _gdm_display_set_x11_display_number (GdmDisplay *self, + int num) + { + self->priv->x11_display_number = num; + } + + static void + _gdm_display_set_x11_display_name (GdmDisplay *self, + const char *x11_display) + { + g_free (self->priv->x11_display_name); + self->priv->x11_display_name = g_strdup (x11_display); + } + + static void + _gdm_display_set_x11_cookie (GdmDisplay *self, + const char *x11_cookie) + { + g_free (self->priv->x11_cookie); + self->priv->x11_cookie = g_strdup (x11_cookie); + } + + static void + _gdm_display_set_is_local (GdmDisplay *self, + gboolean is_local) + { + g_debug ("GdmDisplay: local: %s", is_local? "yes" : "no"); + self->priv->is_local = is_local; + } + ++static void ++_gdm_display_set_session_registered (GdmDisplay *self, ++ gboolean registered) ++{ ++ GdmDisplayPrivate *priv; ++ ++ priv = gdm_display_get_instance_private (self); ++ g_debug ("GdmDisplay: session registered: %s", registered? "yes" : "no"); ++ priv->session_registered = registered; ++} ++ + static void + _gdm_display_set_launch_environment (GdmDisplay *self, + GdmLaunchEnvironment *launch_environment) + { + g_clear_object (&self->priv->launch_environment); + + self->priv->launch_environment = g_object_ref (launch_environment); + } + + static void + _gdm_display_set_is_initial (GdmDisplay *self, + gboolean initial) + { + g_debug ("GdmDisplay: initial: %s", initial? "yes" : "no"); + self->priv->is_initial = initial; + } + + static void + _gdm_display_set_allow_timed_login (GdmDisplay *self, + gboolean allow_timed_login) + { + g_debug ("GdmDisplay: allow timed login: %s", allow_timed_login? "yes" : "no"); + self->priv->allow_timed_login = allow_timed_login; + } + + static void + gdm_display_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +@@ -811,60 +824,63 @@ gdm_display_set_property (GObject *object, + case PROP_SESSION_CLASS: + _gdm_display_set_session_class (self, g_value_get_string (value)); + break; + case PROP_SESSION_TYPE: + _gdm_display_set_session_type (self, g_value_get_string (value)); + break; + case PROP_REMOTE_HOSTNAME: + _gdm_display_set_remote_hostname (self, g_value_get_string (value)); + break; + case PROP_X11_DISPLAY_NUMBER: + _gdm_display_set_x11_display_number (self, g_value_get_int (value)); + break; + case PROP_X11_DISPLAY_NAME: + _gdm_display_set_x11_display_name (self, g_value_get_string (value)); + break; + case PROP_X11_COOKIE: + _gdm_display_set_x11_cookie (self, g_value_get_string (value)); + break; + case PROP_IS_LOCAL: + _gdm_display_set_is_local (self, g_value_get_boolean (value)); + break; + case PROP_ALLOW_TIMED_LOGIN: + _gdm_display_set_allow_timed_login (self, g_value_get_boolean (value)); + break; + case PROP_LAUNCH_ENVIRONMENT: + _gdm_display_set_launch_environment (self, g_value_get_object (value)); + break; + case PROP_IS_INITIAL: + _gdm_display_set_is_initial (self, g_value_get_boolean (value)); + break; ++ case PROP_SESSION_REGISTERED: ++ _gdm_display_set_session_registered (self, g_value_get_boolean (value)); ++ break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + } + + static void + gdm_display_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) + { + GdmDisplay *self; + + self = GDM_DISPLAY (object); + + switch (prop_id) { + case PROP_ID: + g_value_set_string (value, self->priv->id); + break; + case PROP_STATUS: + g_value_set_int (value, self->priv->status); + break; + case PROP_SEAT_ID: + g_value_set_string (value, self->priv->seat_id); + break; + case PROP_SESSION_ID: + g_value_set_string (value, self->priv->session_id); + break; + case PROP_SESSION_CLASS: +@@ -881,60 +897,63 @@ gdm_display_get_property (GObject *object, + break; + case PROP_X11_DISPLAY_NAME: + g_value_set_string (value, self->priv->x11_display_name); + break; + case PROP_X11_COOKIE: + g_value_set_string (value, self->priv->x11_cookie); + break; + case PROP_X11_AUTHORITY_FILE: + g_value_take_string (value, + self->priv->access_file? + gdm_display_access_file_get_path (self->priv->access_file) : NULL); + break; + case PROP_IS_LOCAL: + g_value_set_boolean (value, self->priv->is_local); + break; + case PROP_IS_CONNECTED: + g_value_set_boolean (value, self->priv->xcb_connection != NULL); + break; + case PROP_LAUNCH_ENVIRONMENT: + g_value_set_object (value, self->priv->launch_environment); + break; + case PROP_IS_INITIAL: + g_value_set_boolean (value, self->priv->is_initial); + break; + case PROP_HAVE_EXISTING_USER_ACCOUNTS: + g_value_set_boolean (value, self->priv->have_existing_user_accounts); + break; + case PROP_DOING_INITIAL_SETUP: + g_value_set_boolean (value, self->priv->doing_initial_setup); + break; ++ case PROP_SESSION_REGISTERED: ++ g_value_set_boolean (value, priv->session_registered); ++ break; + case PROP_ALLOW_TIMED_LOGIN: + g_value_set_boolean (value, self->priv->allow_timed_login); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + } + + static gboolean + handle_get_id (GdmDBusDisplay *skeleton, + GDBusMethodInvocation *invocation, + GdmDisplay *self) + { + char *id; + + gdm_display_get_id (self, &id, NULL); + + gdm_dbus_display_complete_get_id (skeleton, invocation, id); + + g_free (id); + return TRUE; + } + + static gboolean + handle_get_remote_hostname (GdmDBusDisplay *skeleton, + GDBusMethodInvocation *invocation, + GdmDisplay *self) + { + char *hostname; +@@ -1197,60 +1216,68 @@ gdm_display_class_init (GdmDisplayClass *klass) + G_PARAM_READABLE)); + + g_object_class_install_property (object_class, + PROP_IS_LOCAL, + g_param_spec_boolean ("is-local", + NULL, + NULL, + TRUE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + g_object_class_install_property (object_class, + PROP_IS_CONNECTED, + g_param_spec_boolean ("is-connected", + NULL, + NULL, + TRUE, + G_PARAM_READABLE)); + g_object_class_install_property (object_class, + PROP_HAVE_EXISTING_USER_ACCOUNTS, + g_param_spec_boolean ("have-existing-user-accounts", + NULL, + NULL, + FALSE, + G_PARAM_READABLE)); + g_object_class_install_property (object_class, + PROP_DOING_INITIAL_SETUP, + g_param_spec_boolean ("doing-initial-setup", + NULL, + NULL, + FALSE, + G_PARAM_READABLE)); ++ g_object_class_install_property (object_class, ++ PROP_SESSION_REGISTERED, ++ g_param_spec_boolean ("session-registered", ++ NULL, ++ NULL, ++ FALSE, ++ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ + g_object_class_install_property (object_class, + PROP_LAUNCH_ENVIRONMENT, + g_param_spec_object ("launch-environment", + NULL, + NULL, + GDM_TYPE_LAUNCH_ENVIRONMENT, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_STATUS, + g_param_spec_int ("status", + "status", + "status", + -1, + G_MAXINT, + GDM_DISPLAY_UNMANAGED, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + + g_type_class_add_private (klass, sizeof (GdmDisplayPrivate)); + } + + static void + gdm_display_init (GdmDisplay *self) + { + + self->priv = GDM_DISPLAY_GET_PRIVATE (self); + + self->priv->creation_time = time (NULL); + self->priv->server_timer = g_timer_new (); + } + +diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c +index b147d73db..bff602a07 100644 +--- a/daemon/gdm-manager.c ++++ b/daemon/gdm-manager.c +@@ -789,60 +789,89 @@ gdm_manager_handle_register_display (GdmDBusManager *manager, + if (session != NULL) { + GPid pid; + + if (x11_display_name != NULL) { + g_object_set (G_OBJECT (session), "display-name", x11_display_name, NULL); + g_object_set (G_OBJECT (display), "x11-display-name", x11_display_name, NULL); + } + + /* FIXME: this should happen in gdm-session.c when the session is opened + */ + if (tty != NULL) + g_object_set (G_OBJECT (session), "display-device", tty, NULL); + + pid = gdm_session_get_pid (session); + + if (pid > 0) { + add_session_record (self, session, pid, SESSION_RECORD_LOGIN); + } + } + + g_object_set (G_OBJECT (display), "status", GDM_DISPLAY_MANAGED, NULL); + + gdm_dbus_manager_complete_register_display (GDM_DBUS_MANAGER (manager), + invocation); + + g_clear_pointer (&x11_display_name, g_free); + g_clear_pointer (&tty, g_free); + return TRUE; + } + ++static gboolean ++gdm_manager_handle_register_session (GdmDBusManager *manager, ++ GDBusMethodInvocation *invocation, ++ GVariant *details) ++{ ++ GdmManager *self = GDM_MANAGER (manager); ++ GdmDisplay *display; ++ const char *sender; ++ GDBusConnection *connection; ++ ++ sender = g_dbus_method_invocation_get_sender (invocation); ++ connection = g_dbus_method_invocation_get_connection (invocation); ++ ++ get_display_and_details_for_bus_sender (self, connection, sender, &display, ++ NULL, NULL, NULL, NULL, NULL, NULL, NULL); ++ ++ g_debug ("GdmManager: trying to register new session on display %p", display); ++ ++ if (display != NULL) ++ g_object_set (G_OBJECT (display), "session-registered", TRUE, NULL); ++ else ++ g_debug ("GdmManager: No display, not registering"); ++ ++ gdm_dbus_manager_complete_register_session (GDM_DBUS_MANAGER (manager), ++ invocation); ++ ++ return TRUE; ++} ++ + static gboolean + gdm_manager_handle_open_session (GdmDBusManager *manager, + GDBusMethodInvocation *invocation) + { + GdmManager *self = GDM_MANAGER (manager); + const char *sender; + GDBusConnection *connection; + GdmDisplay *display = NULL; + GdmSession *session = NULL; + const char *address; + GPid pid = 0; + uid_t uid = (uid_t) -1; + uid_t allowed_user; + + g_debug ("GdmManager: trying to open new session"); + + sender = g_dbus_method_invocation_get_sender (invocation); + connection = g_dbus_method_invocation_get_connection (invocation); + get_display_and_details_for_bus_sender (self, connection, sender, &display, NULL, NULL, NULL, &pid, &uid, NULL, NULL); + + if (display == NULL) { + g_dbus_method_invocation_return_error_literal (invocation, + G_DBUS_ERROR, + G_DBUS_ERROR_ACCESS_DENIED, + _("No session available")); + + return TRUE; + } + + #ifdef HAVE_LIBXDMCP +@@ -1167,60 +1196,61 @@ gdm_manager_handle_open_reauthentication_channel (GdmDBusManager *manager + g_hash_table_insert (self->priv->open_reauthentication_requests, + GINT_TO_POINTER (pid), + invocation); + } else if (is_login_screen) { + g_dbus_method_invocation_return_error_literal (invocation, + G_DBUS_ERROR, + G_DBUS_ERROR_ACCESS_DENIED, + "Login screen only allowed to open reauthentication channels for running sessions"); + return TRUE; + } else { + char *address; + address = open_temporary_reauthentication_channel (self, + seat_id, + session_id, + pid, + uid, + is_remote); + gdm_dbus_manager_complete_open_reauthentication_channel (GDM_DBUS_MANAGER (manager), + invocation, + address); + g_free (address); + } + + return TRUE; + } + + static void + manager_interface_init (GdmDBusManagerIface *interface) + { + interface->handle_register_display = gdm_manager_handle_register_display; ++ interface->handle_register_session = gdm_manager_handle_register_session; + interface->handle_open_session = gdm_manager_handle_open_session; + interface->handle_open_reauthentication_channel = gdm_manager_handle_open_reauthentication_channel; + } + + static gboolean + display_is_on_seat0 (GdmDisplay *display) + { + gboolean is_on_seat0 = TRUE; + char *seat_id = NULL; + + g_object_get (G_OBJECT (display), "seat-id", &seat_id, NULL); + + if (g_strcmp0 (seat_id, "seat0") != 0) { + is_on_seat0 = FALSE; + } + + g_free (seat_id); + + return is_on_seat0; + } + + static gboolean + get_timed_login_details (GdmManager *manager, + char **usernamep, + int *delayp) + { + gboolean res; + gboolean enabled; + + int delay; +diff --git a/daemon/gdm-manager.xml b/daemon/gdm-manager.xml +index f11f3fb73..92ef1d02d 100644 +--- a/daemon/gdm-manager.xml ++++ b/daemon/gdm-manager.xml +@@ -1,16 +1,19 @@ + + + + + + ++ ++ ++ + + + + + + + + + + +-- +2.27.0 + diff --git a/SOURCES/0050-Allow-sessions-to-register-with-GDM.patch b/SOURCES/0050-Allow-sessions-to-register-with-GDM.patch new file mode 100644 index 0000000..5a53144 --- /dev/null +++ b/SOURCES/0050-Allow-sessions-to-register-with-GDM.patch @@ -0,0 +1,1917 @@ +From d6aca6da3ab9c16e907c7f46cf6d7bc2abbc2890 Mon Sep 17 00:00:00 2001 +From: Iain Lane +Date: Tue, 7 May 2019 16:00:14 +0100 +Subject: [PATCH 50/51] Allow sessions to register with GDM +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Recording when sessions start, for Wayland → Xorg fallback or +transitioning to the user session, is currently done with timeouts. + +This isn't ideal, because on some very slow machines the timeout can be +hit before the session has had a chance to fail: if gnome-session takes +more than 3 seconds to fail then the session will be considered to have +exited rather than failed, and so we don't do Xorg fallback. + +We can do this more reliably if we allow sessions to optionally register +themselves with GDM. Then we will know when they've started, so can shut +down the greeter or fall back to Xorg as appropriate. The mechanism is +that they specify X-GDM-SessionRegisters=true in their file, and then +call RegsterSession on the DisplayManager interface on the bus (added in +the previous commit) to say that they've started up. + +If X-GDM-SessionRegisters is missing or false, GDM will call the same +method for them after 10 seconds. + +Closes: #483 +--- + common/gdm-common.h | 2 + + daemon/gdm-display.c | 19 ++----- + daemon/gdm-local-display-factory.c | 49 +++++++++--------- + daemon/gdm-session.c | 47 +++++++++++++++-- + daemon/gdm-session.h | 1 + + daemon/gdm-wayland-session.c | 81 +++++++++++++++++++++++------- + daemon/gdm-x-session.c | 81 +++++++++++++++++++++++------- + 7 files changed, 201 insertions(+), 79 deletions(-) + +diff --git a/common/gdm-common.h b/common/gdm-common.h +index 3fbf07653..7fd6458d7 100644 +--- a/common/gdm-common.h ++++ b/common/gdm-common.h +@@ -1,59 +1,61 @@ + /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2007 William Jon McCann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + + #ifndef _GDM_COMMON_H + #define _GDM_COMMON_H + + #include + #include + + #include + #include + ++#define REGISTER_SESSION_TIMEOUT 10 ++ + #define VE_IGNORE_EINTR(expr) \ + do { \ + errno = 0; \ + expr; \ + } while G_UNLIKELY (errno == EINTR); + + GQuark gdm_common_error_quark (void); + #define GDM_COMMON_ERROR gdm_common_error_quark() + + typedef char * (*GdmExpandVarFunc) (const char *var, + gpointer user_data); + + G_BEGIN_DECLS + + int gdm_wait_on_pid (int pid); + int gdm_wait_on_and_disown_pid (int pid, + int timeout); + int gdm_signal_pid (int pid, + int signal); + gboolean gdm_get_pwent_for_name (const char *name, + struct passwd **pwentp); + + gboolean gdm_clear_close_on_exec_flag (int fd); + + const char * gdm_make_temp_dir (char *template); + + char *gdm_generate_random_bytes (gsize size, + GError **error); + gboolean gdm_get_login_window_session_id (const char *seat_id, + char **session_id); +diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c +index 09cc2e116..ae20491cd 100644 +--- a/daemon/gdm-display.c ++++ b/daemon/gdm-display.c +@@ -39,61 +39,60 @@ + + #include "gdm-common.h" + #include "gdm-display.h" + #include "gdm-display-glue.h" + #include "gdm-display-access-file.h" + #include "gdm-launch-environment.h" + + #include "gdm-settings-direct.h" + #include "gdm-settings-keys.h" + + #include "gdm-launch-environment.h" + #include "gdm-dbus-util.h" + + #define GNOME_SESSION_SESSIONS_PATH DATADIR "/gnome-session/sessions" + + #define GDM_DISPLAY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_DISPLAY, GdmDisplayPrivate)) + + struct GdmDisplayPrivate + { + char *id; + char *seat_id; + char *session_id; + char *session_class; + char *session_type; + + char *remote_hostname; + int x11_display_number; + char *x11_display_name; + int status; + time_t creation_time; +- GTimer *server_timer; + + char *x11_cookie; + gsize x11_cookie_size; + GdmDisplayAccessFile *access_file; + + guint finish_idle_id; + + xcb_connection_t *xcb_connection; + int xcb_screen_number; + + GDBusConnection *connection; + GdmDisplayAccessFile *user_access_file; + + GdmDBusDisplay *display_skeleton; + GDBusObjectSkeleton *object_skeleton; + + /* this spawns and controls the greeter session */ + GdmLaunchEnvironment *launch_environment; + + guint is_local : 1; + guint is_initial : 1; + guint allow_timed_login : 1; + guint have_existing_user_accounts : 1; + guint doing_initial_setup : 1; + guint session_registered : 1; + }; + + enum { + PROP_0, + PROP_ID, +@@ -510,62 +509,60 @@ gdm_display_prepare (GdmDisplay *self) + * asynchronously + */ + look_for_existing_users_sync (self); + + self->priv->doing_initial_setup = wants_initial_setup (self); + + g_object_ref (self); + ret = GDM_DISPLAY_GET_CLASS (self)->prepare (self); + g_object_unref (self); + + return ret; + } + + gboolean + gdm_display_manage (GdmDisplay *self) + { + gboolean res; + + g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE); + + g_debug ("GdmDisplay: Managing display: %s", self->priv->id); + + /* If not explicitly prepared, do it now */ + if (self->priv->status == GDM_DISPLAY_UNMANAGED) { + res = gdm_display_prepare (self); + if (! res) { + return FALSE; + } + } + +- g_timer_start (self->priv->server_timer); +- + if (g_strcmp0 (self->priv->session_class, "greeter") == 0) { + if (GDM_DISPLAY_GET_CLASS (self)->manage != NULL) { + GDM_DISPLAY_GET_CLASS (self)->manage (self); + } + } + + return TRUE; + } + + gboolean + gdm_display_finish (GdmDisplay *self) + { + g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE); + + if (self->priv->finish_idle_id != 0) { + g_source_remove (self->priv->finish_idle_id); + self->priv->finish_idle_id = 0; + } + + _gdm_display_set_status (self, GDM_DISPLAY_FINISHED); + + g_debug ("GdmDisplay: finish display"); + + return TRUE; + } + + static void + gdm_display_disconnect (GdmDisplay *self) + { + /* These 3 bits are reserved/unused by the X protocol */ +@@ -576,85 +573,80 @@ gdm_display_disconnect (GdmDisplay *self) + + if (self->priv->xcb_connection == NULL) { + return; + } + + setup = xcb_get_setup (self->priv->xcb_connection); + + /* resource_id_mask is the bits given to each client for + * addressing resources */ + highest_client = (XID) ~unused_bits & ~setup->resource_id_mask; + client_increment = setup->resource_id_mask + 1; + + /* Kill every client but ourselves, then close our own connection + */ + for (client = 0; + client <= highest_client; + client += client_increment) { + + if (client != setup->resource_id_base) + xcb_kill_client (self->priv->xcb_connection, client); + } + + xcb_flush (self->priv->xcb_connection); + + g_clear_pointer (&self->priv->xcb_connection, xcb_disconnect); + } + + gboolean + gdm_display_unmanage (GdmDisplay *self) + { +- gdouble elapsed; +- + g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE); + + g_debug ("GdmDisplay: unmanage display"); + + gdm_display_disconnect (self); + +- g_timer_stop (self->priv->server_timer); +- + if (self->priv->user_access_file != NULL) { + gdm_display_access_file_close (self->priv->user_access_file); + g_object_unref (self->priv->user_access_file); + self->priv->user_access_file = NULL; + } + + if (self->priv->access_file != NULL) { + gdm_display_access_file_close (self->priv->access_file); + g_object_unref (self->priv->access_file); + self->priv->access_file = NULL; + } + +- elapsed = g_timer_elapsed (self->priv->server_timer, NULL); +- if (elapsed < 3) { +- g_warning ("GdmDisplay: display lasted %lf seconds", elapsed); ++ if (!self->priv->session_registered) { ++ g_warning ("GdmDisplay: Session never registered, failing"); + _gdm_display_set_status (self, GDM_DISPLAY_FAILED); + } else { + _gdm_display_set_status (self, GDM_DISPLAY_UNMANAGED); + } + + return TRUE; + } + + gboolean + gdm_display_get_id (GdmDisplay *self, + char **id, + GError **error) + { + g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE); + + if (id != NULL) { + *id = g_strdup (self->priv->id); + } + + return TRUE; + } + + gboolean + gdm_display_get_x11_display_name (GdmDisplay *self, + char **x11_display, + GError **error) + { + g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE); + + if (x11_display != NULL) { +@@ -898,61 +890,61 @@ gdm_display_get_property (GObject *object, + case PROP_X11_DISPLAY_NAME: + g_value_set_string (value, self->priv->x11_display_name); + break; + case PROP_X11_COOKIE: + g_value_set_string (value, self->priv->x11_cookie); + break; + case PROP_X11_AUTHORITY_FILE: + g_value_take_string (value, + self->priv->access_file? + gdm_display_access_file_get_path (self->priv->access_file) : NULL); + break; + case PROP_IS_LOCAL: + g_value_set_boolean (value, self->priv->is_local); + break; + case PROP_IS_CONNECTED: + g_value_set_boolean (value, self->priv->xcb_connection != NULL); + break; + case PROP_LAUNCH_ENVIRONMENT: + g_value_set_object (value, self->priv->launch_environment); + break; + case PROP_IS_INITIAL: + g_value_set_boolean (value, self->priv->is_initial); + break; + case PROP_HAVE_EXISTING_USER_ACCOUNTS: + g_value_set_boolean (value, self->priv->have_existing_user_accounts); + break; + case PROP_DOING_INITIAL_SETUP: + g_value_set_boolean (value, self->priv->doing_initial_setup); + break; + case PROP_SESSION_REGISTERED: +- g_value_set_boolean (value, priv->session_registered); ++ g_value_set_boolean (value, self->priv->session_registered); + break; + case PROP_ALLOW_TIMED_LOGIN: + g_value_set_boolean (value, self->priv->allow_timed_login); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + } + + static gboolean + handle_get_id (GdmDBusDisplay *skeleton, + GDBusMethodInvocation *invocation, + GdmDisplay *self) + { + char *id; + + gdm_display_get_id (self, &id, NULL); + + gdm_dbus_display_complete_get_id (skeleton, invocation, id); + + g_free (id); + return TRUE; + } + + static gboolean + handle_get_remote_hostname (GdmDBusDisplay *skeleton, + GDBusMethodInvocation *invocation, + GdmDisplay *self) + { +@@ -1251,99 +1243,94 @@ gdm_display_class_init (GdmDisplayClass *klass) + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (object_class, + PROP_LAUNCH_ENVIRONMENT, + g_param_spec_object ("launch-environment", + NULL, + NULL, + GDM_TYPE_LAUNCH_ENVIRONMENT, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_STATUS, + g_param_spec_int ("status", + "status", + "status", + -1, + G_MAXINT, + GDM_DISPLAY_UNMANAGED, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + + g_type_class_add_private (klass, sizeof (GdmDisplayPrivate)); + } + + static void + gdm_display_init (GdmDisplay *self) + { + + self->priv = GDM_DISPLAY_GET_PRIVATE (self); + + self->priv->creation_time = time (NULL); +- self->priv->server_timer = g_timer_new (); + } + + static void + gdm_display_finalize (GObject *object) + { + GdmDisplay *self; + + g_return_if_fail (object != NULL); + g_return_if_fail (GDM_IS_DISPLAY (object)); + + self = GDM_DISPLAY (object); + + g_return_if_fail (self->priv != NULL); + + g_debug ("GdmDisplay: Finalizing display: %s", self->priv->id); + g_free (self->priv->id); + g_free (self->priv->seat_id); + g_free (self->priv->session_class); + g_free (self->priv->remote_hostname); + g_free (self->priv->x11_display_name); + g_free (self->priv->x11_cookie); + + g_clear_object (&self->priv->display_skeleton); + g_clear_object (&self->priv->object_skeleton); + g_clear_object (&self->priv->connection); + + if (self->priv->access_file != NULL) { + g_object_unref (self->priv->access_file); + } + + if (self->priv->user_access_file != NULL) { + g_object_unref (self->priv->user_access_file); + } + +- if (self->priv->server_timer != NULL) { +- g_timer_destroy (self->priv->server_timer); +- } +- + G_OBJECT_CLASS (gdm_display_parent_class)->finalize (object); + } + + GDBusObjectSkeleton * + gdm_display_get_object_skeleton (GdmDisplay *self) + { + return self->priv->object_skeleton; + } + + static void + on_launch_environment_session_opened (GdmLaunchEnvironment *launch_environment, + GdmDisplay *self) + { + char *session_id; + + g_debug ("GdmDisplay: Greeter session opened"); + session_id = gdm_launch_environment_get_session_id (launch_environment); + _gdm_display_set_session_id (self, session_id); + g_free (session_id); + } + + static void + on_launch_environment_session_started (GdmLaunchEnvironment *launch_environment, + GdmDisplay *self) + { + g_debug ("GdmDisplay: Greeter started"); + } + + static void + self_destruct (GdmDisplay *self) +diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c +index aae226750..35880563d 100644 +--- a/daemon/gdm-local-display-factory.c ++++ b/daemon/gdm-local-display-factory.c +@@ -39,61 +39,60 @@ + #include "gdm-settings-keys.h" + #include "gdm-settings-direct.h" + #include "gdm-display-store.h" + #include "gdm-local-display.h" + #include "gdm-legacy-display.h" + + #define GDM_LOCAL_DISPLAY_FACTORY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_LOCAL_DISPLAY_FACTORY, GdmLocalDisplayFactoryPrivate)) + + #define GDM_DBUS_PATH "/org/gnome/DisplayManager" + #define GDM_LOCAL_DISPLAY_FACTORY_DBUS_PATH GDM_DBUS_PATH "/LocalDisplayFactory" + #define GDM_MANAGER_DBUS_NAME "org.gnome.DisplayManager.LocalDisplayFactory" + + #define MAX_DISPLAY_FAILURES 5 + #define WAIT_TO_FINISH_TIMEOUT 10 /* seconds */ + + struct GdmLocalDisplayFactoryPrivate + { + GdmDBusLocalDisplayFactory *skeleton; + GDBusConnection *connection; + GHashTable *used_display_numbers; + + /* FIXME: this needs to be per seat? */ + guint num_failures; + + guint seat_new_id; + guint seat_removed_id; + + #if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER) + unsigned int active_vt; + guint active_vt_watch_id; +- guint wait_to_finish_timeout_id; + #endif + }; + + enum { + PROP_0, + }; + + static void gdm_local_display_factory_class_init (GdmLocalDisplayFactoryClass *klass); + static void gdm_local_display_factory_init (GdmLocalDisplayFactory *factory); + static void gdm_local_display_factory_finalize (GObject *object); + + static GdmDisplay *create_display (GdmLocalDisplayFactory *factory, + const char *seat_id, + const char *session_type, + gboolean initial_display); + + static void on_display_status_changed (GdmDisplay *display, + GParamSpec *arg1, + GdmLocalDisplayFactory *factory); + + static gboolean gdm_local_display_factory_sync_seats (GdmLocalDisplayFactory *factory); + static gpointer local_display_factory_object = NULL; + static gboolean lookup_by_session_id (const char *id, + GdmDisplay *display, + gpointer user_data); + + G_DEFINE_TYPE (GdmLocalDisplayFactory, gdm_local_display_factory, GDM_TYPE_DISPLAY_FACTORY) + + GQuark + gdm_local_display_factory_error_quark (void) +@@ -276,60 +275,79 @@ gdm_local_display_factory_create_transient_display (GdmLocalDisplayFactory *fact + static gboolean + finish_display_on_seat_if_waiting (GdmDisplayStore *display_store, + GdmDisplay *display, + const char *seat_id) + { + if (gdm_display_get_status (display) != GDM_DISPLAY_WAITING_TO_FINISH) + return FALSE; + + g_debug ("GdmLocalDisplayFactory: finish background display\n"); + gdm_display_stop_greeter_session (display); + gdm_display_unmanage (display); + gdm_display_finish (display); + + return FALSE; + } + + static void + finish_waiting_displays_on_seat (GdmLocalDisplayFactory *factory, + const char *seat_id) + { + GdmDisplayStore *store; + + store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); + + gdm_display_store_foreach (store, + (GdmDisplayStoreFunc) finish_display_on_seat_if_waiting, + (gpointer) + seat_id); + } + ++static void ++on_session_registered_cb (GObject *gobject, ++ GParamSpec *pspec, ++ gpointer user_data) ++{ ++ GdmDisplay *display = GDM_DISPLAY (gobject); ++ GdmLocalDisplayFactory *factory = GDM_LOCAL_DISPLAY_FACTORY (user_data); ++ gboolean registered; ++ ++ g_object_get (display, "session-registered", ®istered, NULL); ++ ++ if (!registered) ++ return; ++ ++ g_debug ("GdmLocalDisplayFactory: session registered on display, looking for any background displays to kill"); ++ ++ finish_waiting_displays_on_seat (factory, "seat0"); ++} ++ + static void + on_display_status_changed (GdmDisplay *display, + GParamSpec *arg1, + GdmLocalDisplayFactory *factory) + { + int status; + int num; + char *seat_id = NULL; + char *session_type = NULL; + char *session_class = NULL; + gboolean is_initial = TRUE; + gboolean is_local = TRUE; + + num = -1; + gdm_display_get_x11_display_number (display, &num, NULL); + + g_object_get (display, + "seat-id", &seat_id, + "is-initial", &is_initial, + "is-local", &is_local, + "session-type", &session_type, + "session-class", &session_class, + NULL); + + status = gdm_display_get_status (display); + + g_debug ("GdmLocalDisplayFactory: display status changed: %d", status); + switch (status) { + case GDM_DISPLAY_FINISHED: + /* remove the display number from factory->priv->used_display_numbers +@@ -359,60 +377,67 @@ on_display_status_changed (GdmDisplay *display, + /* Create a new equivalent display if it was static */ + if (is_local) { + + factory->priv->num_failures++; + + if (factory->priv->num_failures > MAX_DISPLAY_FAILURES) { + /* oh shit */ + g_warning ("GdmLocalDisplayFactory: maximum number of X display failures reached: check X server log for errors"); + } else { + #ifdef ENABLE_WAYLAND_SUPPORT + if (g_strcmp0 (session_type, "wayland") == 0) { + g_free (session_type); + session_type = NULL; + + /* workaround logind race for now + * bug 1643874 + */ + g_usleep (2 * G_USEC_PER_SEC); + } + + #endif + create_display (factory, seat_id, session_type, is_initial); + } + } + break; + case GDM_DISPLAY_UNMANAGED: + break; + case GDM_DISPLAY_PREPARED: + break; + case GDM_DISPLAY_MANAGED: ++#if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER) ++ g_signal_connect_object (display, ++ "notify::session-registered", ++ G_CALLBACK (on_session_registered_cb), ++ factory, ++ 0); ++#endif + break; + case GDM_DISPLAY_WAITING_TO_FINISH: + break; + default: + g_assert_not_reached (); + break; + } + + g_free (seat_id); + g_free (session_type); + g_free (session_class); + } + + static gboolean + lookup_by_seat_id (const char *id, + GdmDisplay *display, + gpointer user_data) + { + const char *looking_for = user_data; + char *current; + gboolean res; + + g_object_get (G_OBJECT (display), "seat-id", ¤t, NULL); + + res = g_strcmp0 (current, looking_for) == 0; + + g_free(current); + + return res; + } +@@ -587,100 +612,83 @@ on_seat_new (GDBusConnection *connection, + } + + static void + on_seat_removed (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) + { + const char *seat; + + g_variant_get (parameters, "(&s&o)", &seat, NULL); + delete_display (GDM_LOCAL_DISPLAY_FACTORY (user_data), seat); + } + + #if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER) + static gboolean + lookup_by_session_id (const char *id, + GdmDisplay *display, + gpointer user_data) + { + const char *looking_for = user_data; + const char *current; + + current = gdm_display_get_session_id (display); + return g_strcmp0 (current, looking_for) == 0; + } + +-static gboolean +-wait_to_finish_timeout (GdmLocalDisplayFactory *factory) +-{ +- finish_waiting_displays_on_seat (factory, "seat0"); +- factory->priv->wait_to_finish_timeout_id = 0; +- return G_SOURCE_REMOVE; +-} +- + static void + maybe_stop_greeter_in_background (GdmLocalDisplayFactory *factory, + GdmDisplay *display) + { + gboolean doing_initial_setup = FALSE; + + if (gdm_display_get_status (display) != GDM_DISPLAY_MANAGED) { + g_debug ("GdmLocalDisplayFactory: login window not in managed state, so ignoring"); + return; + } + + g_object_get (G_OBJECT (display), + "doing-initial-setup", &doing_initial_setup, + NULL); + + /* we don't ever stop initial-setup implicitly */ + if (doing_initial_setup) { + g_debug ("GdmLocalDisplayFactory: login window is performing initial-setup, so ignoring"); + return; + } + + g_debug ("GdmLocalDisplayFactory: killing login window once its unused"); + g_object_set (G_OBJECT (display), "status", GDM_DISPLAY_WAITING_TO_FINISH, NULL); +- +- /* We stop the greeter after a timeout to avoid flicker */ +- if (factory->priv->wait_to_finish_timeout_id != 0) +- g_source_remove (factory->priv->wait_to_finish_timeout_id); +- +- factory->priv->wait_to_finish_timeout_id = +- g_timeout_add_seconds (WAIT_TO_FINISH_TIMEOUT, +- (GSourceFunc)wait_to_finish_timeout, +- factory); + } + + static gboolean + on_vt_changed (GIOChannel *source, + GIOCondition condition, + GdmLocalDisplayFactory *factory) + { + GIOStatus status; + g_autofree char *tty_of_active_vt = NULL; + g_autofree char *login_session_id = NULL; + g_autofree char *active_session_id = NULL; + unsigned int previous_vt, new_vt; + const char *session_type = NULL; + int ret, n_returned; + + g_debug ("GdmLocalDisplayFactory: received VT change event"); + g_io_channel_seek_position (source, 0, G_SEEK_SET, NULL); + + if (condition & G_IO_PRI) { + g_autoptr (GError) error = NULL; + status = g_io_channel_read_line (source, &tty_of_active_vt, NULL, NULL, &error); + + if (error != NULL) { + g_warning ("could not read active VT from kernel: %s", error->message); + } + switch (status) { + case G_IO_STATUS_ERROR: + return G_SOURCE_REMOVE; + case G_IO_STATUS_EOF: + return G_SOURCE_REMOVE; +@@ -722,61 +730,60 @@ on_vt_changed (GIOChannel *source, + factory->priv->active_vt = new_vt; + + /* don't do anything at start up */ + if (previous_vt == 0) { + g_debug ("GdmLocalDisplayFactory: VT is %u at startup", + factory->priv->active_vt); + return G_SOURCE_CONTINUE; + } + + g_debug ("GdmLocalDisplayFactory: VT changed from %u to %u", + previous_vt, factory->priv->active_vt); + + /* if the old VT was running a wayland login screen kill it + */ + if (gdm_get_login_window_session_id ("seat0", &login_session_id)) { + unsigned int login_window_vt; + + ret = sd_session_get_vt (login_session_id, &login_window_vt); + if (ret == 0 && login_window_vt != 0) { + g_debug ("GdmLocalDisplayFactory: VT of login window is %u", login_window_vt); + if (login_window_vt == previous_vt) { + GdmDisplayStore *store; + GdmDisplay *display; + + g_debug ("GdmLocalDisplayFactory: VT switched from login window"); + + store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); + display = gdm_display_store_find (store, + lookup_by_session_id, + (gpointer) login_session_id); +- + if (display != NULL) + maybe_stop_greeter_in_background (factory, display); + } else { + g_debug ("GdmLocalDisplayFactory: VT not switched from login window"); + } + } + } + + /* if user jumped back to initial vt and it's empty put a login screen + * on it (unless a login screen is already running elsewhere, then + * jump to that login screen) + */ + if (factory->priv->active_vt != GDM_INITIAL_VT) { + g_debug ("GdmLocalDisplayFactory: active VT is not initial VT, so ignoring"); + return G_SOURCE_CONTINUE; + } + + if (gdm_local_display_factory_use_wayland ()) + session_type = "wayland"; + + g_debug ("GdmLocalDisplayFactory: creating new display on seat0 because of VT change"); + + create_display (factory, "seat0", session_type, TRUE); + + return G_SOURCE_CONTINUE; + } + #endif + + static void + gdm_local_display_factory_start_monitor (GdmLocalDisplayFactory *factory) +@@ -805,64 +812,60 @@ gdm_local_display_factory_start_monitor (GdmLocalDisplayFactory *factory) + g_object_unref); + + #if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER) + io_channel = g_io_channel_new_file ("/sys/class/tty/tty0/active", "r", NULL); + + if (io_channel != NULL) { + factory->priv->active_vt_watch_id = + g_io_add_watch (io_channel, + G_IO_PRI, + (GIOFunc) + on_vt_changed, + factory); + } + #endif + } + + static void + gdm_local_display_factory_stop_monitor (GdmLocalDisplayFactory *factory) + { + if (factory->priv->seat_new_id) { + g_dbus_connection_signal_unsubscribe (factory->priv->connection, + factory->priv->seat_new_id); + factory->priv->seat_new_id = 0; + } + if (factory->priv->seat_removed_id) { + g_dbus_connection_signal_unsubscribe (factory->priv->connection, + factory->priv->seat_removed_id); + factory->priv->seat_removed_id = 0; + } + #if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER) +- if (factory->priv->wait_to_finish_timeout_id != 0) { +- g_source_remove (factory->priv->wait_to_finish_timeout_id); +- factory->priv->wait_to_finish_timeout_id = 0; +- } + if (factory->priv->active_vt_watch_id) { + g_source_remove (factory->priv->active_vt_watch_id); + factory->priv->active_vt_watch_id = 0; + } + #endif + } + + static void + on_display_added (GdmDisplayStore *display_store, + const char *id, + GdmLocalDisplayFactory *factory) + { + GdmDisplay *display; + + display = gdm_display_store_lookup (display_store, id); + + if (display != NULL) { + g_signal_connect_object (display, "notify::status", + G_CALLBACK (on_display_status_changed), + factory, + 0); + + g_object_weak_ref (G_OBJECT (display), (GWeakNotify)on_display_disposed, factory); + } + } + + static void + on_display_removed (GdmDisplayStore *display_store, + GdmDisplay *display, + GdmLocalDisplayFactory *factory) +diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c +index 5b76ba129..540a2534d 100644 +--- a/daemon/gdm-session.c ++++ b/daemon/gdm-session.c +@@ -2849,132 +2849,139 @@ on_start_program_cb (GdmDBusWorker *worker, + + self = conversation->session; + service_name = conversation->service_name; + + if (worked) { + self->priv->session_pid = pid; + self->priv->session_conversation = conversation; + + g_debug ("GdmSession: Emitting 'session-started' signal with pid '%d'", pid); + g_signal_emit (self, signals[SESSION_STARTED], 0, service_name, pid); + } else { + gdm_session_stop_conversation (self, service_name); + + g_debug ("GdmSession: Emitting 'session-start-failed' signal"); + g_signal_emit (self, signals[SESSION_START_FAILED], 0, service_name, error->message); + } + } + + void + gdm_session_start_session (GdmSession *self, + const char *service_name) + { + GdmSessionConversation *conversation; + GdmSessionDisplayMode display_mode; + gboolean is_x11 = TRUE; + gboolean run_launcher = FALSE; + gboolean allow_remote_connections = FALSE; + gboolean run_separate_bus = FALSE; + char *command; + char *program; ++ gboolean register_session; + + g_return_if_fail (GDM_IS_SESSION (self)); + g_return_if_fail (self->priv->session_conversation == NULL); + + conversation = find_conversation_by_name (self, service_name); + + if (conversation == NULL) { + g_warning ("GdmSession: Tried to start session of " + "nonexistent conversation %s", service_name); + return; + } + + stop_all_other_conversations (self, conversation, FALSE); + + display_mode = gdm_session_get_display_mode (self); + + #ifdef ENABLE_WAYLAND_SUPPORT + is_x11 = g_strcmp0 (self->priv->session_type, "wayland") != 0; + #endif + + if (display_mode == GDM_SESSION_DISPLAY_MODE_LOGIND_MANAGED || + display_mode == GDM_SESSION_DISPLAY_MODE_NEW_VT) { + run_launcher = TRUE; + } + + if (g_strcmp0 (self->priv->display_seat_id, "seat0") != 0 && !run_launcher) { + run_separate_bus = TRUE; + } + ++ register_session = !gdm_session_session_registers (self); ++ + if (self->priv->selected_program == NULL) { + gboolean run_xsession_script; + + command = get_session_command (self); + + run_xsession_script = !gdm_session_bypasses_xsession (self); + + if (self->priv->display_is_local) { + gboolean disallow_tcp = TRUE; + gdm_settings_direct_get_boolean (GDM_KEY_DISALLOW_TCP, &disallow_tcp); + allow_remote_connections = !disallow_tcp; + } else { + allow_remote_connections = TRUE; + } + + if (run_launcher) { + if (is_x11) { +- program = g_strdup_printf (LIBEXECDIR "/gdm-x-session %s %s\"%s\"", ++ program = g_strdup_printf (LIBEXECDIR "/gdm-x-session %s%s %s\"%s\"", ++ register_session ? "--register-session " : "", + run_xsession_script? "--run-script " : "", + allow_remote_connections? "--allow-remote-connections " : "", + command); + } else { +- program = g_strdup_printf (LIBEXECDIR "/gdm-wayland-session \"%s\"", ++ program = g_strdup_printf (LIBEXECDIR "/gdm-wayland-session %s\"%s\"", ++ register_session ? "--register-session " : "", + command); + } + } else if (run_xsession_script) { + if (run_separate_bus) { + program = g_strdup_printf ("dbus-run-session -- " GDMCONFDIR "/Xsession \"%s\"", command); + } else { + program = g_strdup_printf (GDMCONFDIR "/Xsession \"%s\"", command); + } + } else { + program = g_strdup (command); + } + + g_free (command); + } else { + if (run_launcher) { + if (is_x11) { +- program = g_strdup_printf (LIBEXECDIR "/gdm-x-session \"%s\"", ++ program = g_strdup_printf (LIBEXECDIR "/gdm-x-session %s\"%s\"", ++ register_session ? "--register-session " : "", + self->priv->selected_program); + } else { +- program = g_strdup_printf (LIBEXECDIR "/gdm-wayland-session \"%s\"", ++ program = g_strdup_printf (LIBEXECDIR "/gdm-wayland-session %s\"%s\"", ++ register_session ? "--register-session " : "", + self->priv->selected_program); + } + } else { + if (run_separate_bus) { + program = g_strdup_printf ("dbus-run-session -- %s", + self->priv->selected_program); + } else { + program = g_strdup (self->priv->selected_program); + } + } + } + + set_up_session_environment (self); + send_environment (self, conversation); + + gdm_dbus_worker_call_start_program (conversation->worker_proxy, + program, + conversation->worker_cancellable, + (GAsyncReadyCallback) on_start_program_cb, + conversation); + g_free (program); + } + + static void + stop_all_conversations (GdmSession *self) + { + stop_all_other_conversations (self, NULL, TRUE); + } + + static void +@@ -3199,60 +3206,92 @@ gdm_session_is_wayland_session (GdmSession *self) + } + + if (full_path != NULL && strstr (full_path, "/wayland-sessions/") != NULL) { + is_wayland_session = TRUE; + } + } + + out: + g_debug ("GdmSession: checking if file '%s' is wayland session: %s", filename, is_wayland_session? "yes" : "no"); + + return is_wayland_session; + } + #endif + + static void + update_session_type (GdmSession *self) + { + #ifdef ENABLE_WAYLAND_SUPPORT + gboolean is_wayland_session = FALSE; + + is_wayland_session = gdm_session_is_wayland_session (self); + + if (is_wayland_session) { + set_session_type (self, "wayland"); + } else { + set_session_type (self, NULL); + } + #endif + } + ++gboolean ++gdm_session_session_registers (GdmSession *self) ++{ ++ g_autoptr(GError) error = NULL; ++ g_autoptr(GKeyFile) key_file = NULL; ++ gboolean session_registers = FALSE; ++ g_autofree char *filename = NULL; ++ ++ g_return_val_if_fail (self != NULL, FALSE); ++ g_return_val_if_fail (GDM_IS_SESSION (self), FALSE); ++ ++ filename = get_session_filename (self); ++ ++ key_file = load_key_file_for_file (self, filename, NULL, NULL); ++ ++ session_registers = g_key_file_get_boolean (key_file, ++ G_KEY_FILE_DESKTOP_GROUP, ++ "X-GDM-SessionRegisters", ++ &error); ++ if (!session_registers && ++ error != NULL && ++ !g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) { ++ g_warning ("GdmSession: Couldn't read session file '%s'", filename); ++ return FALSE; ++ } ++ ++ g_debug ("GdmSession: '%s' %s self", filename, ++ session_registers ? "registers" : "does not register"); ++ ++ return session_registers; ++} ++ + gboolean + gdm_session_bypasses_xsession (GdmSession *self) + { + GError *error; + GKeyFile *key_file; + gboolean res; + gboolean bypasses_xsession = FALSE; + char *filename = NULL; + + g_return_val_if_fail (self != NULL, FALSE); + g_return_val_if_fail (GDM_IS_SESSION (self), FALSE); + + #ifdef ENABLE_WAYLAND_SUPPORT + if (gdm_session_is_wayland_session (self)) { + bypasses_xsession = TRUE; + goto out; + } + #endif + + filename = get_session_filename (self); + + key_file = load_key_file_for_file (self, filename, "x11", NULL); + + error = NULL; + res = g_key_file_has_key (key_file, G_KEY_FILE_DESKTOP_GROUP, "X-GDM-BypassXsession", NULL); + if (!res) { + goto out; + } else { + bypasses_xsession = g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, "X-GDM-BypassXsession", &error); + if (error) { +diff --git a/daemon/gdm-session.h b/daemon/gdm-session.h +index a22c09543..682d2c99f 100644 +--- a/daemon/gdm-session.h ++++ b/daemon/gdm-session.h +@@ -108,60 +108,61 @@ typedef struct + void (* conversation_started) (GdmSession *session, + const char *service_name); + void (* conversation_stopped) (GdmSession *session, + const char *service_name); + void (* setup_complete) (GdmSession *session, + const char *service_name); + } GdmSessionClass; + + GType gdm_session_get_type (void); + + GdmSession *gdm_session_new (GdmSessionVerificationMode verification_mode, + uid_t allowed_user, + const char *display_name, + const char *display_hostname, + const char *display_device, + const char *display_seat_id, + const char *display_x11_authority_file, + gboolean display_is_local, + const char * const *environment); + uid_t gdm_session_get_allowed_user (GdmSession *session); + void gdm_session_start_reauthentication (GdmSession *session, + GPid pid_of_caller, + uid_t uid_of_caller); + + const char *gdm_session_get_server_address (GdmSession *session); + const char *gdm_session_get_username (GdmSession *session); + const char *gdm_session_get_display_device (GdmSession *session); + const char *gdm_session_get_display_seat_id (GdmSession *session); + const char *gdm_session_get_session_id (GdmSession *session); + gboolean gdm_session_bypasses_xsession (GdmSession *session); ++gboolean gdm_session_session_registers (GdmSession *session); + GdmSessionDisplayMode gdm_session_get_display_mode (GdmSession *session); + + #ifdef ENABLE_WAYLAND_SUPPORT + void gdm_session_set_ignore_wayland (GdmSession *session, + gboolean ignore_wayland); + #endif + gboolean gdm_session_start_conversation (GdmSession *session, + const char *service_name); + void gdm_session_stop_conversation (GdmSession *session, + const char *service_name); + const char *gdm_session_get_conversation_session_id (GdmSession *session, + const char *service_name); + void gdm_session_setup (GdmSession *session, + const char *service_name); + void gdm_session_setup_for_user (GdmSession *session, + const char *service_name, + const char *username); + void gdm_session_setup_for_program (GdmSession *session, + const char *service_name, + const char *username, + const char *log_file); + void gdm_session_set_environment_variable (GdmSession *session, + const char *key, + const char *value); + void gdm_session_send_environment (GdmSession *self, + const char *service_name); + void gdm_session_reset (GdmSession *session); + void gdm_session_cancel (GdmSession *session); + void gdm_session_authenticate (GdmSession *session, + const char *service_name); +diff --git a/daemon/gdm-wayland-session.c b/daemon/gdm-wayland-session.c +index 94f49e19c..35679b194 100644 +--- a/daemon/gdm-wayland-session.c ++++ b/daemon/gdm-wayland-session.c +@@ -18,68 +18,71 @@ + * 02110-1301, USA. + */ + #include "config.h" + + #include + #include + + #include "gdm-common.h" + #include "gdm-settings-direct.h" + #include "gdm-settings-keys.h" + #include "gdm-log.h" + + #include "gdm-manager-glue.h" + + #include + #include + #include + #include + + #include + + #define BUS_ADDRESS_FILENO (STDERR_FILENO + 1) + + typedef struct + { + GdmSettings *settings; + GCancellable *cancellable; + + GSubprocess *bus_subprocess; + GDBusConnection *bus_connection; ++ GdmDBusManager *display_manager_proxy; + char *bus_address; + + char **environment; + + GSubprocess *session_subprocess; + char *session_command; + int session_exit_status; + ++ guint register_session_id; ++ + GMainLoop *main_loop; + + guint32 debug_enabled : 1; + } State; + + static void + on_bus_finished (GSubprocess *subprocess, + GAsyncResult *result, + State *state) + { + gboolean cancelled; + + cancelled = !g_subprocess_wait_finish (subprocess, result, NULL); + + if (cancelled) { + goto out; + } + + if (g_subprocess_get_if_exited (subprocess)) { + int exit_status; + + exit_status = g_subprocess_get_exit_status (subprocess); + + g_debug ("message bus exited with status %d", exit_status); + } else { + int signal_number; + + signal_number = g_subprocess_get_term_sig (subprocess); + g_debug ("message bus was killed with status %d", signal_number); + } +@@ -358,140 +361,170 @@ out: + } + + static void + signal_subprocesses (State *state) + { + if (state->session_subprocess != NULL) { + g_subprocess_send_signal (state->session_subprocess, SIGTERM); + } + + if (state->bus_subprocess != NULL) { + g_subprocess_send_signal (state->bus_subprocess, SIGTERM); + } + } + + static void + wait_on_subprocesses (State *state) + { + if (state->bus_subprocess != NULL) { + g_subprocess_wait (state->bus_subprocess, NULL, NULL); + } + + if (state->session_subprocess != NULL) { + g_subprocess_wait (state->session_subprocess, NULL, NULL); + } + } + + static gboolean + register_display (State *state, + GCancellable *cancellable) + { +- GdmDBusManager *manager = NULL; + GError *error = NULL; + gboolean registered = FALSE; + GVariantBuilder details; + +- manager = gdm_dbus_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, +- G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | +- G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, +- "org.gnome.DisplayManager", +- "/org/gnome/DisplayManager/Manager", +- cancellable, +- &error); +- +- if (!manager) { +- g_debug ("could not contact display manager: %s", error->message); +- g_error_free (error); +- goto out; +- } +- + g_variant_builder_init (&details, G_VARIANT_TYPE ("a{ss}")); + g_variant_builder_add (&details, "{ss}", "session-type", "wayland"); + +- registered = gdm_dbus_manager_call_register_display_sync (manager, ++ registered = gdm_dbus_manager_call_register_display_sync (state->display_manager_proxy, + g_variant_builder_end (&details), + cancellable, + &error); + if (error != NULL) { + g_debug ("Could not register display: %s", error->message); + g_error_free (error); + } + +-out: +- g_clear_object (&manager); + return registered; + } + + static void + init_state (State **state) + { + static State state_allocation; + + *state = &state_allocation; + } + + static void + clear_state (State **out_state) + { + State *state = *out_state; + + g_clear_object (&state->cancellable); + g_clear_object (&state->bus_connection); + g_clear_object (&state->session_subprocess); + g_clear_pointer (&state->environment, g_strfreev); + g_clear_pointer (&state->main_loop, g_main_loop_unref); ++ g_clear_handle_id (&state->register_session_id, g_source_remove); + *out_state = NULL; + } + + static gboolean + on_sigterm (State *state) + { + g_cancellable_cancel (state->cancellable); + + if (g_main_loop_is_running (state->main_loop)) { + g_main_loop_quit (state->main_loop); + } + + return G_SOURCE_CONTINUE; + } + ++static gboolean ++register_session_timeout_cb (gpointer user_data) ++{ ++ State *state; ++ GError *error = NULL; ++ ++ state = (State *) user_data; ++ ++ gdm_dbus_manager_call_register_session_sync (state->display_manager_proxy, ++ g_variant_new ("a{sv}", NULL), ++ state->cancellable, ++ &error); ++ ++ if (error != NULL) { ++ g_warning ("Could not register session: %s", error->message); ++ g_error_free (error); ++ } ++ ++ return G_SOURCE_REMOVE; ++} ++ ++static gboolean ++connect_to_display_manager (State *state) ++{ ++ g_autoptr (GError) error = NULL; ++ ++ state->display_manager_proxy = gdm_dbus_manager_proxy_new_for_bus_sync ( ++ G_BUS_TYPE_SYSTEM, ++ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, ++ "org.gnome.DisplayManager", ++ "/org/gnome/DisplayManager/Manager", ++ state->cancellable, ++ &error); ++ ++ if (state->display_manager_proxy == NULL) { ++ g_printerr ("gdm-wayland-session: could not contact display manager: %s\n", ++ error->message); ++ return FALSE; ++ } ++ ++ return TRUE; ++} ++ + int + main (int argc, + char **argv) + { + State *state = NULL; + GOptionContext *context = NULL; + static char **args = NULL; + gboolean debug = FALSE; + gboolean ret; + int exit_status = EX_OK; ++ static gboolean register_session = FALSE; ++ + static GOptionEntry entries [] = { ++ { "register-session", 0, 0, G_OPTION_ARG_NONE, ®ister_session, "Register session after a delay", NULL }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &args, "", "" }, + { NULL } + }; + + bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); + textdomain (GETTEXT_PACKAGE); + setlocale (LC_ALL, ""); + + gdm_log_init (); + + context = g_option_context_new (_("GNOME Display Manager Wayland Session Launcher")); + g_option_context_add_main_entries (context, entries, NULL); + + g_option_context_parse (context, &argc, &argv, NULL); + g_option_context_free (context); + + if (args == NULL || args[0] == NULL || args[1] != NULL) { + g_warning ("gdm-wayland-session takes one argument (the session)"); + exit_status = EX_USAGE; + goto out; + } + + init_state (&state); + + state->session_command = args[0]; + + state->settings = gdm_settings_new (); + ret = gdm_settings_direct_init (state->settings, DATADIR "/gdm/gdm.schemas", "/"); + + if (!ret) { +@@ -501,55 +534,67 @@ main (int argc, + } + + gdm_settings_direct_get_boolean (GDM_KEY_DEBUG, &debug); + state->debug_enabled = debug; + + gdm_log_set_debug (debug); + + state->main_loop = g_main_loop_new (NULL, FALSE); + state->cancellable = g_cancellable_new (); + + g_unix_signal_add (SIGTERM, (GSourceFunc) on_sigterm, state); + + ret = spawn_bus (state, state->cancellable); + + if (!ret) { + g_printerr ("Unable to run session message bus\n"); + exit_status = EX_SOFTWARE; + goto out; + } + + import_environment (state, state->cancellable); + + ret = spawn_session (state, state->cancellable); + + if (!ret) { + g_printerr ("Unable to run session\n"); + exit_status = EX_SOFTWARE; + goto out; + } + ++ if (!connect_to_display_manager (state)) ++ goto out; ++ + ret = register_display (state, state->cancellable); + + if (!ret) { + g_printerr ("Unable to register display with display manager\n"); + exit_status = EX_SOFTWARE; + goto out; + } + ++ if (register_session) { ++ g_debug ("gdm-wayland-session: Will register session in %d seconds", REGISTER_SESSION_TIMEOUT); ++ state->register_session_id = g_timeout_add_seconds (REGISTER_SESSION_TIMEOUT, ++ register_session_timeout_cb, ++ state); ++ } else { ++ g_debug ("gdm-wayland-session: Session will register itself"); ++ } ++ + g_main_loop_run (state->main_loop); + + /* Only use exit status of session if we're here because it exit */ + + if (state->session_subprocess == NULL) { + exit_status = state->session_exit_status; + } + + out: + if (state != NULL) { + signal_subprocesses (state); + wait_on_subprocesses (state); + clear_state (&state); + } + + return exit_status; + } +diff --git a/daemon/gdm-x-session.c b/daemon/gdm-x-session.c +index d8e3c7d53..f0082fdc6 100644 +--- a/daemon/gdm-x-session.c ++++ b/daemon/gdm-x-session.c +@@ -24,68 +24,71 @@ + + #include "gdm-common.h" + #include "gdm-settings-direct.h" + #include "gdm-settings-keys.h" + #include "gdm-log.h" + + #include "gdm-manager-glue.h" + + #include + #include + #include + #include + #include + #include + #include + + #define DISPLAY_FILENO (STDERR_FILENO + 1) + #define BUS_ADDRESS_FILENO (DISPLAY_FILENO + 1) + + typedef struct + { + GdmSettings *settings; + GCancellable *cancellable; + + GSubprocess *x_subprocess; + char *auth_file; + char *display_name; + + GSubprocess *bus_subprocess; + GDBusConnection *bus_connection; ++ GdmDBusManager *display_manager_proxy; + char *bus_address; + + char **environment; + + GSubprocess *session_subprocess; + char *session_command; + int session_exit_status; + ++ guint register_session_id; ++ + GMainLoop *main_loop; + + guint32 debug_enabled : 1; + } State; + + static FILE * + create_auth_file (char **filename) + { + char *auth_dir = NULL; + char *auth_file = NULL; + int fd; + FILE *fp = NULL; + + auth_dir = g_build_filename (g_get_user_runtime_dir (), + "gdm", + NULL); + + g_mkdir_with_parents (auth_dir, 0711); + auth_file = g_build_filename (auth_dir, "Xauthority", NULL); + g_clear_pointer (&auth_dir, g_free); + + fd = g_open (auth_file, O_RDWR | O_CREAT | O_TRUNC, 0700); + + if (fd < 0) { + g_debug ("could not open %s to store auth cookie: %m", + auth_file); + g_clear_pointer (&auth_file, g_free); + goto out; + } + +@@ -711,148 +714,178 @@ signal_subprocesses (State *state) + + if (state->bus_subprocess != NULL) { + g_subprocess_send_signal (state->bus_subprocess, SIGTERM); + } + + if (state->x_subprocess != NULL) { + g_subprocess_send_signal (state->x_subprocess, SIGTERM); + } + } + + static void + wait_on_subprocesses (State *state) + { + if (state->x_subprocess != NULL) { + g_subprocess_wait (state->x_subprocess, NULL, NULL); + } + + if (state->bus_subprocess != NULL) { + g_subprocess_wait (state->bus_subprocess, NULL, NULL); + } + + if (state->session_subprocess != NULL) { + g_subprocess_wait (state->session_subprocess, NULL, NULL); + } + } + + static gboolean + register_display (State *state, + GCancellable *cancellable) + { +- GdmDBusManager *manager = NULL; + GError *error = NULL; + gboolean registered = FALSE; + GVariantBuilder details; + +- manager = gdm_dbus_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, +- G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | +- G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, +- "org.gnome.DisplayManager", +- "/org/gnome/DisplayManager/Manager", +- cancellable, +- &error); +- +- if (!manager) { +- g_debug ("could not contact display manager: %s", error->message); +- g_error_free (error); +- goto out; +- } +- + g_variant_builder_init (&details, G_VARIANT_TYPE ("a{ss}")); + g_variant_builder_add (&details, "{ss}", "session-type", "x11"); + g_variant_builder_add (&details, "{ss}", "x11-display-name", state->display_name); + +- registered = gdm_dbus_manager_call_register_display_sync (manager, ++ registered = gdm_dbus_manager_call_register_display_sync (state->display_manager_proxy, + g_variant_builder_end (&details), + cancellable, + &error); + if (error != NULL) { + g_debug ("Could not register display: %s", error->message); + g_error_free (error); + } + +-out: +- g_clear_object (&manager); + return registered; + } + + static void + init_state (State **state) + { + static State state_allocation; + + *state = &state_allocation; + } + + static void + clear_state (State **out_state) + { + State *state = *out_state; + + g_clear_object (&state->cancellable); + g_clear_object (&state->bus_connection); + g_clear_object (&state->session_subprocess); + g_clear_object (&state->x_subprocess); + g_clear_pointer (&state->environment, g_strfreev); + g_clear_pointer (&state->auth_file, g_free); + g_clear_pointer (&state->display_name, g_free); + g_clear_pointer (&state->main_loop, g_main_loop_unref); ++ g_clear_handle_id (&state->register_session_id, g_source_remove); + *out_state = NULL; + } + + static gboolean + on_sigterm (State *state) + { + g_cancellable_cancel (state->cancellable); + + if (g_main_loop_is_running (state->main_loop)) { + g_main_loop_quit (state->main_loop); + } + + return G_SOURCE_CONTINUE; + } + ++static gboolean ++register_session_timeout_cb (gpointer user_data) ++{ ++ State *state; ++ GError *error = NULL; ++ ++ state = (State *) user_data; ++ ++ gdm_dbus_manager_call_register_session_sync (state->display_manager_proxy, ++ g_variant_new ("a{sv}", NULL), ++ state->cancellable, ++ &error); ++ ++ if (error != NULL) { ++ g_warning ("Could not register session: %s", error->message); ++ g_error_free (error); ++ } ++ ++ return G_SOURCE_REMOVE; ++} ++ ++static gboolean ++connect_to_display_manager (State *state) ++{ ++ g_autoptr (GError) error = NULL; ++ ++ state->display_manager_proxy = gdm_dbus_manager_proxy_new_for_bus_sync ( ++ G_BUS_TYPE_SYSTEM, ++ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, ++ "org.gnome.DisplayManager", ++ "/org/gnome/DisplayManager/Manager", ++ state->cancellable, ++ &error); ++ ++ if (state->display_manager_proxy == NULL) { ++ g_printerr ("gdm-x-session: could not contact display manager: %s\n", ++ error->message); ++ return FALSE; ++ } ++ ++ return TRUE; ++} ++ + int + main (int argc, + char **argv) + { + State *state = NULL; + GOptionContext *context = NULL; + static char **args = NULL; + static gboolean run_script = FALSE; + static gboolean allow_remote_connections = FALSE; + gboolean debug = FALSE; + gboolean ret; + int exit_status = EX_OK; ++ static gboolean register_session = FALSE; ++ + static GOptionEntry entries [] = { + { "run-script", 'r', 0, G_OPTION_ARG_NONE, &run_script, N_("Run program through /etc/gdm/Xsession wrapper script"), NULL }, + { "allow-remote-connections", 'a', 0, G_OPTION_ARG_NONE, &allow_remote_connections, N_("Listen on TCP socket"), NULL }, ++ { "register-session", 0, 0, G_OPTION_ARG_NONE, ®ister_session, "Register session after a delay", NULL }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &args, "", "" }, + { NULL } + }; + + bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); + textdomain (GETTEXT_PACKAGE); + setlocale (LC_ALL, ""); + + gdm_log_init (); + + context = g_option_context_new (_("GNOME Display Manager X Session Launcher")); + g_option_context_add_main_entries (context, entries, NULL); + + g_option_context_parse (context, &argc, &argv, NULL); + g_option_context_free (context); + + if (args == NULL || args[0] == NULL || args[1] != NULL) { + g_warning ("gdm-x-session takes one argument (the session)"); + exit_status = EX_USAGE; + goto out; + } + + init_state (&state); + + state->session_command = args[0]; + + state->settings = gdm_settings_new (); + ret = gdm_settings_direct_init (state->settings, DATADIR "/gdm/gdm.schemas", "/"); + + if (!ret) { +@@ -870,63 +903,75 @@ main (int argc, + state->cancellable = g_cancellable_new (); + + g_unix_signal_add (SIGTERM, (GSourceFunc) on_sigterm, state); + + ret = spawn_x_server (state, allow_remote_connections, state->cancellable); + + if (!ret) { + g_printerr ("Unable to run X server\n"); + exit_status = EX_SOFTWARE; + goto out; + } + + ret = spawn_bus (state, state->cancellable); + + if (!ret) { + g_printerr ("Unable to run session message bus\n"); + exit_status = EX_SOFTWARE; + goto out; + } + + import_environment (state, state->cancellable); + + ret = update_bus_environment (state, state->cancellable); + + if (!ret) { + g_printerr ("Unable to update bus environment\n"); + exit_status = EX_SOFTWARE; + goto out; + } + ++ if (!connect_to_display_manager (state)) ++ goto out; ++ + ret = register_display (state, state->cancellable); + + if (!ret) { + g_printerr ("Unable to register display with display manager\n"); + exit_status = EX_SOFTWARE; + goto out; + } + + ret = spawn_session (state, run_script, state->cancellable); + + if (!ret) { + g_printerr ("Unable to run session\n"); + exit_status = EX_SOFTWARE; + goto out; + } + ++ if (register_session) { ++ g_debug ("gdm-x-session: Will register session in %d seconds", REGISTER_SESSION_TIMEOUT); ++ state->register_session_id = g_timeout_add_seconds (REGISTER_SESSION_TIMEOUT, ++ register_session_timeout_cb, ++ state); ++ } else { ++ g_debug ("gdm-x-session: Session will register itself"); ++ } ++ + g_main_loop_run (state->main_loop); + + /* Only use exit status of session if we're here because it exit */ + + if (state->session_subprocess == NULL) { + exit_status = state->session_exit_status; + } + + out: + if (state != NULL) { + signal_subprocesses (state); + wait_on_subprocesses (state); + clear_state (&state); + } + + return exit_status; + } +-- +2.27.0 + diff --git a/SOURCES/0051-display-Handle-failure-before-display-registration.patch b/SOURCES/0051-display-Handle-failure-before-display-registration.patch new file mode 100644 index 0000000..1e4c7c0 --- /dev/null +++ b/SOURCES/0051-display-Handle-failure-before-display-registration.patch @@ -0,0 +1,173 @@ +From f6a8a36717afc7ce00bdb2305a6219c28abc36fb Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 1 Sep 2020 13:49:27 -0400 +Subject: [PATCH 51/51] display: Handle failure before display registration + +Normally, e.g., gdm-wayland-session would register its display +before starting the session. This display registration is how +the display moves to the "managed" state. We currently detect +session failure in gdm_display_unmanage. If gdm-wayland-session +is killed before it registers the display, gdm_display_unmanage +won't run, and failure won't be detected. + +This commit make gdm_display_unmanage get called, even if the +display isn't yet fully managed. +--- + daemon/gdm-display.c | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c +index ae20491cd..b8ccbbd72 100644 +--- a/daemon/gdm-display.c ++++ b/daemon/gdm-display.c +@@ -575,80 +575,79 @@ gdm_display_disconnect (GdmDisplay *self) + return; + } + + setup = xcb_get_setup (self->priv->xcb_connection); + + /* resource_id_mask is the bits given to each client for + * addressing resources */ + highest_client = (XID) ~unused_bits & ~setup->resource_id_mask; + client_increment = setup->resource_id_mask + 1; + + /* Kill every client but ourselves, then close our own connection + */ + for (client = 0; + client <= highest_client; + client += client_increment) { + + if (client != setup->resource_id_base) + xcb_kill_client (self->priv->xcb_connection, client); + } + + xcb_flush (self->priv->xcb_connection); + + g_clear_pointer (&self->priv->xcb_connection, xcb_disconnect); + } + + gboolean + gdm_display_unmanage (GdmDisplay *self) + { + g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE); + +- g_debug ("GdmDisplay: unmanage display"); +- + gdm_display_disconnect (self); + + if (self->priv->user_access_file != NULL) { + gdm_display_access_file_close (self->priv->user_access_file); + g_object_unref (self->priv->user_access_file); + self->priv->user_access_file = NULL; + } + + if (self->priv->access_file != NULL) { + gdm_display_access_file_close (self->priv->access_file); + g_object_unref (self->priv->access_file); + self->priv->access_file = NULL; + } + + if (!self->priv->session_registered) { + g_warning ("GdmDisplay: Session never registered, failing"); + _gdm_display_set_status (self, GDM_DISPLAY_FAILED); + } else { ++ g_debug ("GdmDisplay: Unmanage display"); + _gdm_display_set_status (self, GDM_DISPLAY_UNMANAGED); + } + + return TRUE; + } + + gboolean + gdm_display_get_id (GdmDisplay *self, + char **id, + GError **error) + { + g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE); + + if (id != NULL) { + *id = g_strdup (self->priv->id); + } + + return TRUE; + } + + gboolean + gdm_display_get_x11_display_name (GdmDisplay *self, + char **x11_display, + GError **error) + { + g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE); + + if (x11_display != NULL) { + *x11_display = g_strdup (self->priv->x11_display_name); + } +@@ -1309,63 +1308,62 @@ gdm_display_finalize (GObject *object) + + GDBusObjectSkeleton * + gdm_display_get_object_skeleton (GdmDisplay *self) + { + return self->priv->object_skeleton; + } + + static void + on_launch_environment_session_opened (GdmLaunchEnvironment *launch_environment, + GdmDisplay *self) + { + char *session_id; + + g_debug ("GdmDisplay: Greeter session opened"); + session_id = gdm_launch_environment_get_session_id (launch_environment); + _gdm_display_set_session_id (self, session_id); + g_free (session_id); + } + + static void + on_launch_environment_session_started (GdmLaunchEnvironment *launch_environment, + GdmDisplay *self) + { + g_debug ("GdmDisplay: Greeter started"); + } + + static void + self_destruct (GdmDisplay *self) + { + g_object_ref (self); +- if (gdm_display_get_status (self) == GDM_DISPLAY_MANAGED) { +- gdm_display_unmanage (self); +- } ++ g_debug ("GdmDisplay: initiating display self-destruct"); ++ gdm_display_unmanage (self); + + if (gdm_display_get_status (self) != GDM_DISPLAY_FINISHED) { + queue_finish (self); + } + g_object_unref (self); + } + + static void + on_launch_environment_session_stopped (GdmLaunchEnvironment *launch_environment, + GdmDisplay *self) + { + g_debug ("GdmDisplay: Greeter stopped"); + self_destruct (self); + } + + static void + on_launch_environment_session_exited (GdmLaunchEnvironment *launch_environment, + int code, + GdmDisplay *self) + { + g_debug ("GdmDisplay: Greeter exited: %d", code); + self_destruct (self); + } + + static void + on_launch_environment_session_died (GdmLaunchEnvironment *launch_environment, + int signal, + GdmDisplay *self) + { + g_debug ("GdmDisplay: Greeter died: %d", signal); +-- +2.27.0 + diff --git a/SPECS/gdm.spec b/SPECS/gdm.spec index a3a8d3e..e716a26 100644 --- a/SPECS/gdm.spec +++ b/SPECS/gdm.spec @@ -10,7 +10,7 @@ Name: gdm Epoch: 1 Version: 3.28.3 -Release: 32%{?dist} +Release: 33%{?dist} Summary: The GNOME Display Manager License: GPLv2+ @@ -106,6 +106,9 @@ Patch200045: 0045-local-display-factory-Always-force-login-screen-to-V.patch Patch200046: 0046-gdm-x-session-tell-x-server-to-not-vt-switch.patch Patch200047: 0047-local-display-factory-kill-X-on-login-just-like-wayl.patch Patch200048: 0048-manager-don-t-kill-initial-setup-right-away-with-Xor.patch +Patch200049: 0049-GdmManager-GdmDisplay-Add-RegisterSession-method.patch +Patch200050: 0050-Allow-sessions-to-register-with-GDM.patch +Patch200051: 0051-display-Handle-failure-before-display-registration.patch Patch900001: 0001-data-add-system-dconf-databases-to-gdm-profile.patch @@ -412,6 +415,10 @@ fi %{_libdir}/pkgconfig/gdm-pam-extensions.pc %changelog +* Tue Sep 01 2020 Ray Strode - 3.28.3-33 +- Fix problem with Xorg fallback + Resolves: #1868260 + * Tue Aug 11 2020 Ray Strode - 3.28.3-32 - Add dconf db to file manifest Related: #1833158