diff options
author | William Jon McCann <mccann@jhu.edu> | 2007-10-11 18:19:06 +0000 |
---|---|---|
committer | William Jon McCann <mccann@src.gnome.org> | 2007-10-11 18:19:06 +0000 |
commit | 3573a91727af5e61e3ae93101c178cac75655bb7 (patch) | |
tree | c8e33063290e15c1685ca8ff6983ac0d98ba6a11 /daemon | |
parent | 5305d0acec5de7b03fa66c1f7ab0d56f86ef0057 (diff) | |
download | gdm-3573a91727af5e61e3ae93101c178cac75655bb7.tar.gz |
Also pass x11-display when opening the session. Patch from Brian Cameron
2007-10-11 William Jon McCann <mccann@jhu.edu>
* common/gdm-marshal.list:
* daemon/gdm-product-slave.c: (reset_session), (on_relay_open):
* daemon/gdm-session-worker.c: (gdm_session_worker_initialize_pam),
(gdm_session_worker_verify_user), (gdm_session_worker_open),
(open_idle), (queue_open), (on_begin_verification),
(on_begin_verification_for_user), (gdm_session_worker_constructor):
* daemon/gdm-session.c: (gdm_session_write_record),
(do_introspect), (gdm_session_open), (send_begin_verification),
(send_begin_verification_for_user):
* daemon/gdm-session.h:
* daemon/gdm-simple-slave.c: (on_greeter_cancel),
(on_greeter_connected):
* daemon/test-session.c: (main):
Also pass x11-display when opening the session.
Patch from Brian Cameron <brian.cameron@sun.com>
svn path=/branches/mccann-gobject/; revision=5358
Diffstat (limited to 'daemon')
-rw-r--r-- | daemon/gdm-product-slave.c | 16 | ||||
-rw-r--r-- | daemon/gdm-session-worker.c | 42 | ||||
-rw-r--r-- | daemon/gdm-session.c | 48 | ||||
-rw-r--r-- | daemon/gdm-session.h | 1 | ||||
-rw-r--r-- | daemon/gdm-simple-slave.c | 14 | ||||
-rw-r--r-- | daemon/test-session.c | 1 |
6 files changed, 90 insertions, 32 deletions
diff --git a/daemon/gdm-product-slave.c b/daemon/gdm-product-slave.c index 7f50956c..05be20f7 100644 --- a/daemon/gdm-product-slave.c +++ b/daemon/gdm-product-slave.c @@ -944,13 +944,19 @@ on_relay_language_selected (DBusGProxy *proxy, static gboolean reset_session (GdmProductSlave *slave) { + char *display_name; gboolean res; GError *error; + g_object_get (slave, + "display-name", &display_name, + NULL); + gdm_session_close (slave->priv->session); res = gdm_session_open (slave->priv->session, "gdm", "", + display_name, "/dev/console", &error); if (! res) { @@ -958,6 +964,8 @@ reset_session (GdmProductSlave *slave) g_error_free (error); } + g_free (display_name); + return res; } @@ -981,21 +989,29 @@ on_relay_open (DBusGProxy *proxy, gpointer data) { GdmProductSlave *slave = GDM_PRODUCT_SLAVE (data); + char *display_name; gboolean res; GError *error; g_debug ("Relay open: opening session"); + g_object_get (slave, + "display-name", &display_name, + NULL); + error = NULL; res = gdm_session_open (slave->priv->session, "gdm", "", + display_name, "/dev/console", &error); if (! res) { g_warning ("Unable to open session: %s", error->message); g_error_free (error); } + + g_free (display_name); } static void diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c index 946a667a..3130ccc8 100644 --- a/daemon/gdm-session-worker.c +++ b/daemon/gdm-session-worker.c @@ -775,7 +775,7 @@ gdm_session_worker_initialize_pam (GdmSessionWorker *worker, const char *service, const char *username, const char *hostname, - const char *console_name, + const char *display_device, GError **error) { struct pam_conv pam_conversation; @@ -836,7 +836,7 @@ gdm_session_worker_initialize_pam (GdmSessionWorker *worker, } } - error_code = pam_set_item (worker->priv->pam_handle, PAM_TTY, console_name); + error_code = pam_set_item (worker->priv->pam_handle, PAM_TTY, display_device); if (error_code != PAM_SUCCESS) { g_set_error (error, @@ -1111,7 +1111,8 @@ static gboolean gdm_session_worker_verify_user (GdmSessionWorker *worker, const char *service_name, const char *hostname, - const char *console_name, + const char *x11_display_name, + const char *display_device, const char *username, gboolean password_is_required, GError **error) @@ -1119,18 +1120,19 @@ gdm_session_worker_verify_user (GdmSessionWorker *worker, GError *pam_error; gboolean res; - g_debug ("Verifying user: %s host: %s service: %s tty: %s", + g_debug ("Verifying user: %s host: %s service: %s display: %s tty: %s", username != NULL ? username : "(null)", hostname != NULL ? hostname : "(null)", service_name != NULL ? service_name : "(null)", - console_name != NULL ? console_name : "(null)"); + x11_display_name != NULL ? x11_display_name : "(null)", + display_device != NULL ? display_device : "(null)"); pam_error = NULL; res = gdm_session_worker_initialize_pam (worker, service_name, username, hostname, - console_name, + display_device, &pam_error); if (! res) { g_propagate_error (error, pam_error); @@ -1369,8 +1371,9 @@ gdm_session_worker_open_user_session (GdmSessionWorker *worker, static gboolean gdm_session_worker_open (GdmSessionWorker *worker, const char *service_name, + const char *x11_display_name, + const char *display_device, const char *hostname, - const char *console_name, const char *username, GError **error) { @@ -1384,7 +1387,8 @@ gdm_session_worker_open (GdmSessionWorker *worker, res = gdm_session_worker_verify_user (worker, service_name, hostname, - console_name, + x11_display_name, + display_device, username, TRUE /* password is required */, &verification_error); @@ -1533,6 +1537,7 @@ on_start_program (DBusGProxy *proxy, typedef struct { GdmSessionWorker *worker; char *service; + char *x11_display_name; char *console; char *hostname; char *username; @@ -1549,6 +1554,7 @@ open_idle (OpenData *data) error = NULL; res = gdm_session_worker_open (data->worker, data->service, + data->x11_display_name, data->console, data->hostname, data->username, @@ -1576,6 +1582,7 @@ free_open_data (OpenData *data) static void queue_open (GdmSessionWorker *worker, const char *service, + const char *x11_display_name, const char *console, const char *hostname, const char *username) @@ -1589,6 +1596,7 @@ queue_open (GdmSessionWorker *worker, data = g_new0 (OpenData, 1); data->worker = worker; data->service = g_strdup (service); + data->x11_display_name = g_strdup (x11_display_name); data->console = g_strdup (console); data->hostname = g_strdup (hostname); data->username = g_strdup (username); @@ -1601,6 +1609,7 @@ queue_open (GdmSessionWorker *worker, static void on_begin_verification (DBusGProxy *proxy, const char *service, + const char *x11_display_name, const char *console, const char *hostname, gpointer data) @@ -1608,12 +1617,13 @@ on_begin_verification (DBusGProxy *proxy, GdmSessionWorker *worker = GDM_SESSION_WORKER (data); g_debug ("begin verification: %s %s", service, console); - queue_open (worker, service, console, hostname, NULL); + queue_open (worker, service, x11_display_name, console, hostname, NULL); } static void on_begin_verification_for_user (DBusGProxy *proxy, const char *service, + const char *x11_display_name, const char *console, const char *hostname, const char *username, @@ -1622,7 +1632,7 @@ on_begin_verification_for_user (DBusGProxy *proxy, GdmSessionWorker *worker = GDM_SESSION_WORKER (data); g_debug ("begin verification: %s %s", service, console); - queue_open (worker, service, console, hostname, username); + queue_open (worker, service, x11_display_name, console, hostname, username); } static void @@ -1689,12 +1699,20 @@ gdm_session_worker_constructor (GType type, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); + dbus_g_object_register_marshaller (gdm_marshal_VOID__STRING_STRING_STRING_STRING_STRING, + G_TYPE_NONE, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_INVALID); /* FIXME: not sure why introspection isn't working */ dbus_g_proxy_add_signal (worker->priv->server_proxy, "StartProgram", G_TYPE_STRING, G_TYPE_INVALID); dbus_g_proxy_add_signal (worker->priv->server_proxy, "SetEnvironmentVariable", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); - dbus_g_proxy_add_signal (worker->priv->server_proxy, "BeginVerification", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); - dbus_g_proxy_add_signal (worker->priv->server_proxy, "BeginVerificationForUser", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); + dbus_g_proxy_add_signal (worker->priv->server_proxy, "BeginVerification", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); + dbus_g_proxy_add_signal (worker->priv->server_proxy, "BeginVerificationForUser", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); dbus_g_proxy_connect_signal (worker->priv->server_proxy, "StartProgram", diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c index b143d557..6fc935b2 100644 --- a/daemon/gdm-session.c +++ b/daemon/gdm-session.c @@ -80,7 +80,8 @@ struct _GdmSessionPrivate char *service_name; char *username; char *hostname; - char *console_name; + char *x11_display_name; + char *display_device; DBusMessage *message_pending_reply; @@ -206,20 +207,20 @@ gdm_session_write_record (GdmSession *session, /* FIXME: I have no idea what to do for ut_id. */ strncpy (session_record.ut_id, - session->priv->console_name + - strlen (session->priv->console_name) - + session->priv->display_device + + strlen (session->priv->display_device) - sizeof (session_record.ut_id), sizeof (session_record.ut_id)); g_debug ("using id %.*s", sizeof (session_record.ut_id), session_record.ut_id); - if (g_str_has_prefix (session->priv->console_name, "/dev/")) { + if (g_str_has_prefix (session->priv->display_device, "/dev/")) { strncpy (session_record.ut_line, - session->priv->console_name + strlen ("/dev/"), + session->priv->display_device + strlen ("/dev/"), sizeof (session_record.ut_line)); - } else if (g_str_has_prefix (session->priv->console_name, ":")) { + } else if (g_str_has_prefix (session->priv->display_device, ":")) { strncpy (session_record.ut_line, - session->priv->console_name, + session->priv->display_device, sizeof (session_record.ut_line)); } @@ -232,15 +233,15 @@ gdm_session_write_record (GdmSession *session, */ hostname = NULL; if ((session->priv->hostname != NULL) && - g_str_has_prefix (session->priv->console_name, ":")) + g_str_has_prefix (session->priv->display_device, ":")) hostname = g_strdup_printf ("%s%s", session->priv->hostname, - session->priv->console_name); + session->priv->display_device); else if ((session->priv->hostname != NULL) && - !strstr (session->priv->console_name, ":")) + !strstr (session->priv->display_device, ":")) hostname = g_strdup (session->priv->hostname); - else if (!g_str_has_prefix (session->priv->console_name, ":") && - strstr (session->priv->console_name, ":")) - hostname = g_strdup (session->priv->console_name); + else if (!g_str_has_prefix (session->priv->display_device, ":") && + strstr (session->priv->display_device, ":")) + hostname = g_strdup (session->priv->display_device); if (hostname) { g_debug ("using hostname %.*s", @@ -970,13 +971,15 @@ do_introspect (DBusConnection *connection, " </method>\n" " <signal name=\"BeginVerification\">\n" " <arg name=\"service_name\" type=\"s\"/>\n" + " <arg name=\"x11_display_name\" type=\"s\"/>\n" + " <arg name=\"display_device\" type=\"s\"/>\n" " <arg name=\"hostname\" type=\"s\"/>\n" - " <arg name=\"console\" type=\"s\"/>\n" " </signal>\n" " <signal name=\"BeginVerificationForUser\">\n" " <arg name=\"service_name\" type=\"s\"/>\n" + " <arg name=\"x11_display_name\" type=\"s\"/>\n" + " <arg name=\"display_device\" type=\"s\"/>\n" " <arg name=\"hostname\" type=\"s\"/>\n" - " <arg name=\"console\" type=\"s\"/>\n" " <arg name=\"username\" type=\"s\"/>\n" " </signal>\n" " <signal name=\"StartProgram\">\n" @@ -1354,14 +1357,16 @@ gboolean gdm_session_open (GdmSession *session, const char *service_name, const char *hostname, - const char *console_name, + const char *x11_display_name, + const char *display_device, GError **error) { gboolean res; g_return_val_if_fail (session != NULL, FALSE); g_return_val_if_fail (service_name != NULL, FALSE); - g_return_val_if_fail (console_name != NULL, FALSE); + g_return_val_if_fail (x11_display_name != NULL, FALSE); + g_return_val_if_fail (display_device != NULL, FALSE); g_return_val_if_fail (hostname != NULL, FALSE); g_debug ("Openning session"); @@ -1370,7 +1375,8 @@ gdm_session_open (GdmSession *session, session->priv->service_name = g_strdup (service_name); session->priv->hostname = g_strdup (hostname); - session->priv->console_name = g_strdup (console_name); + session->priv->x11_display_name = g_strdup (x11_display_name); + session->priv->display_device = g_strdup (display_device); return res; } @@ -1389,8 +1395,9 @@ send_begin_verification (GdmSession *session) dbus_message_iter_init_append (message, &iter); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->service_name); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->x11_display_name); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->display_device); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->hostname); - dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->console_name); if (! send_dbus_message (session->priv->worker_connection, message)) { g_debug ("Could not send %s signal", "BeginVerification"); @@ -1413,8 +1420,9 @@ send_begin_verification_for_user (GdmSession *session) dbus_message_iter_init_append (message, &iter); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->service_name); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->x11_display_name); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->display_device); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->hostname); - dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->console_name); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->username); if (! send_dbus_message (session->priv->worker_connection, message)) { diff --git a/daemon/gdm-session.h b/daemon/gdm-session.h index eda71132..fc6d183d 100644 --- a/daemon/gdm-session.h +++ b/daemon/gdm-session.h @@ -102,6 +102,7 @@ GdmSession * gdm_session_new (void) G_GNUC_MALLOC; gboolean gdm_session_open (GdmSession *session, const char *service_name, const char *hostname, + const char *x11_display_name, const char *console_name, GError **error); void gdm_session_close (GdmSession *session); diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c index b6e98a08..6b8892a2 100644 --- a/daemon/gdm-simple-slave.c +++ b/daemon/gdm-simple-slave.c @@ -904,8 +904,14 @@ static void on_greeter_cancel (GdmGreeterServer *greeter_server, GdmSimpleSlave *slave) { + char *display_name; + g_debug ("Greeter cancelled"); + g_object_get (slave, + "display-name", &display_name, + NULL); + if (slave->priv->session != NULL) { gdm_session_close (slave->priv->session); g_object_unref (slave->priv->session); @@ -916,8 +922,11 @@ on_greeter_cancel (GdmGreeterServer *greeter_server, gdm_session_open (slave->priv->session, "gdm", "" /* hostname */, + display_name, "/dev/console", NULL); + + g_free (display_name); } static void @@ -925,8 +934,10 @@ on_greeter_connected (GdmGreeterServer *greeter_server, GdmSimpleSlave *slave) { gboolean display_is_local; + char *display_name; g_object_get (slave, + "display-name", &display_name, "display-is-local", &display_is_local, NULL); @@ -935,6 +946,7 @@ on_greeter_connected (GdmGreeterServer *greeter_server, gdm_session_open (slave->priv->session, "gdm", "" /* hostname */, + display_name, "/dev/console", NULL); @@ -942,6 +954,8 @@ on_greeter_connected (GdmGreeterServer *greeter_server, if ( ! display_is_local) { alarm (0); } + + g_free (display_name); } static void diff --git a/daemon/test-session.c b/daemon/test-session.c index 9896cad6..9d13361c 100644 --- a/daemon/test-session.c +++ b/daemon/test-session.c @@ -213,6 +213,7 @@ main (int argc, gdm_session_open (session, "gdm", "", + ":0", ttyname (STDIN_FILENO), NULL); |