summaryrefslogtreecommitdiff
path: root/src/x-server-xvnc.c
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2014-02-26 11:12:22 +1300
committerRobert Ancell <robert.ancell@canonical.com>2014-02-26 11:12:22 +1300
commit2b899d2c371eaeed3181a94a37266e8374e8a45f (patch)
tree4aa007faa44944a91ffdbb5598dcd51340d51525 /src/x-server-xvnc.c
parenteb669026e7fd106bd9bb176110b308562801b409 (diff)
downloadlightdm-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.c34
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);
}