~lightdm-team/lightdm/1.4

« back to all changes in this revision

Viewing changes to src/xserver.c

  • Committer: robert.ancell at canonical
  • Date: 2011-02-12 05:13:51 UTC
  • Revision ID: robert.ancell@canonical.com-20110212051351-bjclsn1e28wyllcy
Don't replace the environment for children, it might have arbitrary things we need

Show diffs side-by-side

added added

removed removed

Lines of Context:
315
315
xserver_fork_cb (gpointer data)
316
316
{
317
317
    XServer *server = data;
 
318
    GHashTableIter iter;
 
319
    gpointer key, value;
 
320
 
 
321
    /* Set environment */
 
322
    g_hash_table_iter_init (&iter, server->priv->env);
 
323
    while (g_hash_table_iter_next (&iter, &key, &value))
 
324
        g_setenv ((gchar *)key, (gchar *)value, TRUE);
318
325
 
319
326
    /* Clear USR1 handler so the server will signal us when ready */
320
327
    signal (SIGUSR1, SIG_IGN);
336
343
    }
337
344
}
338
345
 
339
 
static gchar **
340
 
get_env (XServer *server)
 
346
static gchar *
 
347
make_env_string (XServer *server)
341
348
{
342
 
    gchar **env;
 
349
    GString *string;
 
350
    gchar *result;
343
351
    gpointer key, value;
344
352
    GHashTableIter iter;
345
 
    gint i = 0;
346
353
 
347
 
    env = g_malloc (sizeof (gchar *) * (g_hash_table_size (server->priv->env) + 1));
 
354
    string = g_string_new ("");
348
355
    g_hash_table_iter_init (&iter, server->priv->env);
349
 
    while (g_hash_table_iter_next (&iter, &key, &value))
 
356
    if (g_hash_table_iter_next (&iter, &key, &value))
350
357
    {
351
 
        // FIXME: Do these need to be freed?
352
 
        env[i] = g_strdup_printf("%s=%s", (gchar *)key, (gchar *)value);
353
 
        i++;
 
358
        g_string_append_printf (string, "%s=%s", (gchar *)key, (gchar *)value);      
 
359
        while (g_hash_table_iter_next (&iter, &key, &value))
 
360
            g_string_append_printf (string, " %s=%s", (gchar *)key, (gchar *)value);
354
361
    }
355
 
    env[i] = NULL;
 
362
    result = string->str;
 
363
    g_string_free (string, FALSE);
356
364
 
357
 
    return env;
 
365
    return result;
358
366
}
359
367
 
360
368
gboolean
364
372
    gboolean result;
365
373
    GString *command;
366
374
    gint argc;
367
 
    gchar **argv;
368
 
    gchar **env;
369
 
    gchar *env_string;
 
375
    gchar **argv, *env_string;
370
376
    //gint xserver_stdin, xserver_stdout, xserver_stderr;
371
377
 
372
378
    g_return_val_if_fail (server->priv->pid == 0, FALSE);
382
388
        return TRUE;
383
389
    }
384
390
 
385
 
    env = get_env (server);
386
 
 
387
391
    /* Write the authorization file */
388
392
    if (server->priv->authorization)
389
393
    {
425
429
    if (server->priv->vt >= 0)
426
430
        g_string_append_printf (command, " vt%d", server->priv->vt);
427
431
 
428
 
    env_string = g_strjoinv (" ", env);
 
432
    env_string = make_env_string (server);
429
433
    g_debug ("Launching X Server: %s %s", env_string, command->str);
430
434
    g_free (env_string);
431
435
 
439
443
 
440
444
    result = g_spawn_async (NULL, /* Working directory */
441
445
                            argv,
442
 
                            env,
 
446
                            NULL,
443
447
                            G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
444
448
                            xserver_fork_cb, server,
445
449
                            &server->priv->pid,