~ubuntu-branches/ubuntu/raring/lightdm/raring-updates

« back to all changes in this revision

Viewing changes to src/xserver-local.c

  • Committer: Package Import Robot
  • Author(s): Robert Ancell
  • Date: 2011-09-28 16:00:20 UTC
  • mto: (45.1.1 oneiric-proposed)
  • mto: This revision was merged to the branch mainline in revision 36.
  • Revision ID: package-import@ubuntu.com-20110928160020-5begtcf2pe4s0mzv
Tags: upstream-1.0.0
ImportĀ upstreamĀ versionĀ 1.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
#include <string.h>
14
14
#include <fcntl.h>
15
15
#include <sys/stat.h>
 
16
#include <errno.h>
 
17
#include <glib/gstdio.h>
16
18
 
17
19
#include "xserver-local.h"
18
20
#include "configuration.h"
24
26
{
25
27
    /* X server process */
26
28
    Process *xserver_process;
 
29
  
 
30
    /* File to log to */
 
31
    gchar *log_file;    
27
32
 
28
33
    /* Command to run the X server */
29
34
    gchar *command;
33
38
 
34
39
    /* Server layout to use */
35
40
    gchar *layout;
36
 
  
 
41
 
 
42
    /* TRUE if TCP/IP connections are allowed */
 
43
    gboolean allow_tcp;
 
44
 
37
45
    /* Authority file */
38
46
    GFile *authority_file;
39
47
 
58
66
 
59
67
G_DEFINE_TYPE (XServerLocal, xserver_local, XSERVER_TYPE);
60
68
 
61
 
static guint
62
 
get_free_display_number (void)
 
69
static GList *display_numbers = NULL;
 
70
 
 
71
static gboolean
 
72
display_number_in_use (guint display_number)
 
73
{
 
74
    GList *link;
 
75
    gchar *path;
 
76
    gboolean result;
 
77
 
 
78
    for (link = display_numbers; link; link = link->next)
 
79
    {
 
80
        guint number = GPOINTER_TO_UINT (link->data);
 
81
        if (number == display_number)
 
82
            return TRUE;
 
83
    }
 
84
 
 
85
    path = g_strdup_printf ("/tmp/.X%d-lock", display_number);
 
86
    result = g_file_test (path, G_FILE_TEST_EXISTS);
 
87
    g_free (path);
 
88
 
 
89
    return result;
 
90
}
 
91
 
 
92
guint
 
93
xserver_local_get_unused_display_number (void)
63
94
{
64
95
    guint number;
65
96
 
66
97
    number = config_get_integer (config_get_instance (), "LightDM", "minimum-display-number");
67
 
    while (TRUE)
68
 
    {
69
 
        gchar *path;
70
 
        gboolean result;
71
 
  
72
 
        path = g_strdup_printf ("/tmp/.X%d-lock", number);
73
 
        result = g_file_test (path, G_FILE_TEST_EXISTS);
74
 
        g_free (path);
75
 
 
76
 
        if (!result)
77
 
            break;
78
 
 
 
98
    while (display_number_in_use (number))
79
99
        number++;
80
 
    }
81
 
  
 
100
 
 
101
    display_numbers = g_list_append (display_numbers, GUINT_TO_POINTER (number));
 
102
 
82
103
    return number;
83
104
}
84
105
 
 
106
void
 
107
xserver_local_release_display_number (guint display_number)
 
108
{
 
109
    GList *link;
 
110
    for (link = display_numbers; link; link = link->next)
 
111
    {
 
112
        guint number = GPOINTER_TO_UINT (link->data);
 
113
        if (number == display_number)
 
114
        {
 
115
            display_numbers = g_list_remove_link (display_numbers, link);
 
116
            return;
 
117
        }
 
118
    }
 
119
}
 
120
 
85
121
XServerLocal *
86
122
xserver_local_new (void)
87
123
{
88
124
    XServerLocal *self = g_object_new (XSERVER_LOCAL_TYPE, NULL);
89
 
 
90
 
    xserver_set_display_number (XSERVER (self), get_free_display_number ());
91
 
  
 
125
    gchar *name;
 
126
 
 
127
    xserver_set_display_number (XSERVER (self), xserver_local_get_unused_display_number ());
 
128
 
 
129
    name = g_strdup_printf ("x-%d", xserver_get_display_number (XSERVER (self)));
 
130
    display_server_set_name (DISPLAY_SERVER (self), name);
 
131
    g_free (name);
 
132
 
92
133
    /* Replace Plymouth if it is running */
93
134
    if (plymouth_get_is_active () && plymouth_has_active_vt ())
94
135
    {
136
177
}
137
178
 
138
179
void
 
180
xserver_local_set_allow_tcp (XServerLocal *server, gboolean allow_tcp)
 
181
{
 
182
    g_return_if_fail (server != NULL);
 
183
    server->priv->allow_tcp = allow_tcp;
 
184
}
 
185
 
 
186
void
139
187
xserver_local_set_xdmcp_server (XServerLocal *server, const gchar *hostname)
140
188
{
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);
144
193
}
145
194
 
146
195
const gchar *
220
269
    dup2 (fd, STDIN_FILENO);
221
270
    close (fd);
222
271
 
 
272
    /* Redirect output to logfile */
 
273
    if (server->priv->log_file)
 
274
    {
 
275
         int fd;
 
276
 
 
277
         fd = g_open (server->priv->log_file, O_WRONLY | O_CREAT | O_TRUNC, 0600);
 
278
         if (fd < 0)
 
279
             g_warning ("Failed to open log file %s: %s", server->priv->log_file, g_strerror (errno));
 
280
         else
 
281
         {
 
282
             dup2 (fd, STDOUT_FILENO);
 
283
             dup2 (fd, STDERR_FILENO);
 
284
             close (fd);
 
285
         }
 
286
    }
 
287
 
223
288
    /* Set SIGUSR1 to ignore so the X server can indicate it when it is ready */
224
289
    signal (SIGUSR1, SIG_IGN);
225
290
}
252
317
    g_object_unref (server->priv->xserver_process);
253
318
    server->priv->xserver_process = NULL;
254
319
 
 
320
    xserver_local_release_display_number (xserver_get_display_number (XSERVER (server)));
 
321
  
255
322
    if (xserver_get_authority (XSERVER (server)) && server->priv->authority_file)
256
323
    {
257
324
        GError *error = NULL;
328
395
{
329
396
    XServerLocal *server = XSERVER_LOCAL (display_server);
330
397
    gboolean result;
331
 
    gchar *filename, *dir, *path, *absolute_command;
 
398
    gchar *filename, *dir, *absolute_command;
332
399
    gchar hostname[1024], *number;
333
400
    GString *command;
334
401
 
339
406
    g_return_val_if_fail (server->priv->command != NULL, FALSE);
340
407
 
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);
345
413
 
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);
353
420
    g_free (dir);
354
 
    g_free (path);
355
421
 
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);
395
461
    }
396
 
    else
 
462
    else if (!server->priv->allow_tcp)
397
463
        g_string_append (command, " -nolisten tcp");
398
464
 
399
465
    if (server->priv->vt >= 0)
429
495
        process_set_env (server->priv->xserver_process, "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH"));
430
496
    }
431
497
 
432
 
    process_set_user (server->priv->xserver_process, user_get_current ());
433
498
    result = process_start (server->priv->xserver_process);
434
499
 
435
500
    if (result)
464
529
 
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);