diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2014-02-26 11:12:22 +1300 |
---|---|---|
committer | Robert Ancell <robert.ancell@canonical.com> | 2014-02-26 11:12:22 +1300 |
commit | 2b899d2c371eaeed3181a94a37266e8374e8a45f (patch) | |
tree | 4aa007faa44944a91ffdbb5598dcd51340d51525 /src/x-server-xvnc.c | |
parent | eb669026e7fd106bd9bb176110b308562801b409 (diff) | |
download | lightdm-2b899d2c371eaeed3181a94a37266e8374e8a45f.tar.gz |
Be extra careful not to call any non thread safe function after a fork
Diffstat (limited to 'src/x-server-xvnc.c')
-rw-r--r-- | src/x-server-xvnc.c | 34 |
1 files changed, 9 insertions, 25 deletions
diff --git a/src/x-server-xvnc.c b/src/x-server-xvnc.c index 0897725d..884489dd 100644 --- a/src/x-server-xvnc.c +++ b/src/x-server-xvnc.c @@ -26,9 +26,6 @@ struct XServerXVNCPrivate { /* X server process */ Process *x_server_process; - - /* File to log to */ - gchar *log_file; /* Command to run the X server */ gchar *command; @@ -130,28 +127,15 @@ get_absolute_command (const gchar *command) } static void -run_cb (Process *process, XServerXVNC *server) +run_cb (Process *process, gpointer user_data) { + XServerXVNC *server = user_data; + /* Connect input */ dup2 (server->priv->socket_fd, STDIN_FILENO); dup2 (server->priv->socket_fd, STDOUT_FILENO); close (server->priv->socket_fd); - /* Redirect output to logfile */ - if (server->priv->log_file) - { - int fd; - - fd = g_open (server->priv->log_file, O_WRONLY | O_CREAT | O_TRUNC, 0600); - if (fd < 0) - l_warning (server, "Failed to open log file %s: %s", server->priv->log_file, g_strerror (errno)); - else - { - dup2 (fd, STDERR_FILENO); - close (fd); - } - } - /* Set SIGUSR1 to ignore so the X server can indicate it when it is ready */ signal (SIGUSR1, SIG_IGN); } @@ -200,7 +184,7 @@ x_server_xvnc_start (DisplayServer *display_server) XServerXVNC *server = X_SERVER_XVNC (display_server); XAuthority *authority; gboolean result; - gchar *filename, *run_dir, *dir, *absolute_command; + gchar *filename, *run_dir, *dir, *log_file, *absolute_command; GString *command; gchar hostname[1024], *number; GError *error = NULL; @@ -209,17 +193,18 @@ x_server_xvnc_start (DisplayServer *display_server) server->priv->got_signal = FALSE; - server->priv->x_server_process = process_new (); + server->priv->x_server_process = process_new (run_cb, server); process_set_clear_environment (server->priv->x_server_process, TRUE); - g_signal_connect (server->priv->x_server_process, "run", G_CALLBACK (run_cb), server); g_signal_connect (server->priv->x_server_process, "got-signal", G_CALLBACK (got_signal_cb), server); g_signal_connect (server->priv->x_server_process, "stopped", G_CALLBACK (stopped_cb), server); /* Setup logging */ filename = g_strdup_printf ("%s.log", display_server_get_name (display_server)); dir = config_get_string (config_get_instance (), "LightDM", "log-directory"); - server->priv->log_file = g_build_filename (dir, filename, NULL); - l_debug (display_server, "Logging to %s", server->priv->log_file); + log_file = g_build_filename (dir, filename, NULL); + process_set_log_file (server->priv->x_server_process, log_file, FALSE); + l_debug (display_server, "Logging to %s", log_file); + g_free (log_file); g_free (filename); g_free (dir); @@ -314,7 +299,6 @@ x_server_xvnc_finalize (GObject *object) g_object_unref (self->priv->x_server_process); g_free (self->priv->command); g_free (self->priv->authority_file); - g_free (self->priv->log_file); G_OBJECT_CLASS (x_server_xvnc_parent_class)->finalize (object); } |