#include <config.h>
#include <string.h>
#include <fcntl.h>
-#include <unistd.h>
#include <sys/stat.h>
#include <errno.h>
#include <glib/gstdio.h>
/* Command to run the X server */
gchar *command;
+ /* Display number to use */
+ guint display_number;
+
/* Config file to use */
gchar *config_file;
/* XDMCP key to use */
gchar *xdmcp_key;
- /* ID to report to Mir */
- gchar *mir_id;
-
- /* Filename of socket Mir is listening on */
- gchar *mir_socket;
-
/* TRUE when received ready signal */
gboolean got_signal;
gchar *background;
};
-G_DEFINE_TYPE (XServerLocal, x_server_local, X_SERVER_TYPE);
+static void x_server_local_logger_iface_init (LoggerInterface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (XServerLocal, x_server_local, X_SERVER_TYPE,
+ G_IMPLEMENT_INTERFACE (LOGGER_TYPE, x_server_local_logger_iface_init));
static gchar *version = NULL;
static guint version_major = 0, version_minor = 0;
XServerLocal *
x_server_local_new (void)
{
- XServerLocal *self;
- gchar hostname[1024], *number, *name;
- XAuthority *cookie;
-
- self = g_object_new (X_SERVER_LOCAL_TYPE, NULL);
-
- x_server_set_display_number (X_SERVER (self), x_server_local_get_unused_display_number ());
-
- gethostname (hostname, 1024);
- number = g_strdup_printf ("%d", x_server_get_display_number (X_SERVER (self)));
- cookie = x_authority_new_cookie (XAUTH_FAMILY_LOCAL, (guint8*) hostname, strlen (hostname), number);
- x_server_set_authority (X_SERVER (self), cookie);
- g_free (number);
- g_object_unref (cookie);
-
- name = g_strdup_printf ("x-%d", x_server_get_display_number (X_SERVER (self)));
- display_server_set_name (DISPLAY_SERVER (self), name);
- g_free (name);
-
- return self;
+ return g_object_new (X_SERVER_LOCAL_TYPE, NULL);
}
void
server->priv->background = g_strdup (background);
}
-void
-x_server_local_set_mir_id (XServerLocal *server, const gchar *id)
+static guint
+x_server_local_get_display_number (XServer *server)
{
- g_return_if_fail (server != NULL);
- g_free (server->priv->mir_id);
- server->priv->mir_id = g_strdup (id);
-}
-
-const gchar *x_server_local_get_mir_id (XServerLocal *server)
-{
- g_return_val_if_fail (server != NULL, NULL);
- return server->priv->mir_id;
-}
-
-void
-x_server_local_set_mir_socket (XServerLocal *server, const gchar *socket)
-{
- g_return_if_fail (server != NULL);
- g_free (server->priv->mir_socket);
- server->priv->mir_socket = g_strdup (socket);
+ return X_SERVER_LOCAL (server)->priv->display_number;
}
static gint
x_server_local_get_vt (DisplayServer *server)
{
- g_return_val_if_fail (server != NULL, 0);
return X_SERVER_LOCAL (server)->priv->vt;
}
}
static void
-run_cb (Process *process, gpointer user_data)
+x_server_local_run (Process *process, gpointer user_data)
{
int fd;
signal (SIGUSR1, SIG_IGN);
}
+static ProcessRunFunc
+x_server_local_get_run_function (XServerLocal *server)
+{
+ return x_server_local_run;
+}
+
+static gboolean
+x_server_local_get_log_stdout (XServerLocal *server)
+{
+ return TRUE;
+}
+
static void
got_signal_cb (Process *process, int signum, XServerLocal *server)
{
if (signum == SIGUSR1 && !server->priv->got_signal)
{
server->priv->got_signal = TRUE;
- l_debug (server, "Got signal from X server :%d", x_server_get_display_number (X_SERVER (server)));
+ l_debug (server, "Got signal from X server :%d", server->priv->display_number);
// FIXME: Check return value
DISPLAY_SERVER_CLASS (x_server_local_parent_class)->start (DISPLAY_SERVER (server));
vt_unref (server->priv->vt);
server->priv->have_vt_ref = FALSE;
}
- x_server_local_release_display_number (x_server_get_display_number (X_SERVER (server)));
+ x_server_local_release_display_number (server->priv->display_number);
if (x_server_get_authority (X_SERVER (server)) && server->priv->authority_file)
{
x_server_local_start (DisplayServer *display_server)
{
XServerLocal *server = X_SERVER_LOCAL (display_server);
- gboolean result;
+ ProcessRunFunc run_cb;
+ gboolean result, backup_logs;
gchar *filename, *dir, *log_file, *absolute_command;
GString *command;
g_return_val_if_fail (server->priv->command != NULL, FALSE);
+ run_cb = X_SERVER_LOCAL_GET_CLASS (server)->get_run_function (server);
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, PROCESS_SIGNAL_GOT_SIGNAL, G_CALLBACK (got_signal_cb), server);
g_signal_connect (server->priv->x_server_process, PROCESS_SIGNAL_STOPPED, G_CALLBACK (stopped_cb), server);
/* Setup logging */
- filename = g_strdup_printf ("%s.log", display_server_get_name (display_server));
+ filename = g_strdup_printf ("x-%d.log", x_server_get_display_number (X_SERVER (server)));
dir = config_get_string (config_get_instance (), "LightDM", "log-directory");
log_file = g_build_filename (dir, filename, NULL);
- process_set_log_file (server->priv->x_server_process, log_file, TRUE);
+ backup_logs = config_get_boolean (config_get_instance (), "LightDM", "backup-logs");
+ process_set_log_file (server->priv->x_server_process, log_file, X_SERVER_LOCAL_GET_CLASS (server)->get_log_stdout (server), backup_logs ? LOG_MODE_BACKUP_AND_TRUNCATE : LOG_MODE_APPEND);
l_debug (display_server, "Logging to %s", log_file);
g_free (log_file);
g_free (filename);
command = g_string_new (absolute_command);
g_free (absolute_command);
- g_string_append_printf (command, " :%d", x_server_get_display_number (X_SERVER (server)));
+ g_string_append_printf (command, " :%d", server->priv->display_number);
if (server->priv->config_file)
g_string_append_printf (command, " -config %s", server->priv->config_file);
if (server->priv->authority_file)
g_string_append_printf (command, " -auth %s", server->priv->authority_file);
- /* Setup for running inside Mir */
- if (server->priv->mir_id)
- g_string_append_printf (command, " -mir %s", server->priv->mir_id);
-
- if (server->priv->mir_socket)
- g_string_append_printf (command, " -mirSocket %s", server->priv->mir_socket);
-
/* Connect to a remote server using XDMCP */
if (server->priv->xdmcp_server != NULL)
{
if (server->priv->background)
g_string_append_printf (command, " -background %s", server->priv->background);
+ /* Allow sub-classes to add arguments */
+ if (X_SERVER_LOCAL_GET_CLASS (server)->add_args)
+ X_SERVER_LOCAL_GET_CLASS (server)->add_args (server, command);
+
process_set_command (server->priv->x_server_process, command->str);
g_string_free (command, TRUE);
result = process_start (server->priv->x_server_process, FALSE);
if (result)
- l_debug (display_server, "Waiting for ready signal from X server :%d", x_server_get_display_number (X_SERVER (server)));
+ l_debug (display_server, "Waiting for ready signal from X server :%d", server->priv->display_number);
if (!result)
stopped_cb (server->priv->x_server_process, X_SERVER_LOCAL (server));
server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, X_SERVER_LOCAL_TYPE, XServerLocalPrivate);
server->priv->vt = -1;
server->priv->command = g_strdup ("X");
+ server->priv->display_number = x_server_local_get_unused_display_number ();
}
static void
g_free (self->priv->xdg_seat);
g_free (self->priv->xdmcp_server);
g_free (self->priv->xdmcp_key);
- g_free (self->priv->mir_id);
- g_free (self->priv->mir_socket);
g_free (self->priv->authority_file);
if (self->priv->have_vt_ref)
vt_unref (self->priv->vt);
x_server_local_class_init (XServerLocalClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ XServerClass *x_server_class = X_SERVER_CLASS (klass);
DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
+ klass->get_run_function = x_server_local_get_run_function;
+ klass->get_log_stdout = x_server_local_get_log_stdout;
+ x_server_class->get_display_number = x_server_local_get_display_number;
display_server_class->get_vt = x_server_local_get_vt;
- display_server_class->start = x_server_local_start;
+ display_server_class->start = klass->start = x_server_local_start;
display_server_class->stop = x_server_local_stop;
object_class->finalize = x_server_local_finalize;
g_type_class_add_private (klass, sizeof (XServerLocalPrivate));
}
+
+static gint
+x_server_local_real_logprefix (Logger *self, gchar *buf, gulong buflen)
+{
+ XServerLocal *server = X_SERVER_LOCAL (self);
+ return g_snprintf (buf, buflen, "XServer %d: ", server->priv->display_number);
+}
+
+static void
+x_server_local_logger_iface_init (LoggerInterface *iface)
+{
+ iface->logprefix = &x_server_local_real_logprefix;
+}