summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Jon McCann <mccann@src.gnome.org>2007-05-11 21:01:41 +0000
committerWilliam Jon McCann <mccann@src.gnome.org>2007-05-11 21:01:41 +0000
commit25854e3b29e066e916cf800b10f2f0aa449ac14d (patch)
treefb4fb061da7fd413a26a7b2c7ec3404276220c22
parent1f5396866d06958b8e945735eb1c96a7f744aae6 (diff)
downloadgdm-25854e3b29e066e916cf800b10f2f0aa449ac14d.tar.gz
Handle xorg usr1 ready signal.
svn path=/branches/mccann-gobject/; revision=4917
-rw-r--r--daemon/gdm-server.c72
-rw-r--r--daemon/gdm-server.h1
-rw-r--r--daemon/gdm-slave.c98
3 files changed, 130 insertions, 41 deletions
diff --git a/daemon/gdm-server.c b/daemon/gdm-server.c
index 5e620aa3..6f14737b 100644
--- a/daemon/gdm-server.c
+++ b/daemon/gdm-server.c
@@ -90,12 +90,65 @@ enum {
PROP_DISABLE_TCP,
};
+enum {
+ READY,
+ LAST_SIGNAL
+};
+
+static guint signals [LAST_SIGNAL] = { 0, };
+
static void gdm_server_class_init (GdmServerClass *klass);
static void gdm_server_init (GdmServer *server);
static void gdm_server_finalize (GObject *object);
G_DEFINE_TYPE (GdmServer, gdm_server, G_TYPE_OBJECT)
+/* copied from nautilus */
+static int ready_pipes[2];
+
+static gboolean
+ready_io_cb (GIOChannel *io,
+ GIOCondition condition,
+ GdmServer *server)
+{
+ char a;
+
+ while (read (ready_pipes[0], &a, 1) != 1)
+ ;
+
+ g_debug ("Got USR1 from X server - emitting READY");
+
+ g_signal_emit (server, signals[READY], 0);
+
+ return TRUE;
+}
+
+static void
+sigusr1_handler (int sig)
+{
+ while (write (ready_pipes[1], "a", 1) != 1)
+ ;
+}
+
+static void
+setup_ready_signal (GdmServer *server)
+{
+ struct sigaction sa;
+ GIOChannel *io;
+
+ if (pipe (ready_pipes) == -1) {
+ g_error ("Could not create pipe() for ready signal");
+ }
+
+ io = g_io_channel_unix_new (ready_pipes[0]);
+ g_io_add_watch (io, G_IO_IN, (GIOFunc)ready_io_cb, server);
+
+ sa.sa_handler = sigusr1_handler;
+ sigemptyset (&sa.sa_mask);
+ sa.sa_flags = 0;
+ sigaction (SIGUSR1, &sa, NULL);
+}
+
gboolean
gdm_server_stop (GdmServer *server)
{
@@ -272,6 +325,8 @@ change_user (GdmServer *server)
if (server->priv->uid != 0) {
struct passwd *pwent;
+ g_debug ("Changing user for child process: %d", (int)server->priv->uid);
+
pwent = getpwuid (server->priv->uid);
if (pwent == NULL) {
g_warning (_("%s: Server was to be spawned by uid %d but "
@@ -543,6 +598,10 @@ gdm_server_spawn (GdmServer *server,
g_ptr_array_foreach (env, (GFunc)g_free, NULL);
g_ptr_array_free (env, TRUE);
+ g_debug ("Started X server process: %d", (int)server->priv->pid);
+
+ sleep (10);
+
return ret;
}
@@ -664,6 +723,17 @@ gdm_server_class_init (GdmServerClass *klass)
g_type_class_add_private (klass, sizeof (GdmServerPrivate));
+ signals [READY] =
+ g_signal_new ("ready",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdmServerClass, ready),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
g_object_class_install_property (object_class,
PROP_DISPLAY_NAME,
g_param_spec_string ("display-name",
@@ -682,6 +752,8 @@ gdm_server_init (GdmServer *server)
server->priv->pid = -1;
server->priv->command = g_strdup ("/usr/bin/Xorg");
server->priv->log_dir = g_strdup (LOGDIR);
+
+ setup_ready_signal (server);
}
static void
diff --git a/daemon/gdm-server.h b/daemon/gdm-server.h
index fdb55b29..33999544 100644
--- a/daemon/gdm-server.h
+++ b/daemon/gdm-server.h
@@ -45,6 +45,7 @@ typedef struct
{
GObjectClass parent_class;
+ void (* ready) (GdmServer *server);
} GdmServerClass;
GType gdm_server_get_type (void);
diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
index 53ce964c..ed4552ed 100644
--- a/daemon/gdm-slave.c
+++ b/daemon/gdm-slave.c
@@ -603,51 +603,14 @@ gdm_slave_exec_script (GdmSlave *slave,
return ret;
}
-static gboolean
-gdm_slave_run (GdmSlave *slave)
+static void
+server_ready_cb (GdmServer *server,
+ GdmSlave *slave)
{
- /* if this is local display start a server if one doesn't
- * exist */
- if (slave->priv->display_is_local) {
- gboolean res;
-
- slave->priv->server = gdm_server_new (slave->priv->display_name);
-
- res = gdm_server_start (slave->priv->server);
- if (! res) {
- g_warning (_("Could not start the X "
- "server (your graphical environment) "
- "due to some internal error. "
- "Please contact your system administrator "
- "or check your syslog to diagnose. "
- "In the meantime this display will be "
- "disabled. Please restart GDM when "
- "the problem is corrected."));
- exit (1);
- }
- }
-
- /* We can use d->handled from now on on this display,
- * since the lookup was done in server start */
-
- g_setenv ("DISPLAY", slave->priv->display_name, TRUE);
- g_unsetenv ("XAUTHORITY"); /* just in case it's set */
-
-#if 0
- gdm_auth_set_local_auth (d);
-#endif
-
-#if 0
- /* X error handlers to avoid the default one (i.e. exit (1)) */
- do_xfailed_on_xio_error = TRUE;
- XSetErrorHandler (gdm_slave_xerror_handler);
- XSetIOErrorHandler (gdm_slave_xioerror_handler);
-#endif
-
/* We keep our own (windowless) connection (dsp) open to avoid the
* X server resetting due to lack of active connections. */
- g_debug ("gdm_slave_run: Opening display %s", slave->priv->display_name);
+ g_debug ("Server is ready - opening display %s", slave->priv->display_name);
gdm_sigchld_block_push ();
slave->priv->server_display = XOpenDisplay (slave->priv->display_name);
@@ -703,6 +666,59 @@ gdm_slave_run (GdmSlave *slave)
}
}
+static gboolean
+gdm_slave_run (GdmSlave *slave)
+{
+ /* if this is local display start a server if one doesn't
+ * exist */
+ if (slave->priv->display_is_local) {
+ gboolean res;
+
+ slave->priv->server = gdm_server_new (slave->priv->display_name);
+
+ g_signal_connect (slave->priv->server,
+ "ready",
+ G_CALLBACK (server_ready_cb),
+ slave);
+
+ res = gdm_server_start (slave->priv->server);
+ if (! res) {
+ g_warning (_("Could not start the X "
+ "server (your graphical environment) "
+ "due to some internal error. "
+ "Please contact your system administrator "
+ "or check your syslog to diagnose. "
+ "In the meantime this display will be "
+ "disabled. Please restart GDM when "
+ "the problem is corrected."));
+ exit (1);
+ }
+
+ g_debug ("Started X server");
+ }
+
+ /* We can use d->handled from now on on this display,
+ * since the lookup was done in server start */
+
+ g_setenv ("DISPLAY", slave->priv->display_name, TRUE);
+ g_unsetenv ("XAUTHORITY"); /* just in case it's set */
+
+#if 0
+ gdm_auth_set_local_auth (d);
+#endif
+
+#if 0
+ /* X error handlers to avoid the default one (i.e. exit (1)) */
+ do_xfailed_on_xio_error = TRUE;
+ XSetErrorHandler (gdm_slave_xerror_handler);
+ XSetIOErrorHandler (gdm_slave_xioerror_handler);
+#endif
+
+ /* now we wait for ready signal */
+
+ return TRUE;
+}
+
gboolean
gdm_slave_start (GdmSlave *slave)
{