summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHalton Huo <halton.huo@sun.com>2009-05-10 22:43:06 -0400
committerRay Strode <rstrode@redhat.com>2009-08-03 15:50:56 -0400
commit6ad44e30c0e64811b1a6deff4d2aaa0499ab8c78 (patch)
treee03341952df31adca087c90f07045e7d246991e3
parentda5e38a2eca96b756164c6e00cb786aeea56af39 (diff)
downloadgdm-6ad44e30c0e64811b1a6deff4d2aaa0499ab8c78.tar.gz
Add start of display configuration
See http://bugzilla.gnome.org/show_bug.cgi?id=536355
-rw-r--r--daemon/Makefile.am2
-rw-r--r--daemon/ck-connector.c2
-rw-r--r--daemon/gdm-display.c251
-rw-r--r--daemon/gdm-display.h18
-rw-r--r--daemon/gdm-display.xml22
-rw-r--r--daemon/gdm-dynamic-display.c210
-rw-r--r--daemon/gdm-dynamic-display.h59
-rw-r--r--daemon/gdm-factory-slave.c22
-rw-r--r--daemon/gdm-greeter-session.c6
-rw-r--r--daemon/gdm-greeter-session.h4
-rw-r--r--daemon/gdm-local-display-factory.c225
-rw-r--r--daemon/gdm-local-display-factory.h17
-rw-r--r--daemon/gdm-local-display-factory.xml74
-rw-r--r--daemon/gdm-product-slave.c11
-rw-r--r--daemon/gdm-server.c416
-rw-r--r--daemon/gdm-server.h3
-rw-r--r--daemon/gdm-simple-slave.c22
-rw-r--r--daemon/gdm-slave.c40
-rw-r--r--daemon/gdm-static-display.c1
-rw-r--r--daemon/gdm-welcome-session.c59
-rw-r--r--daemon/gdm-xdmcp-chooser-display.c2
21 files changed, 1269 insertions, 197 deletions
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index 3daf9245..0a00016a 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -296,6 +296,8 @@ gdm_binary_SOURCES = \
gdm-static-display.h \
gdm-transient-display.c \
gdm-transient-display.h \
+ gdm-dynamic-display.c \
+ gdm-dynamic-display.h \
gdm-static-factory-display.c \
gdm-static-factory-display.h \
gdm-product-display.c \
diff --git a/daemon/ck-connector.c b/daemon/ck-connector.c
index 0117eb99..6f966137 100644
--- a/daemon/ck-connector.c
+++ b/daemon/ck-connector.c
@@ -76,9 +76,11 @@ static struct {
{ "display-device", DBUS_TYPE_STRING },
{ "x11-display-device", DBUS_TYPE_STRING },
{ "x11-display", DBUS_TYPE_STRING },
+ { "seat-id", DBUS_TYPE_STRING },
{ "remote-host-name", DBUS_TYPE_STRING },
{ "session-type", DBUS_TYPE_STRING },
{ "is-local", DBUS_TYPE_BOOLEAN },
+ { "is-dynamic", DBUS_TYPE_BOOLEAN },
{ "unix-user", DBUS_TYPE_INT32 },
};
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
index 53f48f98..43702615 100644
--- a/daemon/gdm-display.c
+++ b/daemon/gdm-display.c
@@ -48,12 +48,27 @@ static guint32 display_serial = 1;
#define DEFAULT_SLAVE_COMMAND LIBEXECDIR "/gdm-simple-slave"
+#if __sun
+#define GDM_PRIO_MIN 0
+#define GDM_PRIO_MAX (NZERO*2)-1
+#define GDM_PRIO_DEFAULT NZERO
+#else
+#include <sys/resource.h>
+#define GDM_PRIO_MIN PRIO_MIN
+#define GDM_PRIO_MAX PRIO_MAX
+#define GDM_PRIO_DEFAULT 0
+#endif
+
struct GdmDisplayPrivate
{
char *id;
char *seat_id;
char *remote_hostname;
+ char *x11_command;
+ char *x11_arguments;
+ char *tty_device;
+ int priority;
int x11_display_number;
char *x11_display_name;
int status;
@@ -66,6 +81,8 @@ struct GdmDisplayPrivate
GdmDisplayAccessFile *access_file;
gboolean is_local;
+ gboolean is_dynamic;
+ gboolean use_auth;
guint finish_idle_id;
GdmSlaveProxy *slave_proxy;
@@ -78,12 +95,18 @@ enum {
PROP_ID,
PROP_STATUS,
PROP_SEAT_ID,
+ PROP_X11_COMMAND,
+ PROP_X11_ARGUMENTS,
+ PROP_TTY_DEVICE,
+ PROP_PRIORITY,
PROP_REMOTE_HOSTNAME,
PROP_X11_DISPLAY_NUMBER,
PROP_X11_DISPLAY_NAME,
PROP_X11_COOKIE,
PROP_X11_AUTHORITY_FILE,
PROP_IS_LOCAL,
+ PROP_IS_DYNAMIC,
+ PROP_USE_AUTH,
PROP_SLAVE_COMMAND,
};
@@ -551,10 +574,12 @@ gdm_display_real_prepare (GdmDisplay *display)
g_assert (display->priv->slave_proxy == NULL);
- if (!gdm_display_create_authority (display)) {
- g_warning ("Unable to set up access control for display %d",
- display->priv->x11_display_number);
- return FALSE;
+ if (display->priv->use_auth) {
+ if (!gdm_display_create_authority (display)) {
+ g_warning ("Unable to set up access control for display %d",
+ display->priv->x11_display_number);
+ return FALSE;
+ }
}
_gdm_display_set_status (display, GDM_DISPLAY_PREPARED);
@@ -743,6 +768,60 @@ gdm_display_get_id (GdmDisplay *display,
}
gboolean
+gdm_display_get_x11_command (GdmDisplay *display,
+ char **command,
+ GError **error)
+{
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
+
+ if (command != NULL) {
+ *command = g_strdup (display->priv->x11_command);
+ }
+
+ return TRUE;
+}
+
+gboolean
+gdm_display_get_x11_arguments (GdmDisplay *display,
+ char **arguments,
+ GError **error)
+{
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
+
+ if (arguments != NULL) {
+ *arguments = g_strdup (display->priv->x11_arguments);
+ }
+
+ return TRUE;
+}
+
+gboolean
+gdm_display_get_tty_device (GdmDisplay *display,
+ char **tty_device,
+ GError **error)
+{
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
+
+ if (tty_device != NULL) {
+ *tty_device = g_strdup (display->priv->tty_device);
+ }
+
+ return TRUE;
+}
+
+gboolean
+gdm_display_get_priority (GdmDisplay *display,
+ int *priority,
+ GError **error)
+{
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
+
+ *priority = display->priv->priority;
+
+ return TRUE;
+}
+
+gboolean
gdm_display_get_x11_display_name (GdmDisplay *display,
char **x11_display,
GError **error)
@@ -770,6 +849,34 @@ gdm_display_is_local (GdmDisplay *display,
return TRUE;
}
+gboolean
+gdm_display_is_dynamic (GdmDisplay *display,
+ gboolean *dynamic,
+ GError **error)
+{
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
+
+ if (dynamic != NULL) {
+ *dynamic = display->priv->is_dynamic;
+ }
+
+ return TRUE;
+}
+
+gboolean
+gdm_display_use_auth (GdmDisplay *display,
+ gboolean *use_auth,
+ GError **error)
+{
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
+
+ if (use_auth != NULL) {
+ *use_auth = display->priv->use_auth;
+ }
+
+ return TRUE;
+}
+
static void
_gdm_display_set_id (GdmDisplay *display,
const char *id)
@@ -779,6 +886,43 @@ _gdm_display_set_id (GdmDisplay *display,
}
static void
+_gdm_display_set_x11_command (GdmDisplay *display,
+ const char *x11_command)
+{
+ g_free (display->priv->x11_command);
+ display->priv->x11_command = g_strdup (x11_command);
+}
+
+static void
+_gdm_display_set_x11_arguments (GdmDisplay *display,
+ const char *x11_arguments)
+{
+ g_free (display->priv->x11_arguments);
+ display->priv->x11_arguments = g_strdup (x11_arguments);
+}
+
+static void
+_gdm_display_set_tty_device (GdmDisplay *display,
+ const char *tty_device)
+{
+ g_free (display->priv->tty_device);
+ display->priv->tty_device = g_strdup (tty_device);
+}
+
+static void
+_gdm_display_set_priority (GdmDisplay *display,
+ int priority)
+{
+ /* do some bounds checking */
+ if (priority < GDM_PRIO_MIN)
+ display->priv->priority = GDM_PRIO_MIN;
+ else if (priority > GDM_PRIO_MAX)
+ display->priv->priority = GDM_PRIO_MAX;
+ else
+ display->priv->priority = priority;
+}
+
+static void
_gdm_display_set_seat_id (GdmDisplay *display,
const char *seat_id)
{
@@ -825,6 +969,20 @@ _gdm_display_set_is_local (GdmDisplay *display,
}
static void
+_gdm_display_set_is_dynamic (GdmDisplay *display,
+ gboolean is_dynamic)
+{
+ display->priv->is_dynamic = is_dynamic;
+}
+
+static void
+_gdm_display_set_use_auth (GdmDisplay *display,
+ gboolean use_auth)
+{
+ display->priv->use_auth = use_auth;
+}
+
+static void
_gdm_display_set_slave_command (GdmDisplay *display,
const char *command)
{
@@ -846,6 +1004,18 @@ gdm_display_set_property (GObject *object,
case PROP_ID:
_gdm_display_set_id (self, g_value_get_string (value));
break;
+ case PROP_X11_COMMAND:
+ _gdm_display_set_x11_command (self, g_value_get_string (value));
+ break;
+ case PROP_X11_ARGUMENTS:
+ _gdm_display_set_x11_arguments (self, g_value_get_string (value));
+ break;
+ case PROP_TTY_DEVICE:
+ _gdm_display_set_tty_device (self, g_value_get_string (value));
+ break;
+ case PROP_PRIORITY:
+ _gdm_display_set_priority (self, g_value_get_int (value));
+ break;
case PROP_STATUS:
_gdm_display_set_status (self, g_value_get_int (value));
break;
@@ -867,6 +1037,12 @@ gdm_display_set_property (GObject *object,
case PROP_IS_LOCAL:
_gdm_display_set_is_local (self, g_value_get_boolean (value));
break;
+ case PROP_IS_DYNAMIC:
+ _gdm_display_set_is_dynamic (self, g_value_get_boolean (value));
+ break;
+ case PROP_USE_AUTH:
+ _gdm_display_set_use_auth (self, g_value_get_boolean (value));
+ break;
case PROP_SLAVE_COMMAND:
_gdm_display_set_slave_command (self, g_value_get_string (value));
break;
@@ -890,6 +1066,18 @@ gdm_display_get_property (GObject *object,
case PROP_ID:
g_value_set_string (value, self->priv->id);
break;
+ case PROP_X11_COMMAND:
+ g_value_set_string (value, self->priv->x11_command);
+ break;
+ case PROP_X11_ARGUMENTS:
+ g_value_set_string (value, self->priv->x11_arguments);
+ break;
+ case PROP_TTY_DEVICE:
+ g_value_set_string (value, self->priv->tty_device);
+ break;
+ case PROP_PRIORITY:
+ g_value_set_int (value, self->priv->priority);
+ break;
case PROP_STATUS:
g_value_set_int (value, self->priv->status);
break;
@@ -915,6 +1103,12 @@ gdm_display_get_property (GObject *object,
case PROP_IS_LOCAL:
g_value_set_boolean (value, self->priv->is_local);
break;
+ case PROP_IS_DYNAMIC:
+ g_value_set_boolean (value, self->priv->is_dynamic);
+ break;
+ case PROP_USE_AUTH:
+ g_value_set_boolean (value, self->priv->use_auth);
+ break;
case PROP_SLAVE_COMMAND:
g_value_set_string (value, self->priv->slave_command);
break;
@@ -1034,6 +1228,36 @@ gdm_display_class_init (GdmDisplayClass *klass)
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
+ PROP_X11_COMMAND,
+ g_param_spec_string ("x11-command",
+ "x11 command",
+ "x11 command",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ g_object_class_install_property (object_class,
+ PROP_X11_ARGUMENTS,
+ g_param_spec_string ("x11-arguments",
+ "x11 arguments",
+ "x11 arguments",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ g_object_class_install_property (object_class,
+ PROP_TTY_DEVICE,
+ g_param_spec_string ("tty-device",
+ "tty device",
+ "tty device",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ g_object_class_install_property (object_class,
+ PROP_PRIORITY,
+ g_param_spec_int ("priority",
+ "priority",
+ "priority",
+ GDM_PRIO_MIN,
+ GDM_PRIO_MAX,
+ GDM_PRIO_DEFAULT,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ g_object_class_install_property (object_class,
PROP_REMOTE_HOSTNAME,
g_param_spec_string ("remote-hostname",
"remote-hostname",
@@ -1077,7 +1301,6 @@ gdm_display_class_init (GdmDisplayClass *klass)
"authority file",
NULL,
G_PARAM_READABLE));
-
g_object_class_install_property (object_class,
PROP_IS_LOCAL,
g_param_spec_boolean ("is-local",
@@ -1085,7 +1308,20 @@ gdm_display_class_init (GdmDisplayClass *klass)
NULL,
TRUE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-
+ g_object_class_install_property (object_class,
+ PROP_IS_DYNAMIC,
+ g_param_spec_boolean ("is-dynamic",
+ NULL,
+ NULL,
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ g_object_class_install_property (object_class,
+ PROP_USE_AUTH,
+ g_param_spec_boolean ("use-auth",
+ NULL,
+ NULL,
+ TRUE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
g_object_class_install_property (object_class,
PROP_SLAVE_COMMAND,
g_param_spec_string ("slave-command",
@@ -1132,6 +1368,9 @@ gdm_display_finalize (GObject *object)
g_debug ("GdmDisplay: Finalizing display: %s", display->priv->id);
g_free (display->priv->id);
+ g_free (display->priv->x11_command);
+ g_free (display->priv->x11_arguments);
+ g_free (display->priv->tty_device);
g_free (display->priv->seat_id);
g_free (display->priv->remote_hostname);
g_free (display->priv->x11_display_name);
diff --git a/daemon/gdm-display.h b/daemon/gdm-display.h
index 607ea1d4..5df9c658 100644
--- a/daemon/gdm-display.h
+++ b/daemon/gdm-display.h
@@ -102,6 +102,18 @@ gboolean gdm_display_unmanage (GdmDisplay *disp
gboolean gdm_display_get_id (GdmDisplay *display,
char **id,
GError **error);
+gboolean gdm_display_get_x11_command (GdmDisplay *display,
+ char **command,
+ GError **error);
+gboolean gdm_display_get_x11_arguments (GdmDisplay *display,
+ char **arguments,
+ GError **error);
+gboolean gdm_display_get_tty_device (GdmDisplay *display,
+ char **tty_device,
+ GError **error);
+gboolean gdm_display_get_priority (GdmDisplay *display,
+ int *priority,
+ GError **error);
gboolean gdm_display_get_remote_hostname (GdmDisplay *display,
char **hostname,
GError **error);
@@ -117,6 +129,12 @@ gboolean gdm_display_get_seat_id (GdmDisplay *disp
gboolean gdm_display_is_local (GdmDisplay *display,
gboolean *local,
GError **error);
+gboolean gdm_display_is_dynamic (GdmDisplay *display,
+ gboolean *dynamic,
+ GError **error);
+gboolean gdm_display_use_auth (GdmDisplay *display,
+ gboolean *use_auth,
+ GError **error);
gboolean gdm_display_get_timed_login_details (GdmDisplay *display,
gboolean *enabled,
char **username,
diff --git a/daemon/gdm-display.xml b/daemon/gdm-display.xml
index a92e37fc..a7e1f5a0 100644
--- a/daemon/gdm-display.xml
+++ b/daemon/gdm-display.xml
@@ -4,11 +4,23 @@
<method name="GetId">
<arg name="id" direction="out" type="o"/>
</method>
+ <method name="GetX11Command">
+ <arg name="command" direction="out" type="s"/>
+ </method>
+ <method name="GetX11Arguments">
+ <arg name="arguments" direction="out" type="s"/>
+ </method>
+ <method name="GetTtyDevice">
+ <arg name="tty_device" direction="out" type="s"/>
+ </method>
+ <method name="GetPriority">
+ <arg name="priority" direction="out" type="i"/>
+ </method>
<method name="GetX11DisplayName">
<arg name="name" direction="out" type="s"/>
</method>
<method name="GetX11DisplayNumber">
- <arg name="name" direction="out" type="i"/>
+ <arg name="number" direction="out" type="i"/>
</method>
<method name="GetX11Cookie">
<arg name="x11_cookie" direction="out" type="ay"/>
@@ -17,7 +29,7 @@
<arg name="filename" direction="out" type="s"/>
</method>
<method name="GetSeatId">
- <arg name="filename" direction="out" type="s"/>
+ <arg name="seat_id" direction="out" type="s"/>
</method>
<method name="GetRemoteHostname">
<arg name="hostname" direction="out" type="s"/>
@@ -25,6 +37,12 @@
<method name="IsLocal">
<arg name="local" direction="out" type="b"/>
</method>
+ <method name="IsDynamic">
+ <arg name="dynamic" direction="out" type="b"/>
+ </method>
+ <method name="UseAuth">
+ <arg name="dynamic" direction="out" type="b"/>
+ </method>
<method name="AddUserAuthorization">
<arg name="username" direction="in" type="s"/>
<arg name="filename" direction="out" type="s"/>
diff --git a/daemon/gdm-dynamic-display.c b/daemon/gdm-dynamic-display.c
new file mode 100644
index 00000000..ea07b1d6
--- /dev/null
+++ b/daemon/gdm-dynamic-display.c
@@ -0,0 +1,210 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Authors: halton.huo@sun.com
+ * Copyright (C) 2009 Sun Microsystems, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include "config.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <pwd.h>
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib-object.h>
+
+#include "gdm-common.h"
+#include "gdm-display.h"
+#include "gdm-dynamic-display.h"
+
+#define GDM_DYNAMIC_DISPLAY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_DYNAMIC_DISPLAY, GdmDynamicDisplayPrivate))
+
+struct _GdmDynamicDisplayPrivate
+{
+ gpointer dummy;
+};
+
+enum {
+ PROP_0,
+};
+
+static void gdm_dynamic_display_class_init (GdmDynamicDisplayClass *klass);
+static void gdm_dynamic_display_init (GdmDynamicDisplay *display);
+static void gdm_dynamic_display_finalize (GObject *object);
+
+G_DEFINE_TYPE (GdmDynamicDisplay, gdm_dynamic_display, GDM_TYPE_DISPLAY)
+
+static gboolean
+gdm_dynamic_display_create_authority (GdmDisplay *display)
+{
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
+
+ GDM_DISPLAY_CLASS (gdm_dynamic_display_parent_class)->create_authority (display);
+
+ return TRUE;
+}
+
+static gboolean
+gdm_dynamic_display_add_user_authorization (GdmDisplay *display,
+ const char *username,
+ char **filename,
+ GError **error)
+{
+ return GDM_DISPLAY_CLASS (gdm_dynamic_display_parent_class)->add_user_authorization (display, username, filename, error);
+}
+
+static gboolean
+gdm_dynamic_display_remove_user_authorization (GdmDisplay *display,
+ const char *username,
+ GError **error)
+{
+ return GDM_DISPLAY_CLASS (gdm_dynamic_display_parent_class)->remove_user_authorization (display, username, error);
+}
+
+static gboolean
+gdm_dynamic_display_manage (GdmDisplay *display)
+{
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
+
+ GDM_DISPLAY_CLASS (gdm_dynamic_display_parent_class)->manage (display);
+
+ return TRUE;
+}
+
+static gboolean
+gdm_dynamic_display_finish (GdmDisplay *display)
+{
+ int status;
+
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
+
+ /* restart dynamic display */
+ gdm_display_unmanage (display);
+
+ status = gdm_display_get_status (display);
+ if (status != GDM_DISPLAY_FAILED) {
+ gdm_display_manage (display);
+ }
+
+ return TRUE;
+}
+
+static gboolean
+gdm_dynamic_display_unmanage (GdmDisplay *display)
+{
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
+
+ GDM_DISPLAY_CLASS (gdm_dynamic_display_parent_class)->unmanage (display);
+
+ return TRUE;
+}
+
+static void
+gdm_dynamic_display_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (prop_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gdm_dynamic_display_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (prop_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gdm_dynamic_display_class_init (GdmDynamicDisplayClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GdmDisplayClass *display_class = GDM_DISPLAY_CLASS (klass);
+
+ object_class->get_property = gdm_dynamic_display_get_property;
+ object_class->set_property = gdm_dynamic_display_set_property;
+ object_class->finalize = gdm_dynamic_display_finalize;
+
+ display_class->create_authority = gdm_dynamic_display_create_authority;
+ display_class->add_user_authorization = gdm_dynamic_display_add_user_authorization;
+ display_class->remove_user_authorization = gdm_dynamic_display_remove_user_authorization;
+ display_class->manage = gdm_dynamic_display_manage;
+ display_class->finish = gdm_dynamic_display_finish;
+ display_class->unmanage = gdm_dynamic_display_unmanage;
+
+ g_type_class_add_private (klass, sizeof (GdmDynamicDisplayPrivate));
+
+}
+
+static void
+gdm_dynamic_display_init (GdmDynamicDisplay *display)
+{
+
+ display->priv = GDM_DYNAMIC_DISPLAY_GET_PRIVATE (display);
+}
+
+static void
+gdm_dynamic_display_finalize (GObject *object)
+{
+ GdmDynamicDisplay *display;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (GDM_IS_DYNAMIC_DISPLAY (object));
+
+ display = GDM_DYNAMIC_DISPLAY (object);
+
+ g_return_if_fail (display->priv != NULL);
+
+ G_OBJECT_CLASS (gdm_dynamic_display_parent_class)->finalize (object);
+}
+
+GdmDisplay *
+gdm_dynamic_display_new (int display_number)
+{
+ GObject *object;
+ char *x11_display;
+
+ x11_display = g_strdup_printf (":%d", display_number);
+ object = g_object_new (GDM_TYPE_DYNAMIC_DISPLAY,
+ "x11-display-number", display_number,
+ "x11-display-name", x11_display,
+ "is-dynamic", TRUE,
+ NULL);
+ g_free (x11_display);
+
+ return GDM_DISPLAY (object);
+}
diff --git a/daemon/gdm-dynamic-display.h b/daemon/gdm-dynamic-display.h
new file mode 100644
index 00000000..9595a40c
--- /dev/null
+++ b/daemon/gdm-dynamic-display.h
@@ -0,0 +1,59 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Authors: halton.huo@sun.com
+ * Copyright (C) 2009 Sun Microsystems, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+
+#ifndef __GDM_DYNAMIC_DISPLAY_H
+#define __GDM_DYNAMIC_DISPLAY_H
+
+#include <glib-object.h>
+#include <dbus/dbus-glib.h>
+#include "gdm-display.h"
+
+G_BEGIN_DECLS
+
+#define GDM_TYPE_DYNAMIC_DISPLAY (gdm_dynamic_display_get_type ())
+#define GDM_DYNAMIC_DISPLAY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_DYNAMIC_DISPLAY, GdmDynamicDisplay))
+#define GDM_DYNAMIC_DISPLAY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_DYNAMIC_DISPLAY, GdmDynamicDisplayClass))
+#define GDM_IS_DYNAMIC_DISPLAY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_DYNAMIC_DISPLAY))
+#define GDM_IS_DYNAMIC_DISPLAY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_DYNAMIC_DISPLAY))
+#define GDM_DYNAMIC_DISPLAY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_DYNAMIC_DISPLAY, GdmDynamicDisplayClass))
+
+typedef struct _GdmDynamicDisplayPrivate GdmDynamicDisplayPrivate;
+
+typedef struct
+{
+ GdmDisplay parent;
+ GdmDynamicDisplayPrivate *priv;
+} GdmDynamicDisplay;
+
+typedef struct
+{
+ GdmDisplayClass parent_class;
+
+} GdmDynamicDisplayClass;
+
+GType gdm_dynamic_display_get_type (void);
+GdmDisplay * gdm_dynamic_display_new (int display_number);
+
+
+G_END_DECLS
+
+#endif /* __GDM_DYNAMIC_DISPLAY_H */
diff --git a/daemon/gdm-factory-slave.c b/daemon/gdm-factory-slave.c
index d09c913b..f5fe731b 100644
--- a/daemon/gdm-factory-slave.c
+++ b/daemon/gdm-factory-slave.c
@@ -458,8 +458,10 @@ static void
run_greeter (GdmFactorySlave *slave)
{
gboolean display_is_local;
+ gboolean display_is_dynamic;
char *display_id;
char *display_name;
+ char *seat_id;
char *display_device;
char *display_hostname;
char *auth_file;
@@ -468,16 +470,20 @@ run_greeter (GdmFactorySlave *slave)
g_debug ("GdmFactorySlave: Running greeter");
display_is_local = FALSE;
+ display_is_dynamic = FALSE;
display_id = NULL;
display_name = NULL;
+ seat_id = NULL;
auth_file = NULL;
display_device = NULL;
display_hostname = NULL;
g_object_get (slave,
"display-is-local", &display_is_local,
+ "display-is-dynamic", &display_is_dynamic,
"display-id", &display_id,
"display-name", &display_name,
+ "seat-id", &seat_id,
"display-hostname", &display_hostname,
"display-x11-authority-file", &auth_file,
NULL);
@@ -534,9 +540,11 @@ run_greeter (GdmFactorySlave *slave)
g_debug ("GdmFactorySlave: Creating greeter on %s %s", display_name, display_device);
slave->priv->greeter = gdm_greeter_session_new (display_name,
+ seat_id,
display_device,
display_hostname,
- display_is_local);
+ display_is_local,
+ display_is_dynamic);
g_signal_connect (slave->priv->greeter,
"started",
G_CALLBACK (on_greeter_session_start),
@@ -563,6 +571,7 @@ run_greeter (GdmFactorySlave *slave)
g_free (display_id);
g_free (display_name);
+ g_free (seat_id);
g_free (display_device);
g_free (display_hostname);
g_free (auth_file);
@@ -628,14 +637,12 @@ on_server_died (GdmServer *server,
static gboolean
gdm_factory_slave_run (GdmFactorySlave *slave)
{
- char *display_name;
- char *auth_file;
+ char *display_id;
gboolean display_is_local;
g_object_get (slave,
+ "display-id", &display_id,
"display-is-local", &display_is_local,
- "display-name", &display_name,
- "display-x11-authority-file", &auth_file,
NULL);
/* if this is local display start a server if one doesn't
@@ -643,7 +650,7 @@ gdm_factory_slave_run (GdmFactorySlave *slave)
if (display_is_local) {
gboolean res;
- slave->priv->server = gdm_server_new (display_name, auth_file);
+ slave->priv->server = gdm_server_new (display_id);
g_signal_connect (slave->priv->server,
"exited",
G_CALLBACK (on_server_exited),
@@ -675,8 +682,7 @@ gdm_factory_slave_run (GdmFactorySlave *slave)
g_timeout_add (500, (GSourceFunc)idle_connect_to_display, slave);
}
- g_free (display_name);
- g_free (auth_file);
+ g_free (display_id);
return TRUE;
}
diff --git a/daemon/gdm-greeter-session.c b/daemon/gdm-greeter-session.c
index aae19285..eaec1c9e 100644
--- a/daemon/gdm-greeter-session.c
+++ b/daemon/gdm-greeter-session.c
@@ -140,9 +140,11 @@ gdm_greeter_session_finalize (GObject *object)
GdmGreeterSession *
gdm_greeter_session_new (const char *display_name,
+ const char *seat_id,
const char *display_device,
const char *display_hostname,
- gboolean display_is_local)
+ gboolean display_is_local,
+ gboolean display_is_dynamic)
{
GObject *object;
@@ -153,9 +155,11 @@ gdm_greeter_session_new (const char *display_name,
"server-env-var-name", "GDM_GREETER_DBUS_ADDRESS",
"register-ck-session", TRUE,
"x11-display-name", display_name,
+ "x11-display-seat-id", seat_id,
"x11-display-device", display_device,
"x11-display-hostname", display_hostname,
"x11-display-is-local", display_is_local,
+ "x11-display-is-dynamic", display_is_dynamic,
NULL);
return GDM_GREETER_SESSION (object);
diff --git a/daemon/gdm-greeter-session.h b/daemon/gdm-greeter-session.h
index 0a171c9b..284ae247 100644
--- a/daemon/gdm-greeter-session.h
+++ b/daemon/gdm-greeter-session.h
@@ -50,9 +50,11 @@ typedef struct
GType gdm_greeter_session_get_type (void);
GdmGreeterSession * gdm_greeter_session_new (const char *display_name,
+ const char *seat_id,
const char *display_device,
const char *display_hostname,
- gboolean display_is_local);
+ gboolean display_is_local,
+ gboolean display_is_dynamic);
G_END_DECLS
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
index 3984ada9..53f18fb3 100644
--- a/daemon/gdm-local-display-factory.c
+++ b/daemon/gdm-local-display-factory.c
@@ -33,6 +33,7 @@
#include "gdm-display-store.h"
#include "gdm-static-display.h"
+#include "gdm-dynamic-display.h"
#include "gdm-transient-display.h"
#include "gdm-static-factory-display.h"
#include "gdm-product-display.h"
@@ -53,6 +54,8 @@
#define MAX_DISPLAY_FAILURES 5
+#define IS_STR_SET(x) (x != NULL && x[0] != '\0')
+
struct GdmLocalDisplayFactoryPrivate
{
DBusGConnection *connection;
@@ -72,6 +75,10 @@ static void gdm_local_display_factory_init (GdmLocalDisplayFactory
static void gdm_local_display_factory_finalize (GObject *object);
static GdmDisplay *create_display (GdmLocalDisplayFactory *factory);
+static gboolean create_static_displays (GdmLocalDisplayFactory *factory);
+static void on_display_status_changed (GdmDisplay *display,
+ GParamSpec *arg1,
+ GdmLocalDisplayFactory *factory);
static gpointer local_display_factory_object = NULL;
@@ -185,6 +192,185 @@ store_display (GdmLocalDisplayFactory *factory,
g_hash_table_insert (factory->priv->displays, GUINT_TO_POINTER (num), NULL);
}
+static void
+store_remove_display (GdmLocalDisplayFactory *factory,
+ guint32 num,
+ GdmDisplay *display)
+{
+ GdmDisplayStore *store;
+
+ store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
+ gdm_display_store_remove (store, display);
+
+ /* remove from our reserved spot */
+ g_hash_table_remove (factory->priv->displays, GUINT_TO_POINTER (num));
+}
+
+static gboolean
+lookup_by_display_number (const char *id,
+ GdmDisplay *display,
+ gpointer data)
+{
+ gint32 number;
+ gint32 display_number = -1;
+
+ number = GPOINTER_TO_INT (data);
+
+ if (! GDM_IS_DISPLAY (display)) {
+ return FALSE;
+ }
+
+ gdm_display_get_x11_display_number (display, &display_number, NULL);
+
+ if (display_number == number) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static GdmDisplay *
+gdm_local_display_lookup_by_number (GdmLocalDisplayFactory *factory,
+ gint32 number)
+{
+ GdmDisplay *display;
+ GdmDisplayStore *store;
+
+ if (number < 0)
+ return NULL;
+
+ store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
+ display = gdm_display_store_find (store,
+ (GdmDisplayStoreFunc)lookup_by_display_number,
+ GINT_TO_POINTER (number));
+
+ return display;
+}
+
+/*
+ Example:
+ dbus-send --system --dest=org.gnome.DisplayManager \
+ --type=method_call --print-reply --reply-timeout=2000 \
+ /org/gnome/DisplayManager/LocalDisplayFactory \
+ org.gnome.DisplayManager.LocalDisplayFactory.CreateDisplay \
+ string:"/org/freedesktop/ConsoleKit/Seat1" \
+ int32:0 string:"/usr/X11/bin/Xorg" string:"-br -verbose -nolisten tcp" \
+ boolean:true int32:0 boolean:true \
+ string:"" boolean:false
+*/
+gboolean
+gdm_local_display_factory_create_display (GdmLocalDisplayFactory *factory,
+ char *sid,
+ gint32 display_number,
+ char *xserver_command,
+ char *arguments,
+ gboolean is_chooser,
+ gboolean use_auth,
+ gint32 priority,
+ char *tty_device,
+ gboolean is_dynamic,
+ char **id,
+ GError **error)
+{
+ GdmDisplay *display;
+
+ g_return_val_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory), FALSE);
+
+ if (display_number == -1)
+ display_number = take_next_display_number (factory);
+ else {
+ /* Make sure number doesn't exist */
+ }
+
+ if (is_chooser) {
+ /* TODO: Start a xdmcp chooser as request */
+
+ /* display = gdm_xdmcp_chooser_display_new (display_number); */
+ } else {
+ if (is_dynamic)
+ display = gdm_dynamic_display_new (display_number);
+ else
+ display = gdm_static_display_new (display_number);
+ }
+
+ if (display == NULL) {
+ g_warning ("Unable to create display: %d", display_number);
+ return FALSE;
+ }
+
+ if (IS_STR_SET (sid))
+ g_object_set (display, "seat-id", sid, NULL);
+ if (IS_STR_SET (xserver_command))
+ g_object_set (display, "x11-command", xserver_command, NULL);
+ if (IS_STR_SET (arguments))
+ g_object_set (display, "x11-arguments", arguments, NULL);
+ g_object_set (display, "use-auth", use_auth, NULL);
+ g_object_set (display, "priority", priority, NULL);
+ if (IS_STR_SET (tty_device))
+ g_object_set (display, "tty-device", tty_device, NULL);
+
+ store_display (factory, display_number, display);
+
+ /* let store own the ref */
+ g_object_unref (display);
+
+ if (! gdm_display_manage (display)) {
+ gdm_display_unmanage (display);
+ return FALSE;
+ }
+
+ if (! gdm_display_get_id (display, id, NULL)) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/*
+ Example:
+ dbus-send --system --dest=org.gnome.DisplayManager \
+ --type=method_call --print-reply --reply-timeout=2000 \
+ /org/gnome/DisplayManager/LocalDisplayFactory \
+ org.gnome.DisplayManager.LocalDisplayFactory.RemoveDisplay \
+ int32:101
+*/
+gboolean
+gdm_local_display_factory_remove_display (GdmLocalDisplayFactory *factory,
+ gint32 display_number,
+ GError **error)
+{
+ gboolean ret;
+ GdmDisplay *display;
+
+ g_return_val_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory), FALSE);
+
+ ret = FALSE;
+
+ /* Make sure number already exist */
+ if (! g_hash_table_lookup_extended (factory->priv->displays,
+ GINT_TO_POINTER (display_number),
+ NULL,
+ NULL)) {
+ g_debug ("GdmLocalDisplayFactory: display number doesn't exists");
+ goto out;
+ }
+
+ g_debug ("GdmLocalDisplayFactory: Removing dynamic display %d", display_number);
+
+ display = gdm_local_display_lookup_by_number (factory, display_number);
+
+ if (! gdm_display_unmanage (display)) {
+ display = NULL;
+ goto out;
+ }
+
+ store_remove_display (factory, display_number, display);
+
+ ret = TRUE;
+ out:
+ return ret;
+}
+
/*
Example:
dbus-send --system --dest=org.gnome.DisplayManager \
@@ -282,9 +468,9 @@ gdm_local_display_factory_create_product_display (GdmLocalDisplayFactory *factor
}
static void
-on_static_display_status_changed (GdmDisplay *display,
- GParamSpec *arg1,
- GdmLocalDisplayFactory *factory)
+on_display_status_changed (GdmDisplay *display,
+ GParamSpec *arg1,
+ GdmLocalDisplayFactory *factory)
{
int status;
GdmDisplayStore *store;
@@ -357,7 +543,7 @@ create_display (GdmLocalDisplayFactory *factory)
g_signal_connect (display,
"notify::status",
- G_CALLBACK (on_static_display_status_changed),
+ G_CALLBACK (on_display_status_changed),
factory);
store_display (factory, num, display);
@@ -372,6 +558,35 @@ create_display (GdmLocalDisplayFactory *factory)
return display;
}
+
+static gboolean
+create_static_displays (GdmLocalDisplayFactory *factory)
+{
+ DBusGProxy *proxy;
+ GError *error = NULL;
+
+ proxy = dbus_g_proxy_new_for_name_owner (factory->priv->connection,
+ "org.freedesktop.ConsoleKit",
+ "/org/freedesktop/ConsoleKit/Manager",
+ "org.freedesktop.ConsoleKit.Manager",
+ &error);
+
+ if (proxy == NULL) {
+ g_warning ("Failed to create a new proxy, %s", error->message);
+ g_error_free (error);
+ return FALSE;
+ }
+
+ dbus_g_proxy_call_no_reply (proxy,
+ "CreateStaticSessions",
+ G_TYPE_INVALID,
+ G_TYPE_INVALID);
+
+ g_object_unref (proxy);
+ return TRUE;
+
+}
+
#if 0
static void
create_display_for_device (GdmLocalDisplayFactory *factory,
@@ -463,7 +678,7 @@ gdm_local_display_factory_start (GdmDisplayFactory *base_factory)
#if 0
create_displays_for_pci_devices (factory);
#else
- create_display (factory);
+ create_static_displays (factory);
#endif
return ret;
diff --git a/daemon/gdm-local-display-factory.h b/daemon/gdm-local-display-factory.h
index 2abb0530..8c43b35d 100644
--- a/daemon/gdm-local-display-factory.h
+++ b/daemon/gdm-local-display-factory.h
@@ -71,6 +71,23 @@ gboolean gdm_local_display_factory_create_product_display (G
char **id,
GError **error);
+gboolean gdm_local_display_factory_create_display (GdmLocalDisplayFactory *factory,
+ char *sid,
+ gint32 display_number,
+ char *xserver_command,
+ char *arguments,
+ gboolean is_chooser,
+ gboolean use_auth,
+ gint32 priority,
+ char *tty_device,
+ gboolean is_dynamic,
+ char **id,
+ GError **error);
+
+gboolean gdm_local_display_factory_remove_display (GdmLocalDisplayFactory *factory,
+ gint32 display_number,
+ GError **error);
+
G_END_DECLS
#endif /* __GDM_LOCAL_DISPLAY_FACTORY_H */
diff --git a/daemon/gdm-local-display-factory.xml b/daemon/gdm-local-display-factory.xml
index 51f5153b..0920b856 100644
--- a/daemon/gdm-local-display-factory.xml
+++ b/daemon/gdm-local-display-factory.xml
@@ -1,11 +1,85 @@
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node name="/org/gnome/DisplayManager/LocalDisplayFactory">
<interface name="org.gnome.DisplayManager.LocalDisplayFactory">
+ <method name="CreateDisplay">
+ <arg name="sid" direction="in" type="s">
+ <doc:doc>
+ <doc:summary>The seat id. Example: /org/freedesktop/ConsoleKit/Seat1</doc:summary>
+ </doc:doc>
+ </arg>
+ <arg name="display_number" direction="in" type="i">
+ <doc:doc>
+ <doc:summary>The display number</doc:summary>
+ </doc:doc>
+ </arg>
+ <arg name="xserver_command" direction="in" type="s">
+ <doc:doc>
+ <doc:summary>The xserver command</doc:summary>
+ </doc:doc>
+ </arg>
+ <arg name="arguments" direction="in" type="s">
+ <doc:doc>
+ <doc:summary>The arguments of xserver command</doc:summary>
+ </doc:doc>
+ </arg>
+ <arg name="is_chooser" direction="in" type="b">
+ <doc:doc>
+ <doc:summary>If this value is TRUE, start a XDMCP chooser. If FALSE, start a greeter.</doc:summary>
+ </doc:doc>
+ </arg>
+ <arg name="use_auth" direction="in" type="b">
+ <doc:doc>
+ <doc:summary>If this value is TRUE, add '-auth $auth_file' argument. The auth_file is generated by GDM before spawning the X server process.</doc:summary>
+ </doc:doc>
+ </arg>
+ <arg name="priority" direction="in" type="i">
+ <doc:doc>
+ <doc:summary>X server process priority. If value is 0, not change. Values can be any integer value accepted by the setpriority C library function (normally between -20 and 20) with 0 being the default.</doc:summary>
+ </doc:doc>
+ </arg>
+ <arg name="tty_device" direction="in" type="s">
+ <doc:doc>
+ <doc:summary>Tty device used when create X server process.</doc:summary>
+ </doc:doc>
+ </arg>
+ <arg name="is_dynamic" direction="in" type="b">
+ <doc:doc>
+ <doc:summary>Whether the session is dynamically created. Only turn this parameter to TRUE when created through ck-dynamic or gdmdynamic</doc:summary>
+ </doc:doc>
+ </arg>
+ <arg name="id" direction="out" type="o">
+ <doc:doc>
+ <doc:summary>The created display id</doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>Create display with given parameters
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </method>
+
+ <method name="RemoveDisplay">
+ <arg name="display_number" direction="in" type="i">
+ <doc:doc>
+ <doc:summary>The display number</doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>Remove display with given display number
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </method>
+
<method name="CreateProductDisplay">
<arg name="parent_display_id" direction="in" type="o"/>
<arg name="relay_address" direction="in" type="s"/>
<arg name="id" direction="out" type="o"/>
</method>
+
<method name="CreateTransientDisplay">
<arg name="id" direction="out" type="o"/>
</method>
diff --git a/daemon/gdm-product-slave.c b/daemon/gdm-product-slave.c
index 9adcb09d..2af3a46d 100644
--- a/daemon/gdm-product-slave.c
+++ b/daemon/gdm-product-slave.c
@@ -415,14 +415,12 @@ on_server_died (GdmServer *server,
static gboolean
gdm_product_slave_create_server (GdmProductSlave *slave)
{
- char *display_name;
- char *auth_file;
+ char *display_id;
gboolean display_is_local;
g_object_get (slave,
+ "display-id", &display_id,
"display-is-local", &display_is_local,
- "display-name", &display_name,
- "display-x11-authority-file", &auth_file,
NULL);
/* if this is local display start a server if one doesn't
@@ -430,7 +428,7 @@ gdm_product_slave_create_server (GdmProductSlave *slave)
if (display_is_local) {
gboolean res;
- slave->priv->server = gdm_server_new (display_name, auth_file);
+ slave->priv->server = gdm_server_new (display_id);
g_signal_connect (slave->priv->server,
"exited",
G_CALLBACK (on_server_exited),
@@ -462,8 +460,7 @@ gdm_product_slave_create_server (GdmProductSlave *slave)
g_timeout_add (500, (GSourceFunc)idle_connect_to_display, slave);
}
- g_free (display_name);
- g_free (auth_file);
+ g_free (display_id);
return TRUE;
}
diff --git a/daemon/gdm-server.c b/daemon/gdm-server.c
index ba10386b..bedf038d 100644
--- a/daemon/gdm-server.c
+++ b/daemon/gdm-server.c
@@ -39,6 +39,8 @@
#include <glib/gstdio.h>
#include <glib-object.h>
+#include <dbus/dbus-glib.h>
+
#include <X11/Xlib.h> /* for Display */
#include "gdm-common.h"
@@ -50,6 +52,9 @@ extern char **environ;
#define GDM_SERVER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_SERVER, GdmServerPrivate))
+#define GDM_DBUS_NAME "org.gnome.DisplayManager"
+#define GDM_DBUS_DISPLAY_INTERFACE "org.gnome.DisplayManager.Display"
+
/* These are the servstat values, also used as server
* process exit codes */
#define SERVER_TIMEOUT 2 /* Server didn't start */
@@ -62,42 +67,37 @@ extern char **environ;
struct GdmServerPrivate
{
- char *command;
GPid pid;
- gboolean disable_tcp;
- int priority;
char *user_name;
- char *session_args;
-
char *log_dir;
+ gboolean disable_tcp;
+
+ /* cached display values */
+ char *display_id;
+ char *command;
+ char *session_args;
+ char *tty_device;
char *display_name;
- char *display_device;
char *auth_file;
+ int priority;
+
+ char *display_device;
gboolean is_parented;
char *parent_display_name;
char *parent_auth_file;
- char *chosen_hostname;
guint child_watch_id;
};
enum {
PROP_0,
- PROP_DISPLAY_NAME,
- PROP_DISPLAY_DEVICE,
- PROP_AUTH_FILE,
- PROP_IS_PARENTED,
- PROP_PARENT_DISPLAY_NAME,
- PROP_PARENT_AUTH_FILE,
- PROP_CHOSEN_HOSTNAME,
- PROP_COMMAND,
- PROP_PRIORITY,
PROP_USER_NAME,
- PROP_SESSION_ARGS,
PROP_LOG_DIR,
PROP_DISABLE_TCP,
+ PROP_DISPLAY_ID,
+ PROP_DISPLAY_DEVICE,
};
enum {
@@ -252,72 +252,48 @@ connect_to_parent (GdmServer *server)
static gboolean
gdm_server_resolve_command_line (GdmServer *server,
- const char *vtarg,
int *argcp,
char ***argvp)
{
- int argc;
- char **argv;
- int len;
- int i;
- gboolean gotvtarg = FALSE;
- gboolean query_in_arglist = FALSE;
-
- g_shell_parse_argv (server->priv->command, &argc, &argv, NULL);
-
- for (len = 0; argv != NULL && argv[len] != NULL; len++) {
- char *arg = argv[len];
-
- /* HACK! Not to add vt argument to servers that already force
- * allocation. Mostly for backwards compat only */
- if (strncmp (arg, "vt", 2) == 0 &&
- isdigit (arg[2]) &&
- (arg[3] == '\0' ||
- (isdigit (arg[3]) && arg[4] == '\0')))
- gotvtarg = TRUE;
- if (strcmp (arg, "-query") == 0 ||
- strcmp (arg, "-indirect") == 0)
- query_in_arglist = TRUE;
- }
-
- argv = g_renew (char *, argv, len + 10);
- /* shift args down one */
- for (i = len - 1; i >= 1; i--) {
- argv[i+1] = argv[i];
+ gboolean ret;
+ char *command = NULL;
+ char *tmp = NULL;
+
+ if (server->priv->session_args != NULL) {
+ command = g_strdup_printf ("%s %s %s",
+ server->priv->command,
+ server->priv->display_name,
+ server->priv->session_args);
+ } else {
+ command = g_strdup_printf ("%s %s",
+ server->priv->command,
+ server->priv->display_name);
}
- /* server number is the FIRST argument, before any others */
- argv[1] = g_strdup (server->priv->display_name);
- len++;
-
if (server->priv->auth_file != NULL) {
- argv[len++] = g_strdup ("-auth");
- argv[len++] = g_strdup (server->priv->auth_file);
+ tmp = g_strdup (command);
+ g_free (command);
+ command = g_strdup_printf ("%s -auth %s ",
+ tmp, server->priv->auth_file);
+ g_free (tmp);
}
-
- if (server->priv->chosen_hostname) {
- /* run just one session */
- argv[len++] = g_strdup ("-terminate");
- argv[len++] = g_strdup ("-query");
- argv[len++] = g_strdup (server->priv->chosen_hostname);
- query_in_arglist = TRUE;
- }
-
- if (server->priv->disable_tcp && ! query_in_arglist) {
- argv[len++] = g_strdup ("-nolisten");
- argv[len++] = g_strdup ("tcp");
- }
-
- if (vtarg != NULL && ! gotvtarg) {
- argv[len++] = g_strdup (vtarg);
+#ifndef __sun
+ /* TODO:
+ Solaris Xorg does not accept vt argument, remove #ifndef
+ when VT part for Xorg goes into Solaris.
+ */
+ if (server->priv->tty_device != NULL) {
+ tmp = g_strdup (command);
+ g_free (command);
+ command = g_strdup_printf ("%s %s", tmp, server->priv->tty_device);
+ g_free (tmp);
}
+#endif
- argv[len++] = NULL;
-
- *argvp = argv;
- *argcp = len;
+ ret = g_shell_parse_argv (command, argcp, argvp, NULL);
+ g_free (command);
- return TRUE;
+ return ret;
}
static void
@@ -464,7 +440,14 @@ server_child_setup (GdmServer *server)
sigemptyset (&mask);
sigprocmask (SIG_SETMASK, &mask, NULL);
- if (server->priv->priority != 0) {
+#if __sun
+#define GDM_PRIO_DEFAULT NZERO
+#else
+#include <sys/resource.h>
+#define GDM_PRIO_DEFAULT 0
+#endif
+
+ if (server->priv->priority != GDM_PRIO_DEFAULT) {
if (setpriority (PRIO_PROCESS, 0, server->priv->priority)) {
g_warning (_("%s: Server priority couldn't be set to %d: %s"),
"gdm_server_spawn",
@@ -543,30 +526,6 @@ get_server_environment (GdmServer *server)
}
static void
-server_add_xserver_args (GdmServer *server,
- int *argc,
- char ***argv)
-{
- int count;
- char **args;
- int len;
- int i;
-
- len = *argc;
- g_shell_parse_argv (server->priv->session_args, &count, &args, NULL);
- *argv = g_renew (char *, *argv, len + count + 1);
-
- for (i=0; i < count;i++) {
- *argv[len++] = g_strdup (args[i]);
- }
-
- *argc += count;
-
- argv[len] = NULL;
- g_strfreev (args);
-}
-
-static void
server_child_watch (GPid pid,
int status,
GdmServer *server)
@@ -593,8 +552,7 @@ server_child_watch (GPid pid,
}
static gboolean
-gdm_server_spawn (GdmServer *server,
- const char *vtarg)
+gdm_server_spawn (GdmServer *server)
{
int argc;
gchar **argv = NULL;
@@ -609,14 +567,9 @@ gdm_server_spawn (GdmServer *server,
argv = NULL;
argc = 0;
gdm_server_resolve_command_line (server,
- vtarg,
&argc,
&argv);
- if (server->priv->session_args) {
- server_add_xserver_args (server, &argc, &argv);
- }
-
if (argv[0] == NULL) {
g_warning (_("%s: Empty server command for display %s"),
"gdm_server_spawn",
@@ -676,7 +629,7 @@ gdm_server_start (GdmServer *server)
gboolean res;
/* fork X server process */
- res = gdm_server_spawn (server, NULL);
+ res = gdm_server_spawn (server);
return res;
}
@@ -733,21 +686,12 @@ gdm_server_stop (GdmServer *server)
return TRUE;
}
-
-static void
-_gdm_server_set_display_name (GdmServer *server,
- const char *name)
-{
- g_free (server->priv->display_name);
- server->priv->display_name = g_strdup (name);
-}
-
static void
-_gdm_server_set_auth_file (GdmServer *server,
- const char *auth_file)
+_gdm_server_set_display_id (GdmServer *server,
+ const char *id)
{
- g_free (server->priv->auth_file);
- server->priv->auth_file = g_strdup (auth_file);
+ g_free (server->priv->display_id);
+ server->priv->display_id = g_strdup (id);
}
static void
@@ -776,11 +720,8 @@ gdm_server_set_property (GObject *object,
self = GDM_SERVER (object);
switch (prop_id) {
- case PROP_DISPLAY_NAME:
- _gdm_server_set_display_name (self, g_value_get_string (value));
- break;
- case PROP_AUTH_FILE:
- _gdm_server_set_auth_file (self, g_value_get_string (value));
+ case PROP_DISPLAY_ID:
+ _gdm_server_set_display_id (self, g_value_get_string (value));
break;
case PROP_USER_NAME:
_gdm_server_set_user_name (self, g_value_get_string (value));
@@ -805,16 +746,13 @@ gdm_server_get_property (GObject *object,
self = GDM_SERVER (object);
switch (prop_id) {
- case PROP_DISPLAY_NAME:
- g_value_set_string (value, self->priv->display_name);
+ case PROP_DISPLAY_ID:
+ g_value_set_string (value, self->priv->display_id);
break;
case PROP_DISPLAY_DEVICE:
g_value_take_string (value,
gdm_server_get_display_device (self));
break;
- case PROP_AUTH_FILE:
- g_value_set_string (value, self->priv->auth_file);
- break;
case PROP_USER_NAME:
g_value_set_string (value, self->priv->user_name);
break;
@@ -886,10 +824,10 @@ gdm_server_class_init (GdmServerClass *klass)
G_TYPE_INT);
g_object_class_install_property (object_class,
- PROP_DISPLAY_NAME,
- g_param_spec_string ("display-name",
- "name",
- "name",
+ PROP_DISPLAY_ID,
+ g_param_spec_string ("display-id",
+ "display id",
+ "display id",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
@@ -900,14 +838,6 @@ gdm_server_class_init (GdmServerClass *klass)
NULL,
G_PARAM_READABLE));
g_object_class_install_property (object_class,
- PROP_AUTH_FILE,
- g_param_spec_string ("auth-file",
- "Authorization File",
- "Path to X authorization file",
- NULL,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-
- g_object_class_install_property (object_class,
PROP_USER_NAME,
g_param_spec_string ("user-name",
"user name",
@@ -922,19 +852,13 @@ gdm_server_class_init (GdmServerClass *klass)
TRUE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
}
static void
gdm_server_init (GdmServer *server)
{
-
server->priv = GDM_SERVER_GET_PRIVATE (server);
-
- server->priv->pid = -1;
- server->priv->command = g_strdup (X_SERVER " -br -verbose");
- server->priv->log_dir = g_strdup (LOGDIR);
-
- add_ready_handler (server);
}
static void
@@ -953,19 +877,203 @@ gdm_server_finalize (GObject *object)
gdm_server_stop (server);
+ g_free (server->priv->command);
+ g_free (server->priv->log_dir);
+
G_OBJECT_CLASS (gdm_server_parent_class)->finalize (object);
}
GdmServer *
-gdm_server_new (const char *display_name,
- const char *auth_file)
+gdm_server_new (const char *display_id)
{
- GObject *object;
+ GObject *object;
+ GdmServer *server;
+ DBusGConnection *connection;
+ DBusGProxy *proxy;
+ GError *error;
+ gboolean res;
+ char *id;
object = g_object_new (GDM_TYPE_SERVER,
- "display-name", display_name,
- "auth-file", auth_file,
+ "display-id", display_id,
NULL);
- return GDM_SERVER (object);
+ server = GDM_SERVER (object);
+
+ server->priv->pid = -1;
+ server->priv->log_dir = g_strdup (LOGDIR);
+
+ g_assert (server->priv->display_id != NULL);
+
+ error = NULL;
+ connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+ if (connection == NULL) {
+ if (error != NULL) {
+ g_critical ("error getting system bus: %s", error->message);
+ g_error_free (error);
+ }
+
+ exit (1);
+ }
+
+ g_debug ("GdmServer: Creating proxy for %s", server->priv->display_id);
+ error = NULL;
+ proxy = dbus_g_proxy_new_for_name_owner (connection,
+ GDM_DBUS_NAME,
+ server->priv->display_id,
+ GDM_DBUS_DISPLAY_INTERFACE,
+ &error);
+ if (proxy == NULL) {
+ if (error != NULL) {
+ g_warning ("Failed to create display proxy %s: %s", server->priv->display_id, error->message);
+ g_error_free (error);
+ } else {
+ g_warning ("Unable to create display proxy");
+ }
+
+ exit (1);
+ }
+
+ /* cache some values up front */
+ error = NULL;
+ res = dbus_g_proxy_call (proxy,
+ "GetX11DisplayName",
+ &error,
+ G_TYPE_INVALID,
+ G_TYPE_STRING, &server->priv->display_name,
+ 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");
+ }
+
+ exit (1);
+ }
+
+ /* If display_name is not set, quit */
+ if (! server->priv->display_name || (strlen (server->priv->display_name) == 0)) {
+ g_warning ("Wrong value of method GetX11DisplayName for %s",server->priv->display_id);
+ exit (1);
+ }
+
+ error = NULL;
+ res = dbus_g_proxy_call (proxy,
+ "GetX11Command",
+ &error,
+ G_TYPE_INVALID,
+ G_TYPE_STRING, &server->priv->command,
+ 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");
+ }
+
+ exit (1);
+ }
+
+ /* If command is not set, set it X_SERVER */
+ if (! server->priv->command || (strlen (server->priv->command) == 0)) {
+ g_free (server->priv->command);
+ server->priv->command = g_strdup (X_SERVER);
+ }
+
+ error = NULL;
+ res = dbus_g_proxy_call (proxy,
+ "GetX11Arguments",
+ &error,
+ G_TYPE_INVALID,
+ G_TYPE_STRING, &server->priv->session_args,
+ 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");
+ }
+
+ exit (1);
+ }
+
+ /* If session_args is not set, set it NULL */
+ if (server->priv->session_args && (strlen (server->priv->session_args ) == 0)) {
+ g_free (server->priv->session_args);
+ server->priv->session_args = NULL;
+ }
+
+ error = NULL;
+ res = dbus_g_proxy_call (proxy,
+ "GetTtyDevice",
+ &error,
+ G_TYPE_INVALID,
+ G_TYPE_STRING, &server->priv->tty_device,
+ 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");
+ }
+
+ exit (1);
+ }
+
+ /* If tty_device is not set, set it NULL */
+ if (server->priv->tty_device && (strlen (server->priv->tty_device) == 0)) {
+ g_free (server->priv->tty_device);
+ server->priv->tty_device = NULL;
+ }
+
+ error = NULL;
+ res = dbus_g_proxy_call (proxy,
+ "GetPriority",
+ &error,
+ G_TYPE_INVALID,
+ G_TYPE_INT, &server->priv->priority,
+ 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");
+ }
+
+ exit (1);
+ }
+
+ error = NULL;
+ res = dbus_g_proxy_call (proxy,
+ "GetX11AuthorityFile",
+ &error,
+ G_TYPE_INVALID,
+ G_TYPE_STRING, &server->priv->auth_file,
+ 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");
+ }
+
+ exit (1);
+ }
+
+ /* If tty_device is not set, set it NULL */
+ if (server->priv->auth_file && (strlen (server->priv->auth_file) == 0)) {
+ g_free (server->priv->auth_file);
+ server->priv->auth_file = NULL;
+ }
+
+ add_ready_handler (server);
+
+ return server;
}
diff --git a/daemon/gdm-server.h b/daemon/gdm-server.h
index 535a69a4..84feb1f1 100644
--- a/daemon/gdm-server.h
+++ b/daemon/gdm-server.h
@@ -53,8 +53,7 @@ typedef struct
} GdmServerClass;
GType gdm_server_get_type (void);
-GdmServer * gdm_server_new (const char *display_id,
- const char *auth_file);
+GdmServer * gdm_server_new (const char *display_id);
gboolean gdm_server_start (GdmServer *server);
gboolean gdm_server_stop (GdmServer *server);
char * gdm_server_get_display_device (GdmServer *server);
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
index 8b161bbf..e15cb9ca 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -865,8 +865,10 @@ static void
start_greeter (GdmSimpleSlave *slave)
{
gboolean display_is_local;
+ gboolean display_is_dynamic;
char *display_id;
char *display_name;
+ char *seat_id;
char *display_device;
char *display_hostname;
char *auth_file;
@@ -876,8 +878,10 @@ start_greeter (GdmSimpleSlave *slave)
g_debug ("GdmSimpleSlave: Running greeter");
display_is_local = FALSE;
+ display_is_dynamic = FALSE;
display_id = NULL;
display_name = NULL;
+ seat_id = NULL;
auth_file = NULL;
display_device = NULL;
display_hostname = NULL;
@@ -885,7 +889,9 @@ start_greeter (GdmSimpleSlave *slave)
g_object_get (slave,
"display-id", &display_id,
"display-is-local", &display_is_local,
+ "display-is-dynamic", &display_is_dynamic,
"display-name", &display_name,
+ "display-seat-id", &seat_id,
"display-hostname", &display_hostname,
"display-x11-authority-file", &auth_file,
NULL);
@@ -967,9 +973,11 @@ start_greeter (GdmSimpleSlave *slave)
g_debug ("GdmSimpleSlave: Creating greeter on %s %s %s", display_name, display_device, display_hostname);
slave->priv->greeter = gdm_greeter_session_new (display_name,
+ seat_id,
display_device,
display_hostname,
- display_is_local);
+ display_is_local,
+ display_is_dynamic);
g_signal_connect (slave->priv->greeter,
"started",
G_CALLBACK (on_greeter_session_start),
@@ -994,6 +1002,7 @@ start_greeter (GdmSimpleSlave *slave)
g_free (display_id);
g_free (display_name);
+ g_free (seat_id);
g_free (display_device);
g_free (display_hostname);
g_free (auth_file);
@@ -1067,14 +1076,12 @@ on_server_died (GdmServer *server,
static gboolean
gdm_simple_slave_run (GdmSimpleSlave *slave)
{
- char *display_name;
- char *auth_file;
+ char *display_id;
gboolean display_is_local;
g_object_get (slave,
+ "display-id", &display_id,
"display-is-local", &display_is_local,
- "display-name", &display_name,
- "display-x11-authority-file", &auth_file,
NULL);
/* if this is local display start a server if one doesn't
@@ -1083,7 +1090,7 @@ gdm_simple_slave_run (GdmSimpleSlave *slave)
gboolean res;
gboolean disable_tcp;
- slave->priv->server = gdm_server_new (display_name, auth_file);
+ slave->priv->server = gdm_server_new (display_id);
disable_tcp = TRUE;
if (gdm_settings_client_get_boolean (GDM_KEY_DISALLOW_TCP,
@@ -1124,8 +1131,7 @@ gdm_simple_slave_run (GdmSimpleSlave *slave)
g_timeout_add (500, (GSourceFunc)idle_connect_to_display, slave);
}
- g_free (display_name);
- g_free (auth_file);
+ g_free (display_id);
return TRUE;
}
diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
index 477b42db..13864b77 100644
--- a/daemon/gdm-slave.c
+++ b/daemon/gdm-slave.c
@@ -82,6 +82,7 @@ struct GdmSlavePrivate
int display_number;
char *display_hostname;
gboolean display_is_local;
+ gboolean display_is_dynamic;
gboolean display_is_parented;
char *display_seat_id;
char *display_x11_authority_file;
@@ -101,6 +102,7 @@ enum {
PROP_DISPLAY_NUMBER,
PROP_DISPLAY_HOSTNAME,
PROP_DISPLAY_IS_LOCAL,
+ PROP_DISPLAY_IS_DYNAMIC,
PROP_DISPLAY_SEAT_ID,
PROP_DISPLAY_X11_AUTHORITY_FILE
};
@@ -548,6 +550,24 @@ gdm_slave_real_start (GdmSlave *slave)
error = NULL;
res = dbus_g_proxy_call (slave->priv->display_proxy,
+ "IsDynamic",
+ &error,
+ G_TYPE_INVALID,
+ G_TYPE_BOOLEAN, &slave->priv->display_is_dynamic,
+ 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 (slave->priv->display_proxy,
"GetX11DisplayName",
&error,
G_TYPE_INVALID,
@@ -1218,6 +1238,13 @@ _gdm_slave_set_display_is_local (GdmSlave *slave,
}
static void
+_gdm_slave_set_display_is_dynamic (GdmSlave *slave,
+ gboolean is)
+{
+ slave->priv->display_is_dynamic = is;
+}
+
+static void
gdm_slave_set_property (GObject *object,
guint prop_id,
const GValue *value,
@@ -1249,6 +1276,9 @@ gdm_slave_set_property (GObject *object,
case PROP_DISPLAY_IS_LOCAL:
_gdm_slave_set_display_is_local (self, g_value_get_boolean (value));
break;
+ case PROP_DISPLAY_IS_DYNAMIC:
+ _gdm_slave_set_display_is_dynamic (self, g_value_get_boolean (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1287,6 +1317,9 @@ gdm_slave_get_property (GObject *object,
case PROP_DISPLAY_IS_LOCAL:
g_value_set_boolean (value, self->priv->display_is_local);
break;
+ case PROP_DISPLAY_IS_DYNAMIC:
+ g_value_set_boolean (value, self->priv->display_is_dynamic);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1411,6 +1444,13 @@ gdm_slave_class_init (GdmSlaveClass *klass)
"display is local",
TRUE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ g_object_class_install_property (object_class,
+ PROP_DISPLAY_IS_DYNAMIC,
+ g_param_spec_boolean ("display-is-dynamic",
+ "display is dynamic",
+ "display is dynamic",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
signals [STOPPED] =
g_signal_new ("stopped",
diff --git a/daemon/gdm-static-display.c b/daemon/gdm-static-display.c
index a747ee36..9e5874a2 100644
--- a/daemon/gdm-static-display.c
+++ b/daemon/gdm-static-display.c
@@ -224,6 +224,7 @@ gdm_static_display_new (int display_number)
object = g_object_new (GDM_TYPE_STATIC_DISPLAY,
"x11-display-number", display_number,
"x11-display-name", x11_display,
+ "is-dynamic", FALSE,
NULL);
g_free (x11_display);
diff --git a/daemon/gdm-welcome-session.c b/daemon/gdm-welcome-session.c
index b58e8552..14558c13 100644
--- a/daemon/gdm-welcome-session.c
+++ b/daemon/gdm-welcome-session.c
@@ -65,10 +65,12 @@ struct GdmWelcomeSessionPrivate
char *group_name;
char *x11_display_name;
+ char *x11_display_seat_id;
char *x11_display_device;
char *x11_display_hostname;
char *x11_authority_file;
gboolean x11_display_is_local;
+ gboolean x11_display_is_dynamic;
guint child_watch_id;
@@ -85,10 +87,12 @@ struct GdmWelcomeSessionPrivate
enum {
PROP_0,
PROP_X11_DISPLAY_NAME,
+ PROP_X11_DISPLAY_SEAT_ID,
PROP_X11_DISPLAY_DEVICE,
PROP_X11_DISPLAY_HOSTNAME,
PROP_X11_AUTHORITY_FILE,
PROP_X11_DISPLAY_IS_LOCAL,
+ PROP_X11_DISPLAY_IS_DYNAMIC,
PROP_USER_NAME,
PROP_GROUP_NAME,
PROP_SERVER_ADDRESS,
@@ -133,6 +137,7 @@ open_welcome_session (GdmWelcomeSession *welcome_session)
const char *session_type;
const char *hostname;
const char *x11_display_device;
+ const char *seat_id;
int res;
gboolean ret;
DBusError error;
@@ -168,12 +173,19 @@ open_welcome_session (GdmWelcomeSession *welcome_session)
x11_display_device = "";
}
- g_debug ("GdmWelcomeSession: Opening ConsoleKit session for user:%d x11-display:'%s' x11-display-device:'%s' remote-host-name:'%s' is-local:%d",
+ if (welcome_session->priv->x11_display_seat_id != NULL) {
+ seat_id = welcome_session->priv->x11_display_seat_id;
+ } else {
+ seat_id = "";
+ }
+
+ g_debug ("GdmWelcomeSession: Opening ConsoleKit session for user:%d x11-display:'%s' x11-display-device:'%s' remote-host-name:'%s' is-local:%d is-dynamic:%d",
pwent->pw_uid,
welcome_session->priv->x11_display_name,
x11_display_device,
hostname,
- welcome_session->priv->x11_display_is_local);
+ welcome_session->priv->x11_display_is_local,
+ welcome_session->priv->x11_display_is_dynamic);
dbus_error_init (&error);
res = ck_connector_open_session_with_parameters (welcome_session->priv->ckc,
@@ -181,9 +193,11 @@ open_welcome_session (GdmWelcomeSession *welcome_session)
"unix-user", &pwent->pw_uid,
"session-type", &session_type,
"x11-display", &welcome_session->priv->x11_display_name,
+ "seat-id", &seat_id,
"x11-display-device", &x11_display_device,
"remote-host-name", &hostname,
"is-local", &welcome_session->priv->x11_display_is_local,
+ "is-dynamic", &welcome_session->priv->x11_display_is_dynamic,
NULL);
if (! res) {
if (dbus_error_is_set (&error)) {
@@ -880,6 +894,14 @@ _gdm_welcome_session_set_x11_display_name (GdmWelcomeSession *welcome_session,
}
static void
+_gdm_welcome_session_set_x11_display_seat_id (GdmWelcomeSession *welcome_session,
+ const char *sid)
+{
+ g_free (welcome_session->priv->x11_display_seat_id);
+ welcome_session->priv->x11_display_seat_id = g_strdup (sid);
+}
+
+static void
_gdm_welcome_session_set_x11_display_hostname (GdmWelcomeSession *welcome_session,
const char *name)
{
@@ -902,6 +924,12 @@ _gdm_welcome_session_set_x11_display_is_local (GdmWelcomeSession *welcome_sessio
welcome_session->priv->x11_display_is_local = is_local;
}
+static void
+_gdm_welcome_session_set_x11_display_is_dynamic (GdmWelcomeSession *welcome_session,
+ gboolean is_dynamic)
+{
+ welcome_session->priv->x11_display_is_dynamic = is_dynamic;
+}
static void
_gdm_welcome_session_set_x11_authority_file (GdmWelcomeSession *welcome_session,
@@ -980,6 +1008,9 @@ gdm_welcome_session_set_property (GObject *object,
case PROP_X11_DISPLAY_NAME:
_gdm_welcome_session_set_x11_display_name (self, g_value_get_string (value));
break;
+ case PROP_X11_DISPLAY_SEAT_ID:
+ _gdm_welcome_session_set_x11_display_seat_id (self, g_value_get_string (value));
+ break;
case PROP_X11_DISPLAY_HOSTNAME:
_gdm_welcome_session_set_x11_display_hostname (self, g_value_get_string (value));
break;
@@ -989,6 +1020,9 @@ gdm_welcome_session_set_property (GObject *object,
case PROP_X11_DISPLAY_IS_LOCAL:
_gdm_welcome_session_set_x11_display_is_local (self, g_value_get_boolean (value));
break;
+ case PROP_X11_DISPLAY_IS_DYNAMIC:
+ _gdm_welcome_session_set_x11_display_is_dynamic (self, g_value_get_boolean (value));
+ break;
case PROP_X11_AUTHORITY_FILE:
_gdm_welcome_session_set_x11_authority_file (self, g_value_get_string (value));
break;
@@ -1036,6 +1070,9 @@ gdm_welcome_session_get_property (GObject *object,
case PROP_X11_DISPLAY_NAME:
g_value_set_string (value, self->priv->x11_display_name);
break;
+ case PROP_X11_DISPLAY_SEAT_ID:
+ g_value_set_string (value, self->priv->x11_display_seat_id);
+ break;
case PROP_X11_DISPLAY_HOSTNAME:
g_value_set_string (value, self->priv->x11_display_hostname);
break;
@@ -1045,6 +1082,9 @@ gdm_welcome_session_get_property (GObject *object,
case PROP_X11_DISPLAY_IS_LOCAL:
g_value_set_boolean (value, self->priv->x11_display_is_local);
break;
+ case PROP_X11_DISPLAY_IS_DYNAMIC:
+ g_value_set_boolean (value, self->priv->x11_display_is_dynamic);
+ break;
case PROP_X11_AUTHORITY_FILE:
g_value_set_string (value, self->priv->x11_authority_file);
break;
@@ -1112,6 +1152,13 @@ gdm_welcome_session_class_init (GdmWelcomeSessionClass *klass)
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
+ PROP_X11_DISPLAY_SEAT_ID,
+ g_param_spec_string ("x11-display-seat-id",
+ "seat id",
+ "seat id",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ g_object_class_install_property (object_class,
PROP_X11_DISPLAY_HOSTNAME,
g_param_spec_string ("x11-display-hostname",
"hostname",
@@ -1133,6 +1180,13 @@ gdm_welcome_session_class_init (GdmWelcomeSessionClass *klass)
FALSE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
+ PROP_X11_DISPLAY_IS_DYNAMIC,
+ g_param_spec_boolean ("x11-display-is-dynamic",
+ "is dynamic",
+ "is dynamic",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ g_object_class_install_property (object_class,
PROP_X11_AUTHORITY_FILE,
g_param_spec_string ("x11-authority-file",
"authority file",
@@ -1268,6 +1322,7 @@ gdm_welcome_session_finalize (GObject *object)
g_free (welcome_session->priv->user_name);
g_free (welcome_session->priv->group_name);
g_free (welcome_session->priv->x11_display_name);
+ g_free (welcome_session->priv->x11_display_seat_id);
g_free (welcome_session->priv->x11_display_device);
g_free (welcome_session->priv->x11_display_hostname);
g_free (welcome_session->priv->x11_authority_file);
diff --git a/daemon/gdm-xdmcp-chooser-display.c b/daemon/gdm-xdmcp-chooser-display.c
index 85bd3b71..f7b5a0be 100644
--- a/daemon/gdm-xdmcp-chooser-display.c
+++ b/daemon/gdm-xdmcp-chooser-display.c
@@ -224,7 +224,7 @@ gdm_xdmcp_chooser_display_new (const char *hostname,
"remote-hostname", hostname,
"x11-display-number", number,
"x11-display-name", x11_display,
- "is-local", FALSE,
+ "is-local", TRUE,
"remote-address", address,
"session-number", session_number,
NULL);