1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
|
--- daemon/gdm-server.c.orig 2022-01-28 21:55:35 UTC
+++ 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,9 @@ struct _GdmServer
char *auth_file;
guint child_watch_id;
+#ifndef HAVE_SIGWAITINFO
+ guint sigusr1_id;
+#endif
gboolean is_initial;
};
@@ -114,13 +119,60 @@ static void gdm_server_finalize (GObject
G_DEFINE_TYPE (GdmServer, gdm_server, G_TYPE_OBJECT)
+#ifdef WITH_CONSOLE_KIT
+static char *
+gdm_server_query_ck_for_display_device (GdmServer *server)
+{
+ 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 ("/usr/local/libexec/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);
+ }
+
+ g_free (command);
+
+ return out;
+}
+#endif
+
char *
gdm_server_get_display_device (GdmServer *server)
{
+#if defined(WITH_SYSTEMD)
/* systemd finds the display device out on its own based on the display */
return NULL;
+#elif defined(WITH_CONSOLE_KIT)
+ 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 g_strdup (server->display_device);
+#endif
}
+#ifdef HAVE_SIGWAITINFO
static void
gdm_server_ready (GdmServer *server)
{
@@ -133,7 +185,26 @@ gdm_server_ready (GdmServer *server)
g_signal_emit (server, signals[READY], 0);
}
+#else
+static gboolean
+gdm_server_ready (gpointer user_data)
+{
+ GdmServer *server = user_data;
+ g_debug ("GdmServer: Got USR1 from X server - emitting READY");
+
+ gdm_run_script (GDMCONFDIR "/Init", GDM_USERNAME,
+ server->display_name,
+ NULL, /* hostname */
+ server->auth_file);
+
+ g_signal_emit (server, signals[READY], 0);
+
+ return FALSE;
+}
+#endif
+
+#ifdef HAVE_SIGWAITINFO
static GSList *active_servers;
static gboolean sigusr1_thread_running;
static GCond sigusr1_thread_cond;
@@ -199,6 +270,7 @@ gdm_server_launch_sigusr1_thread_if_needed (void)
g_mutex_unlock (&sigusr1_thread_mutex);
}
}
+#endif
static void
gdm_server_init_command (GdmServer *server)
@@ -307,10 +379,12 @@ gdm_server_resolve_command_line (GdmServer *server,
argv[len++] = g_strdup (server->auth_file);
}
+#ifdef WITH_SYSTEMD
if (server->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
@@ -656,11 +730,13 @@ server_child_watch (GPid pid,
g_object_unref (server);
}
+#ifdef HAVE_SIGWAITINFO
static void
prune_active_servers_list (GdmServer *server)
{
active_servers = g_slist_remove (active_servers, server);
}
+#endif
static gboolean
gdm_server_spawn (GdmServer *server,
@@ -699,6 +775,7 @@ gdm_server_spawn (GdmServer *server,
g_debug ("GdmServer: Starting X server process: %s", freeme);
g_free (freeme);
+#ifdef HAVE_SIGWAITINFO
active_servers = g_slist_append (active_servers, server);
g_object_weak_ref (G_OBJECT (server),
@@ -707,6 +784,7 @@ gdm_server_spawn (GdmServer *server,
server);
gdm_server_launch_sigusr1_thread_if_needed ();
+#endif
if (!g_spawn_async_with_pipes (NULL,
argv,
@@ -1044,6 +1122,9 @@ gdm_server_init (GdmServer *server)
server->pid = -1;
server->log_dir = g_strdup (LOGDIR);
+#ifndef HAVE_SIGWAITINFO
+ server->sigusr1_id = g_unix_signal_add (SIGUSR1, gdm_server_ready, server);
+#endif
}
static void
@@ -1055,6 +1136,11 @@ gdm_server_finalize (GObject *object)
g_return_if_fail (GDM_IS_SERVER (object));
server = GDM_SERVER (object);
+
+#ifndef HAVE_SIGWAITINFO
+ if (server->sigusr1_id > 0)
+ g_source_remove (server->sigusr1_id);
+#endif
gdm_server_stop (server);
|