59
67
G_DEFINE_TYPE (XServerLocal, xserver_local, XSERVER_TYPE);
62
get_free_display_number (void)
69
static GList *display_numbers = NULL;
72
display_number_in_use (guint display_number)
78
for (link = display_numbers; link; link = link->next)
80
guint number = GPOINTER_TO_UINT (link->data);
81
if (number == display_number)
85
path = g_strdup_printf ("/tmp/.X%d-lock", display_number);
86
result = g_file_test (path, G_FILE_TEST_EXISTS);
93
xserver_local_get_unused_display_number (void)
66
97
number = config_get_integer (config_get_instance (), "LightDM", "minimum-display-number");
72
path = g_strdup_printf ("/tmp/.X%d-lock", number);
73
result = g_file_test (path, G_FILE_TEST_EXISTS);
98
while (display_number_in_use (number))
101
display_numbers = g_list_append (display_numbers, GUINT_TO_POINTER (number));
107
xserver_local_release_display_number (guint display_number)
110
for (link = display_numbers; link; link = link->next)
112
guint number = GPOINTER_TO_UINT (link->data);
113
if (number == display_number)
115
display_numbers = g_list_remove_link (display_numbers, link);
86
122
xserver_local_new (void)
88
124
XServerLocal *self = g_object_new (XSERVER_LOCAL_TYPE, NULL);
90
xserver_set_display_number (XSERVER (self), get_free_display_number ());
127
xserver_set_display_number (XSERVER (self), xserver_local_get_unused_display_number ());
129
name = g_strdup_printf ("x-%d", xserver_get_display_number (XSERVER (self)));
130
display_server_set_name (DISPLAY_SERVER (self), name);
92
133
/* Replace Plymouth if it is running */
93
134
if (plymouth_get_is_active () && plymouth_has_active_vt ())
180
xserver_local_set_allow_tcp (XServerLocal *server, gboolean allow_tcp)
182
g_return_if_fail (server != NULL);
183
server->priv->allow_tcp = allow_tcp;
139
187
xserver_local_set_xdmcp_server (XServerLocal *server, const gchar *hostname)
141
189
g_return_if_fail (server != NULL);
142
190
g_free (server->priv->xdmcp_server);
143
191
server->priv->xdmcp_server = g_strdup (hostname);
192
display_server_set_start_local_sessions (DISPLAY_SERVER (server), hostname == NULL);
220
269
dup2 (fd, STDIN_FILENO);
272
/* Redirect output to logfile */
273
if (server->priv->log_file)
277
fd = g_open (server->priv->log_file, O_WRONLY | O_CREAT | O_TRUNC, 0600);
279
g_warning ("Failed to open log file %s: %s", server->priv->log_file, g_strerror (errno));
282
dup2 (fd, STDOUT_FILENO);
283
dup2 (fd, STDERR_FILENO);
223
288
/* Set SIGUSR1 to ignore so the X server can indicate it when it is ready */
224
289
signal (SIGUSR1, SIG_IGN);
252
317
g_object_unref (server->priv->xserver_process);
253
318
server->priv->xserver_process = NULL;
320
xserver_local_release_display_number (xserver_get_display_number (XSERVER (server)));
255
322
if (xserver_get_authority (XSERVER (server)) && server->priv->authority_file)
257
324
GError *error = NULL;
329
396
XServerLocal *server = XSERVER_LOCAL (display_server);
331
gchar *filename, *dir, *path, *absolute_command;
398
gchar *filename, *dir, *absolute_command;
332
399
gchar hostname[1024], *number;
333
400
GString *command;
339
406
g_return_val_if_fail (server->priv->command != NULL, FALSE);
341
408
server->priv->xserver_process = process_new ();
409
process_set_clear_environment (server->priv->xserver_process, TRUE);
342
410
g_signal_connect (server->priv->xserver_process, "run", G_CALLBACK (run_cb), server);
343
411
g_signal_connect (server->priv->xserver_process, "got-signal", G_CALLBACK (got_signal_cb), server);
344
412
g_signal_connect (server->priv->xserver_process, "stopped", G_CALLBACK (stopped_cb), server);
346
414
/* Setup logging */
347
filename = g_strdup_printf ("%s.log", xserver_get_address (XSERVER (server)));
415
filename = g_strdup_printf ("%s.log", display_server_get_name (display_server));
348
416
dir = config_get_string (config_get_instance (), "LightDM", "log-directory");
349
path = g_build_filename (dir, filename, NULL);
350
g_debug ("Logging to %s", path);
351
process_set_log_file (server->priv->xserver_process, path);
417
server->priv->log_file = g_build_filename (dir, filename, NULL);
418
g_debug ("Logging to %s", server->priv->log_file);
352
419
g_free (filename);
356
422
absolute_command = get_absolute_command (server->priv->command);
357
423
if (!absolute_command)
393
459
if (server->priv->xdmcp_key)
394
460
g_string_append_printf (command, " -cookie %s", server->priv->xdmcp_key);
462
else if (!server->priv->allow_tcp)
397
463
g_string_append (command, " -nolisten tcp");
399
465
if (server->priv->vt >= 0)
429
495
process_set_env (server->priv->xserver_process, "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH"));
432
process_set_user (server->priv->xserver_process, user_get_current ());
433
498
result = process_start (server->priv->xserver_process);
465
530
if (self->priv->xserver_process)
466
531
g_object_unref (self->priv->xserver_process);
532
g_free (self->priv->log_file);
467
533
g_free (self->priv->command);
468
534
g_free (self->priv->config_file);
469
535
g_free (self->priv->layout);