diff options
author | William Jon McCann <mccann@src.gnome.org> | 2007-05-11 21:01:41 +0000 |
---|---|---|
committer | William Jon McCann <mccann@src.gnome.org> | 2007-05-11 21:01:41 +0000 |
commit | 25854e3b29e066e916cf800b10f2f0aa449ac14d (patch) | |
tree | fb4fb061da7fd413a26a7b2c7ec3404276220c22 | |
parent | 1f5396866d06958b8e945735eb1c96a7f744aae6 (diff) | |
download | gdm-25854e3b29e066e916cf800b10f2f0aa449ac14d.tar.gz |
Handle xorg usr1 ready signal.
svn path=/branches/mccann-gobject/; revision=4917
-rw-r--r-- | daemon/gdm-server.c | 72 | ||||
-rw-r--r-- | daemon/gdm-server.h | 1 | ||||
-rw-r--r-- | daemon/gdm-slave.c | 98 |
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) { |