282 lines
8.9 KiB
Plaintext
282 lines
8.9 KiB
Plaintext
$OpenBSD: patch-daemon_gdm-server_c,v 1.12 2019/05/08 21:58:04 ajacoutot Exp $
|
|
|
|
REVERT - OpenBSD lacks sigwaitinfo(2)
|
|
From 956d7d1c7a0cfbf2beacdb9e88e645e15ad32047 Mon Sep 17 00:00:00 2001
|
|
From: Jasper St. Pierre <jstpierre@mecheye.net>
|
|
Date: Fri, 14 Feb 2014 19:32:50 +0000
|
|
Subject: server: Process SIGUSR1 more carefully
|
|
|
|
REVERT - OpenBSD does not have a systemd implementation (we need ConsoleKit)
|
|
From 1ac67f522f5690c27023d98096ca817f12f7eb88 Mon Sep 17 00:00:00 2001
|
|
From: Ray Strode <rstrode@redhat.com>
|
|
Date: Fri, 12 Jun 2015 13:28:01 -0400
|
|
Subject: drop consolekit support
|
|
|
|
REVERT - OpenBSD does not have a systemd implementation (we need ConsoleKit)
|
|
From 9be58c9ec9a3a411492a5182ac4b0d51fdc3a323 Mon Sep 17 00:00:00 2001
|
|
From: Ray Strode <rstrode@redhat.com>
|
|
Date: Fri, 12 Jun 2015 13:48:52 -0400
|
|
Subject: require logind support
|
|
|
|
Index: daemon/gdm-server.c
|
|
--- daemon/gdm-server.c.orig 2020-05-04 20:11:25.000000000 +0000
|
|
+++ daemon/gdm-server.c
|
|
@@ -43,7 +43,9 @@
|
|
#include <linux/vt.h>
|
|
#endif
|
|
|
|
+#ifdef WITH_SYSTEMD
|
|
#include <systemd/sd-daemon.h>
|
|
+#endif
|
|
|
|
#ifdef ENABLE_SYSTEMD_JOURNAL
|
|
#include <systemd/sd-journal.h>
|
|
@@ -84,6 +86,7 @@ struct _GdmServer
|
|
char *auth_file;
|
|
|
|
guint child_watch_id;
|
|
+ guint sigusr1_id;
|
|
|
|
gboolean is_initial;
|
|
};
|
|
@@ -114,90 +117,74 @@ static void gdm_server_finalize
|
|
|
|
G_DEFINE_TYPE (GdmServer, gdm_server, G_TYPE_OBJECT)
|
|
|
|
-char *
|
|
-gdm_server_get_display_device (GdmServer *server)
|
|
-{
|
|
- /* systemd finds the display device out on its own based on the display */
|
|
- return NULL;
|
|
-}
|
|
-
|
|
-static void
|
|
-gdm_server_ready (GdmServer *server)
|
|
+static char *
|
|
+_gdm_server_query_ck_for_display_device (GdmServer *server)
|
|
{
|
|
- g_debug ("GdmServer: Got USR1 from X server - emitting READY");
|
|
+ char *out;
|
|
+ char *command;
|
|
+ int status;
|
|
+ gboolean res;
|
|
+ GError *error;
|
|
+
|
|
+ g_return_val_if_fail (GDM_IS_SERVER (server), NULL);
|
|
+
|
|
+ error = NULL;
|
|
+ command = g_strdup_printf (CONSOLEKIT_DIR "/ck-get-x11-display-device --display %s",
|
|
+ server->display_name);
|
|
+
|
|
+ g_debug ("GdmServer: Running helper %s", command);
|
|
+ out = NULL;
|
|
+ res = g_spawn_command_line_sync (command,
|
|
+ &out,
|
|
+ NULL,
|
|
+ &status,
|
|
+ &error);
|
|
+ if (! res) {
|
|
+ g_warning ("Could not run helper: %s", error->message);
|
|
+ g_error_free (error);
|
|
+ } else {
|
|
+ out = g_strstrip (out);
|
|
+ g_debug ("GdmServer: Got tty: '%s'", out);
|
|
+ }
|
|
|
|
- gdm_run_script (GDMCONFDIR "/Init", GDM_USERNAME,
|
|
- server->display_name,
|
|
- NULL, /* hostname */
|
|
- server->auth_file);
|
|
+ g_free (command);
|
|
|
|
- g_signal_emit (server, signals[READY], 0);
|
|
+ return out;
|
|
}
|
|
|
|
-static GSList *active_servers;
|
|
-static gboolean sigusr1_thread_running;
|
|
-static GCond sigusr1_thread_cond;
|
|
-static GMutex sigusr1_thread_mutex;
|
|
-
|
|
-static gboolean
|
|
-got_sigusr1 (gpointer user_data)
|
|
+char *
|
|
+gdm_server_get_display_device (GdmServer *server)
|
|
{
|
|
- GPid pid = GPOINTER_TO_UINT (user_data);
|
|
- GSList *l;
|
|
-
|
|
- g_debug ("GdmServer: got SIGUSR1 from PID %d", pid);
|
|
-
|
|
- for (l = active_servers; l; l = l->next) {
|
|
- GdmServer *server = l->data;
|
|
-
|
|
- if (server->pid == pid)
|
|
- gdm_server_ready (server);
|
|
+#ifdef WITH_SYSTEMD
|
|
+ if (LOGIND_RUNNING()) {
|
|
+ /* systemd finds the display device out on its own based on the display */
|
|
+ return NULL;
|
|
}
|
|
+#endif
|
|
|
|
- return G_SOURCE_REMOVE;
|
|
-}
|
|
-
|
|
-static gpointer
|
|
-sigusr1_thread_main (gpointer user_data)
|
|
-{
|
|
- sigset_t sigusr1_mask;
|
|
-
|
|
- /* Handle only SIGUSR1 */
|
|
- sigemptyset (&sigusr1_mask);
|
|
- sigaddset (&sigusr1_mask, SIGUSR1);
|
|
- sigprocmask (SIG_SETMASK, &sigusr1_mask, NULL);
|
|
-
|
|
- g_mutex_lock (&sigusr1_thread_mutex);
|
|
- sigusr1_thread_running = TRUE;
|
|
- g_cond_signal (&sigusr1_thread_cond);
|
|
- g_mutex_unlock (&sigusr1_thread_mutex);
|
|
-
|
|
- /* Spin waiting for a SIGUSR1 */
|
|
- while (TRUE) {
|
|
- siginfo_t info;
|
|
-
|
|
- if (sigwaitinfo (&sigusr1_mask, &info) == -1)
|
|
- continue;
|
|
-
|
|
- g_idle_add (got_sigusr1, GUINT_TO_POINTER (info.si_pid));
|
|
+ if (server->display_device == NULL) {
|
|
+ server->display_device =
|
|
+ _gdm_server_query_ck_for_display_device (server);
|
|
+ g_object_notify (G_OBJECT (server), "display-device");
|
|
}
|
|
|
|
- return NULL;
|
|
+ return g_strdup (server->display_device);
|
|
}
|
|
|
|
-static void
|
|
-gdm_server_launch_sigusr1_thread_if_needed (void)
|
|
+static gboolean
|
|
+on_sigusr1 (gpointer user_data)
|
|
{
|
|
- static GThread *sigusr1_thread;
|
|
+ GdmServer *server = user_data;
|
|
|
|
- if (sigusr1_thread == NULL) {
|
|
- sigusr1_thread = g_thread_new ("gdm SIGUSR1 catcher", sigusr1_thread_main, NULL);
|
|
+ g_debug ("GdmServer: Got USR1 from X server - emitting READY");
|
|
|
|
- g_mutex_lock (&sigusr1_thread_mutex);
|
|
- while (!sigusr1_thread_running)
|
|
- g_cond_wait (&sigusr1_thread_cond, &sigusr1_thread_mutex);
|
|
- g_mutex_unlock (&sigusr1_thread_mutex);
|
|
- }
|
|
+ gdm_run_script (GDMCONFDIR "/Init", GDM_USERNAME,
|
|
+ server->display_name,
|
|
+ NULL, /* hostname */
|
|
+ server->auth_file);
|
|
+
|
|
+ g_signal_emit (server, signals[READY], 0);
|
|
+ return FALSE;
|
|
}
|
|
|
|
static void
|
|
@@ -218,7 +205,9 @@ gdm_server_init_command (GdmServer *serv
|
|
debug_options = "";
|
|
}
|
|
|
|
-#define X_SERVER_ARG_FORMAT " -background none -noreset -verbose %s%s"
|
|
+ #define X_SERVER_ARG_FORMAT " -background none -noreset -verbose %s%s"
|
|
+
|
|
+#ifdef WITH_SYSTEMD
|
|
|
|
/* This is a temporary hack to work around the fact that XOrg
|
|
* currently lacks support for multi-seat hotplugging for
|
|
@@ -234,6 +223,10 @@ gdm_server_init_command (GdmServer *serv
|
|
* wasn't booted using systemd, or b) the wrapper tool is
|
|
* missing, or c) we are running for the main seat 'seat0'. */
|
|
|
|
+ if (!LOGIND_RUNNING()) {
|
|
+ goto fallback;
|
|
+ }
|
|
+
|
|
#ifdef ENABLE_SYSTEMD_JOURNAL
|
|
/* For systemd, we don't have a log file but instead log to stdout,
|
|
so set it to the xserver's built-in default verbosity */
|
|
@@ -256,8 +249,8 @@ gdm_server_init_command (GdmServer *serv
|
|
return;
|
|
|
|
fallback:
|
|
+#endif
|
|
server->command = g_strdup_printf (X_SERVER X_SERVER_ARG_FORMAT, verbosity, debug_options);
|
|
-
|
|
}
|
|
|
|
static gboolean
|
|
@@ -307,10 +300,12 @@ gdm_server_resolve_command_line (GdmServ
|
|
argv[len++] = g_strdup (server->auth_file);
|
|
}
|
|
|
|
- if (server->display_seat_id != NULL) {
|
|
+#ifdef WITH_SYSTEMD
|
|
+ if (LOGIND_RUNNING() && server->priv->display_seat_id != NULL) {
|
|
argv[len++] = g_strdup ("-seat");
|
|
argv[len++] = g_strdup (server->display_seat_id);
|
|
}
|
|
+#endif
|
|
|
|
/* If we were compiled with Xserver >= 1.17 we need to specify
|
|
* '-listen tcp' as the X server dosen't listen on tcp sockets
|
|
@@ -655,12 +650,6 @@ server_child_watch (GPid pid,
|
|
g_object_unref (server);
|
|
}
|
|
|
|
-static void
|
|
-prune_active_servers_list (GdmServer *server)
|
|
-{
|
|
- active_servers = g_slist_remove (active_servers, server);
|
|
-}
|
|
-
|
|
static gboolean
|
|
gdm_server_spawn (GdmServer *server,
|
|
const char *vtarg,
|
|
@@ -698,15 +687,6 @@ gdm_server_spawn (GdmServer *server,
|
|
g_debug ("GdmServer: Starting X server process: %s", freeme);
|
|
g_free (freeme);
|
|
|
|
- active_servers = g_slist_append (active_servers, server);
|
|
-
|
|
- g_object_weak_ref (G_OBJECT (server),
|
|
- (GWeakNotify)
|
|
- prune_active_servers_list,
|
|
- server);
|
|
-
|
|
- gdm_server_launch_sigusr1_thread_if_needed ();
|
|
-
|
|
if (!g_spawn_async_with_pipes (NULL,
|
|
argv,
|
|
(char **)env->pdata,
|
|
@@ -1043,6 +1023,10 @@ gdm_server_init (GdmServer *server)
|
|
server->pid = -1;
|
|
|
|
server->log_dir = g_strdup (LOGDIR);
|
|
+
|
|
+ server->sigusr1_id = g_unix_signal_add (SIGUSR1,
|
|
+ on_sigusr1,
|
|
+ server);
|
|
}
|
|
|
|
static void
|
|
@@ -1055,6 +1039,9 @@ gdm_server_finalize (GObject *object)
|
|
|
|
server = GDM_SERVER (object);
|
|
|
|
+ if (server->sigusr1_id > 0)
|
|
+ g_source_remove (server->sigusr1_id);
|
|
+
|
|
gdm_server_stop (server);
|
|
|
|
g_free (server->command);
|