summaryrefslogtreecommitdiff
path: root/x11/gdm/files/patch-daemon_gdm-server.c
blob: 136fc2bc9115f4b2289e39228309956a9ce2024a (plain) (blame)
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);