summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Jon McCann <mccann@jhu.edu>2007-10-11 18:19:06 +0000
committerWilliam Jon McCann <mccann@src.gnome.org>2007-10-11 18:19:06 +0000
commit3573a91727af5e61e3ae93101c178cac75655bb7 (patch)
treec8e33063290e15c1685ca8ff6983ac0d98ba6a11
parent5305d0acec5de7b03fa66c1f7ab0d56f86ef0057 (diff)
downloadgdm-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
-rw-r--r--ChangeLog18
-rw-r--r--common/gdm-marshal.list1
-rw-r--r--daemon/gdm-product-slave.c16
-rw-r--r--daemon/gdm-session-worker.c42
-rw-r--r--daemon/gdm-session.c48
-rw-r--r--daemon/gdm-session.h1
-rw-r--r--daemon/gdm-simple-slave.c14
-rw-r--r--daemon/test-session.c1
8 files changed, 109 insertions, 32 deletions
diff --git a/ChangeLog b/ChangeLog
index bdff0b88..8f3dc902 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+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>
+
2007-10-10 William Jon McCann <mccann@jhu.edu>
* daemon/gdm-server.c:
diff --git a/common/gdm-marshal.list b/common/gdm-marshal.list
index 72a4fc56..3c26aacc 100644
--- a/common/gdm-marshal.list
+++ b/common/gdm-marshal.list
@@ -1,3 +1,4 @@
+VOID:STRING,STRING,STRING,STRING,STRING
VOID:STRING,STRING,STRING,STRING
VOID:STRING,STRING,STRING
VOID:STRING,STRING
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);