summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHalton Huo <halton.huo@sun.com>2009-09-15 17:23:48 +0800
committerHalton Huo <halton.huo@sun.com>2009-09-15 17:23:48 +0800
commitff0b34677e7eb3aecdd10b08e50daddec6ed3abb (patch)
tree3985242e4520262ec9732945bfb88706299c123b
parentac5fc4f2e649c5fa243a031ade4128a0544eb096 (diff)
downloadgdm-ff0b34677e7eb3aecdd10b08e50daddec6ed3abb.tar.gz
Add seat-id parameter when call OpenSessionWithParameters from GdmSessionWorker
This change is fix console-kit-daemon crash when user login with added feature "specify SEAT_ID when adding a new seat" At the same time, quering GdmDisplay D-Bus interface is a better way to get properties like display-type, seat-id. So I revert gdm_session_direct_new back without display-type.
-rw-r--r--daemon/gdm-product-slave.c4
-rw-r--r--daemon/gdm-session-direct.c221
-rw-r--r--daemon/gdm-session-direct.h1
-rw-r--r--daemon/gdm-session-worker.c19
-rw-r--r--daemon/gdm-simple-slave.c4
-rw-r--r--daemon/test-session.c1
6 files changed, 213 insertions, 37 deletions
diff --git a/daemon/gdm-product-slave.c b/daemon/gdm-product-slave.c
index c767b538..2af3a46d 100644
--- a/daemon/gdm-product-slave.c
+++ b/daemon/gdm-product-slave.c
@@ -800,7 +800,6 @@ create_new_session (GdmProductSlave *slave)
gboolean display_is_local;
char *display_id;
char *display_name;
- char *display_type;
char *display_hostname;
char *display_device;
char *display_x11_authority_file;
@@ -810,7 +809,6 @@ create_new_session (GdmProductSlave *slave)
g_object_get (slave,
"display-id", &display_id,
"display-name", &display_name,
- "display-type", &display_type,
"display-hostname", &display_hostname,
"display-is-local", &display_is_local,
"display-x11-authority-file", &display_x11_authority_file,
@@ -821,14 +819,12 @@ create_new_session (GdmProductSlave *slave)
slave->priv->session = gdm_session_direct_new (display_id,
display_name,
- display_type,
display_hostname,
display_device,
display_x11_authority_file,
display_is_local);
g_free (display_id);
g_free (display_name);
- g_free (display_type);
g_free (display_hostname);
g_free (display_device);
diff --git a/daemon/gdm-session-direct.c b/daemon/gdm-session-direct.c
index 339f335e..d6ca385a 100644
--- a/daemon/gdm-session-direct.c
+++ b/daemon/gdm-session-direct.c
@@ -53,6 +53,8 @@
#include "gdm-session-record.h"
#include "gdm-session-worker-job.h"
+#define GDM_DBUS_NAME "org.gnome.DisplayManager"
+#define GDM_DBUS_DISPLAY_INTERFACE "org.gnome.DisplayManager.Display"
#define GDM_SESSION_DBUS_PATH "/org/gnome/DisplayManager/Session"
#define GDM_SESSION_DBUS_INTERFACE "org.gnome.DisplayManager.Session"
#define GDM_SESSION_DBUS_ERROR_CANCEL "org.gnome.DisplayManager.Session.Error.Cancel"
@@ -85,16 +87,18 @@ struct _GdmSessionDirectPrivate
char *id;
char *display_id;
char *display_name;
- char *display_type;
char *display_hostname;
char *display_device;
char *display_x11_authority_file;
char *display_console_session;
+ char *display_type;
+ char *display_seat_id;
gboolean display_is_local;
DBusServer *server;
char *server_address;
GHashTable *environment;
+ DBusGProxy *display_proxy;
DBusGConnection *connection;
};
@@ -102,13 +106,14 @@ enum {
PROP_0,
PROP_DISPLAY_ID,
PROP_DISPLAY_NAME,
- PROP_DISPLAY_TYPE,
PROP_DISPLAY_HOSTNAME,
PROP_DISPLAY_IS_LOCAL,
PROP_DISPLAY_DEVICE,
PROP_DISPLAY_X11_AUTHORITY_FILE,
PROP_DISPLAY_CONSOLE_SESSION,
PROP_USER_X11_AUTHORITY_FILE,
+ PROP_DISPLAY_TYPE,
+ PROP_DISPLAY_SEAT_ID,
};
static void gdm_session_iface_init (GdmSessionIface *iface);
@@ -1301,6 +1306,7 @@ do_introspect (DBusConnection *connection,
" <arg name=\"service_name\" type=\"s\"/>\n"
" <arg name=\"x11_display_name\" type=\"s\"/>\n"
" <arg name=\"x11_display_type\" type=\"s\"/>\n"
+ " <arg name=\"x11_display_seat_id\" type=\"s\"/>\n"
" <arg name=\"display_device\" type=\"s\"/>\n"
" <arg name=\"hostname\" type=\"s\"/>\n"
" <arg name=\"x11_authority_file\" type=\"s\"/>\n"
@@ -1309,6 +1315,7 @@ do_introspect (DBusConnection *connection,
" <arg name=\"service_name\" type=\"s\"/>\n"
" <arg name=\"x11_display_name\" type=\"s\"/>\n"
" <arg name=\"x11_display_type\" type=\"s\"/>\n"
+ " <arg name=\"x11_seat_id\" type=\"s\"/>\n"
" <arg name=\"display_device\" type=\"s\"/>\n"
" <arg name=\"hostname\" type=\"s\"/>\n"
" <arg name=\"x11_authority_file\" type=\"s\"/>\n"
@@ -1692,6 +1699,7 @@ send_setup (GdmSessionDirect *session,
DBusMessageIter iter;
const char *display_name;
const char *display_type;
+ const char *display_seat_id;
const char *display_device;
const char *display_hostname;
const char *display_x11_authority_file;
@@ -1708,6 +1716,11 @@ send_setup (GdmSessionDirect *session,
} else {
display_type = "";
}
+ if (session->priv->display_seat_id!= NULL) {
+ display_seat_id = session->priv->display_seat_id;
+ } else {
+ display_seat_id = "";
+ }
if (session->priv->display_hostname != NULL) {
display_hostname = session->priv->display_hostname;
} else {
@@ -1734,6 +1747,7 @@ send_setup (GdmSessionDirect *session,
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &service_name);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_name);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_type);
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_seat_id);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_device);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_hostname);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_x11_authority_file);
@@ -1753,6 +1767,7 @@ send_setup_for_user (GdmSessionDirect *session,
DBusMessageIter iter;
const char *display_name;
const char *display_type;
+ const char *display_seat_id;
const char *display_device;
const char *display_hostname;
const char *display_x11_authority_file;
@@ -1770,6 +1785,11 @@ send_setup_for_user (GdmSessionDirect *session,
} else {
display_type = "";
}
+ if (session->priv->display_seat_id != NULL) {
+ display_seat_id = session->priv->display_seat_id;
+ } else {
+ display_seat_id = "";
+ }
if (session->priv->display_hostname != NULL) {
display_hostname = session->priv->display_hostname;
} else {
@@ -1801,6 +1821,7 @@ send_setup_for_user (GdmSessionDirect *session,
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &service_name);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_name);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_type);
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_seat_id);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_device);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_hostname);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_x11_authority_file);
@@ -2206,14 +2227,6 @@ _gdm_session_direct_set_display_name (GdmSessionDirect *session,
}
static void
-_gdm_session_direct_set_display_type (GdmSessionDirect *session,
- const char *type)
-{
- g_free (session->priv->display_type);
- session->priv->display_type = g_strdup (type);
-}
-
-static void
_gdm_session_direct_set_display_hostname (GdmSessionDirect *session,
const char *name)
{
@@ -2247,6 +2260,22 @@ _gdm_session_direct_set_display_x11_authority_file (GdmSessionDirect *session,
}
static void
+_gdm_session_direct_set_display_type (GdmSessionDirect *session,
+ const char *type)
+{
+ g_free (session->priv->display_type);
+ session->priv->display_type = g_strdup (type);
+}
+
+static void
+_gdm_session_direct_set_display_seat_id (GdmSessionDirect *session,
+ const char *sid)
+{
+ g_free (session->priv->display_seat_id);
+ session->priv->display_seat_id = g_strdup (sid);
+}
+
+static void
_gdm_session_direct_set_display_console_session (GdmSessionDirect *session,
const char *console_session)
{
@@ -2278,9 +2307,6 @@ gdm_session_direct_set_property (GObject *object,
case PROP_DISPLAY_NAME:
_gdm_session_direct_set_display_name (self, g_value_get_string (value));
break;
- case PROP_DISPLAY_TYPE:
- _gdm_session_direct_set_display_type (self, g_value_get_string (value));
- break;
case PROP_DISPLAY_HOSTNAME:
_gdm_session_direct_set_display_hostname (self, g_value_get_string (value));
break;
@@ -2299,6 +2325,12 @@ gdm_session_direct_set_property (GObject *object,
case PROP_DISPLAY_IS_LOCAL:
_gdm_session_direct_set_display_is_local (self, g_value_get_boolean (value));
break;
+ case PROP_DISPLAY_TYPE:
+ _gdm_session_direct_set_display_type (self, g_value_get_string (value));
+ break;
+ case PROP_DISPLAY_SEAT_ID:
+ _gdm_session_direct_set_display_seat_id (self, g_value_get_string (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -2322,9 +2354,6 @@ gdm_session_direct_get_property (GObject *object,
case PROP_DISPLAY_NAME:
g_value_set_string (value, self->priv->display_name);
break;
- case PROP_DISPLAY_TYPE:
- g_value_set_string (value, self->priv->display_type);
- break;
case PROP_DISPLAY_HOSTNAME:
g_value_set_string (value, self->priv->display_hostname);
break;
@@ -2343,6 +2372,12 @@ gdm_session_direct_get_property (GObject *object,
case PROP_DISPLAY_IS_LOCAL:
g_value_set_boolean (value, self->priv->display_is_local);
break;
+ case PROP_DISPLAY_TYPE:
+ g_value_set_string (value, self->priv->display_type);
+ break;
+ case PROP_DISPLAY_SEAT_ID:
+ g_value_set_string (value, self->priv->display_seat_id);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -2366,9 +2401,6 @@ gdm_session_direct_dispose (GObject *object)
g_free (session->priv->display_name);
session->priv->display_name = NULL;
- g_free (session->priv->display_type);
- session->priv->display_type = NULL;
-
g_free (session->priv->display_hostname);
session->priv->display_hostname = NULL;
@@ -2381,6 +2413,12 @@ gdm_session_direct_dispose (GObject *object)
g_free (session->priv->server_address);
session->priv->server_address = NULL;
+ g_free (session->priv->display_type);
+ session->priv->display_type = NULL;
+
+ g_free (session->priv->display_seat_id);
+ session->priv->display_seat_id = NULL;
+
if (session->priv->server != NULL) {
dbus_server_disconnect (session->priv->server);
dbus_server_unref (session->priv->server);
@@ -2392,6 +2430,11 @@ gdm_session_direct_dispose (GObject *object)
session->priv->environment = NULL;
}
+ if (session->priv->display_proxy != NULL) {
+ g_object_unref (session->priv->display_proxy);
+ }
+
+
G_OBJECT_CLASS (gdm_session_direct_parent_class)->dispose (object);
}
@@ -2521,13 +2564,6 @@ gdm_session_direct_class_init (GdmSessionDirectClass *session_class)
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
- PROP_DISPLAY_TYPE,
- g_param_spec_string ("display-type",
- "display type",
- "display type",
- NULL,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
- g_object_class_install_property (object_class,
PROP_DISPLAY_HOSTNAME,
g_param_spec_string ("display-hostname",
"display hostname",
@@ -2571,15 +2607,143 @@ gdm_session_direct_class_init (GdmSessionDirectClass *session_class)
"display device",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ g_object_class_install_property (object_class,
+ PROP_DISPLAY_TYPE,
+ g_param_spec_string ("display-type",
+ "display type",
+ "display type",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ g_object_class_install_property (object_class,
+ PROP_DISPLAY_SEAT_ID,
+ g_param_spec_string ("seat-id",
+ "seat id",
+ "seat id",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
dbus_g_object_type_install_info (GDM_TYPE_SESSION_DIRECT, &dbus_glib_gdm_session_direct_object_info);
}
+static void
+display_proxy_destroyed_cb (DBusGProxy *display_proxy,
+ GdmSessionDirect *session)
+{
+ g_debug ("GdmSessionDirect: Disconnected from display");
+
+ session->priv->display_proxy = NULL;
+}
+
+static gboolean
+init_display_data (GdmSessionDirect *session)
+{
+ gboolean res;
+ char *id;
+ GError *error;
+
+ g_assert (session->priv->display_proxy == NULL);
+
+ error = NULL;
+ session->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+ if (session->priv->connection == NULL) {
+ if (error != NULL) {
+ g_critical ("error getting system bus: %s", error->message);
+ g_error_free (error);
+ }
+ exit (1);
+ }
+
+ error = NULL;
+ session->priv->display_proxy = dbus_g_proxy_new_for_name_owner (
+ session->priv->connection,
+ GDM_DBUS_NAME,
+ session->priv->display_id,
+ GDM_DBUS_DISPLAY_INTERFACE,
+ &error);
+
+ g_signal_connect (session->priv->display_proxy,
+ "destroy",
+ G_CALLBACK (display_proxy_destroyed_cb),
+ session);
+
+ if (session->priv->display_proxy == NULL) {
+ if (error != NULL) {
+ g_warning ("Failed to create display proxy %s: %s", session->priv->display_id, error->message);
+ g_error_free (error);
+ } else {
+ g_warning ("Unable to create display proxy");
+ }
+ return FALSE;
+ }
+
+ /* Make sure display ID works */
+ error = NULL;
+ res = dbus_g_proxy_call (session->priv->display_proxy,
+ "GetId",
+ &error,
+ G_TYPE_INVALID,
+ DBUS_TYPE_G_OBJECT_PATH, &id,
+ G_TYPE_INVALID);
+ if (! res) {
+ if (error != NULL) {
+ g_warning ("Failed to get display id %s: %s", session->priv->display_id, error->message);
+ g_error_free (error);
+ } else {
+ g_warning ("Failed to get display id %s", session->priv->display_id);
+ }
+
+ return FALSE;
+ }
+
+ if (strcmp (id, session->priv->display_id) != 0) {
+ g_critical ("Display ID doesn't match");
+ exit (1);
+ }
+
+ error = NULL;
+ res = dbus_g_proxy_call (session->priv->display_proxy,
+ "GetX11DisplayType",
+ &error,
+ G_TYPE_INVALID,
+ G_TYPE_STRING, &session->priv->display_type,
+ G_TYPE_INVALID);
+ if (! res) {
+ if (error != NULL) {
+ g_warning ("Failed to get value: %s", error->message);
+ g_error_free (error);
+ } else {
+ g_warning ("Failed to get value");
+ }
+
+ return FALSE;
+ }
+
+ error = NULL;
+ res = dbus_g_proxy_call (session->priv->display_proxy,
+ "GetSeatId",
+ &error,
+ G_TYPE_INVALID,
+ G_TYPE_STRING, &session->priv->display_seat_id,
+ G_TYPE_INVALID);
+ if (! res) {
+ if (error != NULL) {
+ g_warning ("Failed to get value: %s", error->message);
+ g_error_free (error);
+ } else {
+ g_warning ("Failed to get value");
+ }
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
GdmSessionDirect *
gdm_session_direct_new (const char *display_id,
const char *display_name,
- const char *display_type,
const char *display_hostname,
const char *display_device,
const char *display_x11_authority_file,
@@ -2590,13 +2754,14 @@ gdm_session_direct_new (const char *display_id,
session = g_object_new (GDM_TYPE_SESSION_DIRECT,
"display-id", display_id,
"display-name", display_name,
- "display-type", display_type,
"display-hostname", display_hostname,
"display-device", display_device,
"display-x11-authority-file", display_x11_authority_file,
"display-is-local", display_is_local,
NULL);
+ init_display_data (session);
+
return session;
}
diff --git a/daemon/gdm-session-direct.h b/daemon/gdm-session-direct.h
index 766aa0a2..284d902f 100644
--- a/daemon/gdm-session-direct.h
+++ b/daemon/gdm-session-direct.h
@@ -50,7 +50,6 @@ GType gdm_session_direct_get_type (void);
GdmSessionDirect * gdm_session_direct_new (const char *display_id,
const char *display_name,
- const char *display_type,
const char *display_hostname,
const char *display_device,
const char *display_x11_authority_file,
diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
index cbbf8ea6..a5522b10 100644
--- a/daemon/gdm-session-worker.c
+++ b/daemon/gdm-session-worker.c
@@ -113,6 +113,7 @@ struct GdmSessionWorkerPrivate
char *service;
char *x11_display_name;
char *x11_display_type;
+ char *seat_id;
char *x11_authority_file;
char *display_device;
char *hostname;
@@ -173,6 +174,7 @@ open_ck_session (GdmSessionWorker *worker)
DBusError error;
const char *display_name;
const char *display_type;
+ const char *seat_id;
const char *display_device;
const char *display_hostname;
gboolean is_local;
@@ -187,6 +189,11 @@ open_ck_session (GdmSessionWorker *worker)
} else {
display_type = "";
}
+ if (worker->priv->seat_id != NULL) {
+ seat_id = worker->priv->seat_id;
+ } else {
+ seat_id = "";
+ }
if (worker->priv->hostname != NULL) {
display_hostname = worker->priv->hostname;
} else {
@@ -224,6 +231,7 @@ open_ck_session (GdmSessionWorker *worker)
res = ck_connector_open_session_with_parameters (worker->priv->ckc,
&error,
"display-type", &display_type,
+ "seat-id", &seat_id,
"unix-user", &pwent->pw_uid,
"x11-display", &display_name,
"x11-display-device", &display_device,
@@ -2381,6 +2389,7 @@ on_setup (GdmSessionWorker *worker,
const char *service;
const char *x11_display_name;
const char *x11_display_type;
+ const char *seat_id;
const char *x11_authority_file;
const char *console;
const char *hostname;
@@ -2397,6 +2406,7 @@ on_setup (GdmSessionWorker *worker,
DBUS_TYPE_STRING, &service,
DBUS_TYPE_STRING, &x11_display_name,
DBUS_TYPE_STRING, &x11_display_type,
+ DBUS_TYPE_STRING, &seat_id,
DBUS_TYPE_STRING, &console,
DBUS_TYPE_STRING, &hostname,
DBUS_TYPE_STRING, &x11_authority_file,
@@ -2405,6 +2415,7 @@ on_setup (GdmSessionWorker *worker,
worker->priv->service = g_strdup (service);
worker->priv->x11_display_name = g_strdup (x11_display_name);
worker->priv->x11_display_type = g_strdup (x11_display_type);
+ worker->priv->seat_id = g_strdup (seat_id);
worker->priv->x11_authority_file = g_strdup (x11_authority_file);
worker->priv->display_device = g_strdup (console);
worker->priv->hostname = g_strdup (hostname);
@@ -2426,6 +2437,7 @@ on_setup_for_user (GdmSessionWorker *worker,
const char *service;
const char *x11_display_name;
const char *x11_display_type;
+ const char *seat_id;
const char *x11_authority_file;
const char *console;
const char *hostname;
@@ -2443,6 +2455,7 @@ on_setup_for_user (GdmSessionWorker *worker,
DBUS_TYPE_STRING, &service,
DBUS_TYPE_STRING, &x11_display_name,
DBUS_TYPE_STRING, &x11_display_type,
+ DBUS_TYPE_STRING, &seat_id,
DBUS_TYPE_STRING, &console,
DBUS_TYPE_STRING, &hostname,
DBUS_TYPE_STRING, &x11_authority_file,
@@ -2452,6 +2465,7 @@ on_setup_for_user (GdmSessionWorker *worker,
worker->priv->service = g_strdup (service);
worker->priv->x11_display_name = g_strdup (x11_display_name);
worker->priv->x11_display_type = g_strdup (x11_display_type);
+ worker->priv->seat_id = g_strdup (seat_id);
worker->priv->x11_authority_file = g_strdup (x11_authority_file);
worker->priv->display_device = g_strdup (console);
worker->priv->hostname = g_strdup (hostname);
@@ -2736,6 +2750,11 @@ gdm_session_worker_finalize (GObject *object)
worker->priv->x11_display_type = NULL;
}
+ if (worker->priv->seat_id != NULL) {
+ g_free (worker->priv->seat_id);
+ worker->priv->seat_id = NULL;
+ }
+
if (worker->priv->username != NULL) {
g_free (worker->priv->username);
worker->priv->username = NULL;
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
index 11f798f5..15850a96 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -588,7 +588,6 @@ create_new_session (GdmSimpleSlave *slave)
gboolean display_is_local;
char *display_id;
char *display_name;
- char *display_type;
char *display_hostname;
char *display_device;
char *display_x11_authority_file;
@@ -598,7 +597,6 @@ create_new_session (GdmSimpleSlave *slave)
g_object_get (slave,
"display-id", &display_id,
"display-name", &display_name,
- "display-type", &display_type,
"display-hostname", &display_hostname,
"display-is-local", &display_is_local,
"display-x11-authority-file", &display_x11_authority_file,
@@ -611,7 +609,6 @@ create_new_session (GdmSimpleSlave *slave)
slave->priv->session = gdm_session_direct_new (display_id,
display_name,
- display_type,
display_hostname,
display_device,
display_x11_authority_file,
@@ -620,6 +617,7 @@ create_new_session (GdmSimpleSlave *slave)
g_free (display_name);
g_free (display_device);
g_free (display_hostname);
+ g_free (display_x11_authority_file);
g_signal_connect (slave->priv->session,
"opened",
diff --git a/daemon/test-session.c b/daemon/test-session.c
index f59ccf36..c6a158c9 100644
--- a/daemon/test-session.c
+++ b/daemon/test-session.c
@@ -244,7 +244,6 @@ main (int argc,
g_debug ("creating instance of GdmSessionDirect object...");
session = gdm_session_direct_new ("/org/gnome/DisplayManager/Display1",
":0",
- "",
g_get_host_name (),
ttyname (STDIN_FILENO),
getenv("XAUTHORITY"),