18940N/Acommit 95956899d14fc0e5ee7c7a561c69293f2d951fae
18940N/AAuthor: Halton Huo <halton.huo@sun.com>
18940N/ADate: Fri Jul 2 16:17:35 2010 +0800
18940N/A
18940N/A Merge multi-seat branch with 098075c7f48ba506bf224a5f71c6cd07f903fd89
20788N/A--- /dev/null 2011-07-09 00:24:19.000000000 -0500
20788N/A+++ gdm-3.1.2/common/gdm-marshal.list 2011-07-09 00:44:00.836589308 -0500
20788N/A@@ -0,0 +1,8 @@
20788N/A+VOID:STRING,STRING,STRING,STRING,STRING
20788N/A+VOID:STRING,STRING,STRING,STRING
20788N/A+VOID:STRING,STRING,STRING
20788N/A+VOID:STRING,STRING
20788N/A+VOID:UINT,UINT
20788N/A+VOID:STRING,INT
20788N/A+VOID:DOUBLE
17291N/A+VOID:STRING,STRING,STRING,POINTER,STRING,POINTER
20788N/A--- a/common/Makefile.am-orig 2011-07-09 00:41:09.011315071 -0500
20788N/A+++ a/common/Makefile.am 2011-07-09 00:43:01.379253899 -0500
20788N/A@@ -30,6 +30,8 @@ noinst_LTLIBRARIES = \
20788N/A
20788N/A BUILT_SOURCES = \
20788N/A gdm-settings-glue.h \
20788N/A+ gdm-marshal.c \
20788N/A+ gdm-marshal.h \
20788N/A $(NULL)
20788N/A
20788N/A gdmdir = $(datadir)/gdm
20788N/A@@ -52,6 +54,13 @@ gdm_crash_logger_LDADD = $(GTHREAD_LIBS)
20788N/A gdm-settings-glue.h: gdm-settings.xml Makefile.am
20788N/A dbus-binding-tool --prefix=gdm_settings --mode=glib-server --output=gdm-settings-glue.h $(srcdir)/gdm-settings.xml
20788N/A
20788N/A+gdm-marshal.c: gdm-marshal.list
20788N/A+ echo "#include \"gdm-marshal.h\"" > $@ && \
20788N/A+ @GLIB_GENMARSHAL@ $< --prefix=gdm_marshal --body >> $@
20788N/A+
20788N/A+gdm-marshal.h: gdm-marshal.list
20788N/A+ @GLIB_GENMARSHAL@ $< --prefix=gdm_marshal --header > $@
20788N/A+
20788N/A if MKDTEMP_MISSING
20788N/A MKDTEMP_FILES = mkdtemp.c mkdtemp.h
20788N/A else
20788N/A@@ -61,6 +70,8 @@ endif
20788N/A libgdmcommon_la_SOURCES = \
20788N/A gdm-address.h \
20788N/A gdm-address.c \
20788N/A+ gdm-marshal.c \
20788N/A+ gdm-marshal.h \
20788N/A gdm-common.h \
20788N/A gdm-common.c \
20788N/A gdm-common-unknown-origin.h \
20788N/A@@ -144,6 +155,7 @@ CLEANFILES = \
20788N/A
20788N/A EXTRA_DIST = \
20788N/A gdm-settings.xml \
20788N/A+ gdm-marshal.list \
20788N/A mkdtemp.c \
20788N/A mkdtemp.h \
20788N/A $(gdm_DATA) \
17753N/Adiff --git a/common/gdm-settings-keys.h b/common/gdm-settings-keys.h
17753N/Aindex 65a1628..293ecb8 100644
17753N/A--- a/common/gdm-settings-keys.h
17753N/A+++ b/common/gdm-settings-keys.h
17753N/A@@ -39,8 +39,6 @@ G_BEGIN_DECLS
17753N/A #define GDM_KEY_EXCLUDE "greeter/Exclude"
17753N/A #define GDM_KEY_INCLUDE_ALL "greeter/IncludeAll"
17753N/A
17753N/A-#define GDM_KEY_DISALLOW_TCP "security/DisallowTCP"
17753N/A-
17753N/A #define GDM_KEY_XDMCP_ENABLE "xdmcp/Enable"
17753N/A #define GDM_KEY_MAX_PENDING "xdmcp/MaxPending"
17753N/A #define GDM_KEY_MAX_SESSIONS "xdmcp/MaxSessions"
16880N/Adiff --git a/configure.ac b/configure.ac
18940N/Aindex 940e424..19e1b0a 100644
16880N/A--- a/configure.ac
16880N/A+++ b/configure.ac
20839N/A@@ -1124,95 +1124,6 @@ AC_CHECK_LIB(devinfo, di_devperm_login,
17753N/A PAM_LIBS="$PAM_LIBS -ldevinfo" ])
17753N/A
17753N/A dnl ---------------------------------------------------------------------------
17753N/A-dnl - Check for X Server location
17753N/A-dnl ---------------------------------------------------------------------------
17753N/A-
17753N/A-# First check with "! -h" for /usr/X11R6 and /usr/X11 since they often
17753N/A-# symlink to each other, and configure should use the more stable
17753N/A-# location (the real directory) if possible.
17753N/A-#
17753N/A-# On Solaris, the /usr/bin/Xserver script is used to decide whether to
17753N/A-# use Xsun or Xorg, so this is used on Solaris.
17753N/A-#
17753N/A-# When testing for /usr/X11R6, first check with "! -h" for /usr/X11R6
17753N/A-# and /usr/X11 since they often symlink to each other, and configure
17753N/A-# should use the more stable location (the real directory) if possible.
17753N/A-#
17753N/A-if test -x /usr/X11/bin/Xserver; then
17753N/A- X_PATH="/usr/X11/bin"
17753N/A- X_SERVER_PATH="/usr/X11/bin"
17753N/A- X_SERVER="/usr/X11/bin/Xserver"
17753N/A-elif test ! -h /usr/X11R6 -a -x /usr/X11R6/bin/X; then
17753N/A- X_PATH="/usr/X11R6/bin"
17753N/A- X_SERVER_PATH="/usr/X11R6/bin"
17753N/A- X_SERVER="/usr/X11R6/bin/X"
17753N/A-elif test ! -h /usr/X11 -a -x /usr/X11/bin/X; then
17753N/A- X_PATH="/usr/X11/bin"
17753N/A- X_SERVER_PATH="/usr/X11/bin"
17753N/A- X_SERVER="/usr/X11/bin/X"
17753N/A-elif test -x /usr/X11R6/bin/X; then
17753N/A- X_PATH="/usr/X11R6/bin"
17753N/A- X_SERVER_PATH="/usr/X11R6/bin"
17753N/A- X_SERVER="/usr/X11R6/bin/X"
17753N/A-elif test -x /usr/bin/Xorg; then
17753N/A- X_PATH="/usr/bin"
17753N/A- X_SERVER_PATH="/usr/bin"
17753N/A- X_SERVER="/usr/bin/Xorg"
17753N/A-elif test -x /usr/X11/bin/X; then
17753N/A- X_PATH="/usr/X11/bin"
17753N/A- X_SERVER_PATH="/usr/X11/bin"
17753N/A- X_SERVER="/usr/X11/bin/X"
17753N/A-elif test -x /usr/openwin/bin/Xsun; then
17753N/A- # Do not add /usr/openwin/bin here because on Solaris you need
17753N/A- # /usr/openwin/bin in your PATH even if you are using the Xorg
17753N/A- # Xserver. We add this to the path below.
17753N/A- X_PATH="/usr/openwin/bin"
17753N/A- X_SERVER_PATH="/usr/openwin/bin"
17753N/A- X_SERVER="/usr/openwin/bin/Xsun"
17753N/A-elif test -x /opt/X11R6/bin/X; then
17753N/A- X_PATH="/opt/X11R6/bin"
17753N/A- X_SERVER_PATH="/opt/X11R6/bin"
17753N/A- X_SERVER="/opt/X11R6/bin/X"
17753N/A-elif test -x /usr/bin/X; then
17753N/A- X_PATH="/usr/bin"
17753N/A- X_SERVER_PATH="/usr/bin"
17753N/A- X_SERVER="/usr/bin/X"
17753N/A-else
17753N/A- # what to do, what to do, this is wrong, but this just sets the
17753N/A- # defaults, perhaps this user is cross compiling or some such
17753N/A- X_PATH="/usr/bin/X11:/usr/X11R6/bin:/opt/X11R6/bin"
20788N/A- X_SERVER_PATH="/usr/bin"
20788N/A- X_SERVER="/usr/bin/X"
17753N/A-fi
17753N/A-
17753N/A-dnl ---------------------------------------------------------------------------
17753N/A-dnl - Check for Xnest / Xephyr support
17753N/A-dnl ---------------------------------------------------------------------------
17753N/A-
17753N/A-# Use Xephyr if it is available. It works better than Xnest since Xephyr
17753N/A-# supports the Xserver extensions, even if on a remote machine.
17753N/A-#
17753N/A-X_XNEST_UNSCALED_FONTPATH="true"
17753N/A-if test -x $X_SERVER_PATH/Xephyr; then
17753N/A- X_XNEST_CMD="$X_SERVER_PATH/Xephyr"
17753N/A- X_XNEST_CONFIG_OPTIONS="-audit 0"
17753N/A-else
17753N/A- if test -x /usr/openwin/bin/Xnest; then
17753N/A- # If on Solaris, Xnest is only shipped with the Xsun Xserver, so
17753N/A- # use this version.
17753N/A- #
17753N/A- X_XNEST_CMD="/usr/openwin/bin/Xnest"
17753N/A- X_XNEST_CONFIG_OPTIONS="-audit 0 -name Xnest -pn"
17753N/A- X_XNEST_UNSCALED_FONTPATH="false"
17753N/A- else
17753N/A- if test -x $X_SERVER_PATH/Xnest; then
17753N/A- X_XNEST_CMD="$X_SERVER_PATH/Xnest"
17753N/A- X_XNEST_CONFIG_OPTIONS="-audit 0 -name Xnest"
17753N/A- fi
17753N/A- fi
17753N/A-fi
17753N/A-
17753N/A-dnl ---------------------------------------------------------------------------
17753N/A dnl - Expand vars
17753N/A dnl ---------------------------------------------------------------------------
17753N/A
20839N/A@@ -1384,6 +1295,21 @@ else
18160N/A XSESSION_SHELL=/bin/sh
18160N/A fi
18160N/A
18160N/A+dnl ---------------------------------------------------------------------------
18160N/A+dnl - PATH in scripts
18160N/A+dnl ---------------------------------------------------------------------------
18160N/A+AC_ARG_WITH(script-path,
18160N/A+ AS_HELP_STRING([--with-script-path=<dir>],
18160N/A+ [script path]))
18160N/A+
18160N/A+if ! test -z "$with_script_path"; then
18160N/A+ SCRIPT_PATH=$with_script_path
18160N/A+else
18160N/A+ SCRIPT_PATH=/usr/bin
18160N/A+fi
18160N/A+
18160N/A+AC_SUBST(SCRIPT_PATH)
18160N/A+
18160N/A # Set configuration choices.
18160N/A #
18160N/A AC_SUBST(XSESSION_SHELL)
20839N/A@@ -1391,19 +1317,6 @@ AC_DEFINE_UNQUOTED(XSESSION_SHELL,"$XSES
18160N/A AC_SUBST(SOUND_PROGRAM)
18160N/A AC_DEFINE_UNQUOTED(SOUND_PROGRAM,"$SOUND_PROGRAM",[])
18160N/A
18160N/A-AC_SUBST(X_PATH)
18160N/A-AC_SUBST(X_SERVER)
18160N/A-AC_SUBST(X_SERVER_PATH)
18160N/A-AC_DEFINE_UNQUOTED(X_SERVER,"$X_SERVER",[])
18160N/A-AC_DEFINE_UNQUOTED(X_SERVER_PATH,"$X_SERVER_PATH",[])
18160N/A-
18160N/A-AC_SUBST(X_XNEST_CMD)
18160N/A-AC_SUBST(X_XNEST_CONFIG_OPTIONS)
18160N/A-AC_SUBST(X_XNEST_UNSCALED_FONTPATH)
18160N/A-AC_DEFINE_UNQUOTED(X_XNEST_CMD,"$X_XNEST_CMD",[])
18160N/A-AC_DEFINE_UNQUOTED(X_XNEST_CONFIG_OPTIONS,"$X_XNEST_CONFIG_OPTIONS",[])
18160N/A-AC_DEFINE_UNQUOTED(X_XNEST_UNSCALED_FONTPATH,"$X_XNEST_UNSCALED_FONTPATH",[])
18160N/A-
18160N/A ## Stuff for debian/changelog.in
18160N/A #if test -e "debian/changelog"; then
18160N/A # DEBIAN_DATESTAMP=`head -1 debian/changelog| sed -e 's/.*cvs.//' -e 's/).*//'`
20839N/A@@ -1439,6 +1352,9 @@ gui/simple-chooser/Makefile
18160N/A utils/Makefile
18160N/A data/gdm.conf
18160N/A data/Makefile
18160N/A+data/Init
18160N/A+data/PostSession
18160N/A+data/PreSession
20839N/A data/greeter-autostart/Makefile
20839N/A data/greeter-autostart/at-spi-registryd-wrapper.desktop.in
20788N/A data/pixmaps/Makefile
20839N/A@@ -1481,7 +1397,7 @@ echo "
18160N/A
18160N/A dbus-1 system.d dir: ${DBUS_SYS_DIR}
18160N/A PAM prefix: ${PAM_PREFIX}
18160N/A- X server: ${X_SERVER}
18160N/A+ script path: ${SCRIPT_PATH}
18160N/A "
18160N/A
18160N/A dnl TCP Wrappers support?
16880N/Adiff --git a/daemon/Makefile.am b/daemon/Makefile.am
18940N/Aindex 731a041..acd2b10 100644
16880N/A--- a/daemon/Makefile.am
16880N/A+++ b/daemon/Makefile.am
20839N/A@@ -299,6 +299,8 @@ gdm_binary_SOURCES = \
16880N/A gdm-static-display.h \
16880N/A gdm-transient-display.c \
16880N/A gdm-transient-display.h \
20839N/A+ gdm-dynamic-display.c \
20839N/A+ gdm-dynamic-display.h \
20839N/A gdm-static-factory-display.c \
20839N/A gdm-static-factory-display.h \
16880N/A gdm-product-display.c \
16880N/Adiff --git a/daemon/ck-connector.c b/daemon/ck-connector.c
17662N/Aindex 0117eb9..8609ccb 100644
16880N/A--- a/daemon/ck-connector.c
16880N/A+++ b/daemon/ck-connector.c
16983N/A@@ -65,6 +65,7 @@ struct _CkConnector
16983N/A {
16983N/A int refcount;
16983N/A char *cookie;
16983N/A+ char *session_id;
16983N/A dbus_bool_t session_created;
16983N/A DBusConnection *connection;
16983N/A };
17662N/A@@ -76,8 +77,11 @@ static struct {
16880N/A { "display-device", DBUS_TYPE_STRING },
16880N/A { "x11-display-device", DBUS_TYPE_STRING },
16880N/A { "x11-display", DBUS_TYPE_STRING },
16880N/A+ { "seat-id", DBUS_TYPE_STRING },
16983N/A+ { "session", DBUS_TYPE_STRING },
16880N/A { "remote-host-name", DBUS_TYPE_STRING },
16880N/A { "session-type", DBUS_TYPE_STRING },
17291N/A+ { "display-type", DBUS_TYPE_STRING },
16880N/A { "is-local", DBUS_TYPE_BOOLEAN },
16880N/A { "unix-user", DBUS_TYPE_INT32 },
16880N/A };
17662N/A@@ -181,6 +185,10 @@ _ck_connector_free (CkConnector *connector)
16983N/A free (connector->cookie);
16983N/A }
16983N/A
16983N/A+ if (connector->session_id != NULL) {
16983N/A+ free (connector->session_id);
16983N/A+ }
16983N/A+
16983N/A free (connector);
16983N/A }
16983N/A
17662N/A@@ -241,6 +249,7 @@ ck_connector_new (void)
16983N/A connector->refcount = 1;
16983N/A connector->connection = NULL;
16983N/A connector->cookie = NULL;
16983N/A+ connector->session_id = NULL;
16983N/A connector->session_created = FALSE;
16983N/A oom:
16983N/A return connector;
17662N/A@@ -266,6 +275,7 @@ ck_connector_open_session (CkConnector *connector,
16983N/A DBusMessage *reply;
16983N/A dbus_bool_t ret;
16983N/A char *cookie;
16983N/A+ char *session_id;
16983N/A
16983N/A _ck_return_val_if_fail (connector != NULL, FALSE);
16983N/A _ck_return_val_if_fail ((error) == NULL || !dbus_error_is_set ((error)), FALSE);
17662N/A@@ -334,10 +344,68 @@ ck_connector_open_session (CkConnector *connector,
16983N/A goto out;
16983N/A }
16983N/A
16983N/A+ dbus_message_unref (message);
16983N/A+ dbus_message_unref (reply);
16983N/A+
16983N/A+ message = dbus_message_new_method_call ("org.freedesktop.ConsoleKit",
16983N/A+ "/org/freedesktop/ConsoleKit/Manager",
16983N/A+ "org.freedesktop.ConsoleKit.Manager",
16983N/A+ "GetSessionForCookie");
16983N/A+ if (message == NULL) {
16983N/A+ goto out;
16983N/A+ }
16983N/A+
16983N/A+ dbus_message_append_args (message, DBUS_TYPE_STRING, &connector->cookie,
16983N/A+ DBUS_TYPE_INVALID);
16983N/A+
16983N/A+ dbus_error_init (&local_error);
16983N/A+
16983N/A+ reply = dbus_connection_send_with_reply_and_block (connector->connection,
16983N/A+ message,
16983N/A+ -1,
16983N/A+ &local_error);
16983N/A+ if (reply == NULL) {
16983N/A+ if (dbus_error_is_set (&local_error)) {
16983N/A+ dbus_set_error (error,
16983N/A+ CK_CONNECTOR_ERROR,
16983N/A+ "Unable to open session: %s",
16983N/A+ local_error.message);
16983N/A+ dbus_error_free (&local_error);
16983N/A+ goto out;
16983N/A+ }
16983N/A+ }
16983N/A+
16983N/A+ dbus_error_init (&local_error);
16983N/A+ if (! dbus_message_get_args (reply,
16983N/A+ &local_error,
16983N/A+ DBUS_TYPE_OBJECT_PATH, &session_id,
16983N/A+ DBUS_TYPE_INVALID)) {
16983N/A+ if (dbus_error_is_set (&local_error)) {
16983N/A+ dbus_set_error (error,
16983N/A+ CK_CONNECTOR_ERROR,
16983N/A+ "Unable to open session: %s",
16983N/A+ local_error.message);
16983N/A+ dbus_error_free (&local_error);
16983N/A+ goto out;
16983N/A+ }
16983N/A+ }
16983N/A+
16983N/A+ connector->session_id = strdup (session_id);
16983N/A+ if (connector->session_id == NULL) {
16983N/A+ goto out;
16983N/A+ }
16983N/A+
16983N/A connector->session_created = TRUE;
16983N/A ret = TRUE;
16983N/A
16983N/A out:
16983N/A+ if (!ret) {
16983N/A+ free (connector->cookie);
16983N/A+ connector->cookie = NULL;
16983N/A+ free (connector->session_id);
16983N/A+ connector->session_id = NULL;
16983N/A+ }
16983N/A+
16983N/A if (reply != NULL) {
16983N/A dbus_message_unref (reply);
16983N/A }
17662N/A@@ -362,6 +430,7 @@ ck_connector_open_session_with_parameters_valist (CkConnector *connector,
17226N/A DBusMessageIter iter_array;
17226N/A dbus_bool_t ret;
17226N/A char *cookie;
17226N/A+ char *session_id;
17226N/A const char *name;
17226N/A
17226N/A _ck_return_val_if_fail (connector != NULL, FALSE);
17662N/A@@ -470,6 +539,57 @@ ck_connector_open_session_with_parameters_valist (CkConnector *connector,
17226N/A goto out;
17226N/A }
17226N/A
17226N/A+ dbus_message_unref (message);
17226N/A+ dbus_message_unref (reply);
17226N/A+
17226N/A+ message = dbus_message_new_method_call ("org.freedesktop.ConsoleKit",
17226N/A+ "/org/freedesktop/ConsoleKit/Manager",
17226N/A+ "org.freedesktop.ConsoleKit.Manager",
17226N/A+ "GetSessionForCookie");
17226N/A+ if (message == NULL) {
17226N/A+ goto out;
17226N/A+ }
17226N/A+
17226N/A+ dbus_message_append_args (message, DBUS_TYPE_STRING, &connector->cookie,
17226N/A+ DBUS_TYPE_INVALID);
17226N/A+
17226N/A+ dbus_error_init (&local_error);
17226N/A+
17226N/A+ reply = dbus_connection_send_with_reply_and_block (connector->connection,
17226N/A+ message,
17226N/A+ -1,
17226N/A+ &local_error);
17226N/A+ if (reply == NULL) {
17226N/A+ if (dbus_error_is_set (&local_error)) {
17226N/A+ dbus_set_error (error,
17226N/A+ CK_CONNECTOR_ERROR,
17226N/A+ "Unable to open session: %s",
17226N/A+ local_error.message);
17226N/A+ dbus_error_free (&local_error);
17226N/A+ goto out;
17226N/A+ }
17226N/A+ }
17226N/A+
17226N/A+ dbus_error_init (&local_error);
17226N/A+ if (! dbus_message_get_args (reply,
17226N/A+ &local_error,
17226N/A+ DBUS_TYPE_OBJECT_PATH, &session_id,
17226N/A+ DBUS_TYPE_INVALID)) {
17226N/A+ if (dbus_error_is_set (&local_error)) {
17226N/A+ dbus_set_error (error,
17226N/A+ CK_CONNECTOR_ERROR,
17226N/A+ "Unable to open session: %s",
17226N/A+ local_error.message);
17226N/A+ dbus_error_free (&local_error);
17226N/A+ goto out;
17226N/A+ }
17226N/A+ }
17226N/A+
17226N/A+ connector->session_id = strdup (session_id);
17226N/A+ if (connector->session_id == NULL) {
17226N/A+ goto out;
17226N/A+ }
17226N/A+
17226N/A connector->session_created = TRUE;
17226N/A ret = TRUE;
17226N/A
17662N/A@@ -590,6 +710,73 @@ ck_connector_get_cookie (CkConnector *connector)
16983N/A }
16983N/A
16983N/A /**
16983N/A+ * Gets the id for the current open session.
16983N/A+ * Returns #NULL if no session is open.
16983N/A+ *
16983N/A+ * @returns a constant string with the session id.
16983N/A+ */
16983N/A+const char *
16983N/A+ck_connector_get_session_id (CkConnector *connector)
16983N/A+{
16983N/A+ _ck_return_val_if_fail (connector != NULL, NULL);
16983N/A+
16983N/A+ if (! connector->session_created) {
16983N/A+ return NULL;
16983N/A+ } else {
16983N/A+ return connector->session_id;
16983N/A+ }
16983N/A+}
16983N/A+
17226N/A+dbus_bool_t
17226N/A+ck_connector_set_remove_on_close (CkConnector *connector,
17226N/A+ gboolean remove_on_close,
17226N/A+ DBusError *error)
17226N/A+{
17226N/A+ DBusMessage *message;
17226N/A+ dbus_bool_t ret;
17226N/A+ const char *ssid = ck_connector_get_session_id (connector);
17226N/A+
17226N/A+ _ck_return_val_if_fail (connector != NULL, FALSE);
17226N/A+ _ck_return_val_if_fail ((error) == NULL || !dbus_error_is_set ((error)), FALSE);
17226N/A+ _ck_return_val_if_fail (ssid != NULL, FALSE);
17226N/A+
17226N/A+ message = NULL;
17226N/A+ ret = FALSE;
17226N/A+
17226N/A+ if (!connector->session_created || connector->cookie == NULL) {
17226N/A+ dbus_set_error (error,
17226N/A+ CK_CONNECTOR_ERROR,
17226N/A+ "Unable to close session: %s",
17226N/A+ "no session open");
17226N/A+ goto out;
17226N/A+ }
17226N/A+
17226N/A+ message = dbus_message_new_method_call ("org.freedesktop.ConsoleKit",
17226N/A+ ssid,
17226N/A+ "org.freedesktop.ConsoleKit.Session",
17226N/A+ "SetRemoveOnClose");
17226N/A+ if (message == NULL) {
17226N/A+ goto out;
17226N/A+ }
17226N/A+
17226N/A+ if (! dbus_message_append_args (message,
17226N/A+ DBUS_TYPE_BOOLEAN, &remove_on_close,
17226N/A+ DBUS_TYPE_INVALID)) {
17226N/A+ goto out;
17226N/A+ }
17226N/A+
17226N/A+ ret = dbus_connection_send (connector->connection,
17226N/A+ message,
17226N/A+ NULL);
17226N/A+out:
17226N/A+ if (message != NULL) {
17226N/A+ dbus_message_unref (message);
17226N/A+ }
17226N/A+
17226N/A+ return ret;
17226N/A+}
17226N/A+
16983N/A+/**
16983N/A * Issues the CloseSession method call on the ConsoleKit manager
16983N/A * interface.
16983N/A *
16983N/Adiff --git a/daemon/ck-connector.h b/daemon/ck-connector.h
17226N/Aindex ab59f55..e0a35d8 100644
16983N/A--- a/daemon/ck-connector.h
16983N/A+++ b/daemon/ck-connector.h
17226N/A@@ -32,6 +32,7 @@
17226N/A
17226N/A #include <sys/types.h>
17226N/A #include <dbus/dbus.h>
17226N/A+#include <glib.h>
17226N/A
17226N/A DBUS_BEGIN_DECLS
17226N/A
17226N/A@@ -56,6 +57,10 @@ dbus_bool_t ck_connector_open_session (CkConnector *ckc,
16983N/A DBusError *error);
16983N/A
16983N/A const char *ck_connector_get_cookie (CkConnector *ckc);
16983N/A+const char *ck_connector_get_session_id (CkConnector *ckc);
17226N/A+dbus_bool_t ck_connector_set_remove_on_close (CkConnector *ckc,
17226N/A+ gboolean remove_on_close,
17226N/A+ DBusError *error);
16983N/A dbus_bool_t ck_connector_close_session (CkConnector *ckc,
16983N/A DBusError *error);
16983N/A
16880N/Adiff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
17662N/Aindex abedc0b..4a94aab 100644
16880N/A--- a/daemon/gdm-display.c
16880N/A+++ b/daemon/gdm-display.c
20816N/A@@ -41,6 +41,7 @@
20816N/A #include "gdm-settings-keys.h"
20816N/A
20816N/A #include "gdm-slave-proxy.h"
20816N/A+#include "gdm-dynamic-display.h"
20816N/A
20816N/A static guint32 display_serial = 1;
20816N/A
20816N/A@@ -51,11 +52,14 @@ static guint32 display_serial = 1;
16983N/A struct GdmDisplayPrivate
16983N/A {
16983N/A char *id;
16983N/A+ char *session_id;
16880N/A char *seat_id;
16880N/A
16880N/A char *remote_hostname;
16880N/A+ char *x11_command;
16880N/A int x11_display_number;
16880N/A char *x11_display_name;
17291N/A+ char *x11_display_type;
16880N/A int status;
17291N/A time_t creation_time;
17291N/A GTimer *slave_timer;
20816N/A@@ -66,6 +70,8 @@ struct GdmDisplayPrivate
16880N/A GdmDisplayAccessFile *access_file;
16880N/A
16880N/A gboolean is_local;
16880N/A+ gboolean use_auth;
16983N/A+ gboolean block_console_session_requests;
16880N/A guint finish_idle_id;
16880N/A
16880N/A GdmSlaveProxy *slave_proxy;
20816N/A@@ -78,13 +84,18 @@ enum {
16880N/A PROP_ID,
16880N/A PROP_STATUS,
16880N/A PROP_SEAT_ID,
16983N/A+ PROP_SESSION_ID,
16880N/A+ PROP_X11_COMMAND,
16880N/A PROP_REMOTE_HOSTNAME,
16880N/A PROP_X11_DISPLAY_NUMBER,
16880N/A PROP_X11_DISPLAY_NAME,
17291N/A+ PROP_X11_DISPLAY_TYPE,
16880N/A PROP_X11_COOKIE,
16880N/A PROP_X11_AUTHORITY_FILE,
16880N/A PROP_IS_LOCAL,
16880N/A+ PROP_USE_AUTH,
16880N/A PROP_SLAVE_COMMAND,
16983N/A+ PROP_BLOCK_CONSOLE_SESSION_REQUESTS,
16880N/A };
16880N/A
16983N/A static void gdm_display_class_init (GdmDisplayClass *klass);
20816N/A@@ -489,6 +500,20 @@ gdm_display_get_seat_id (GdmDisplay *dis
16983N/A return TRUE;
16983N/A }
16983N/A
16983N/A+gboolean
16983N/A+gdm_display_get_session_id (GdmDisplay *display,
16983N/A+ char **session_id,
16983N/A+ GError **error)
16983N/A+{
16983N/A+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
16983N/A+
16983N/A+ if (session_id != NULL) {
16983N/A+ *session_id = g_strdup (display->priv->session_id);
16983N/A+ }
16983N/A+
16983N/A+ return TRUE;
16983N/A+}
16983N/A+
16983N/A static gboolean
16983N/A finish_idle (GdmDisplay *display)
16983N/A {
20828N/A@@ -513,6 +538,14 @@ slave_exited (GdmSlaveProxy *proxy
20816N/A {
20816N/A g_debug ("GdmDisplay: Slave exited: %d", code);
20816N/A
20828N/A+ if (GDM_IS_DYNAMIC_DISPLAY (display)) {
20828N/A+ if (code != 0) {
20828N/A+ gdm_dynamic_display_respawn (GDM_DYNAMIC_DISPLAY (display), TRUE);
20828N/A+ } else {
20828N/A+ gdm_dynamic_display_respawn (GDM_DYNAMIC_DISPLAY (display), FALSE);
20828N/A+ }
20816N/A+ }
20816N/A+
20816N/A queue_finish (display);
20816N/A }
20816N/A
20828N/A@@ -550,10 +583,12 @@ gdm_display_real_prepare (GdmDisplay *di
16880N/A
16880N/A g_assert (display->priv->slave_proxy == NULL);
16880N/A
16880N/A- if (!gdm_display_create_authority (display)) {
16880N/A- g_warning ("Unable to set up access control for display %d",
16880N/A- display->priv->x11_display_number);
16880N/A- return FALSE;
16880N/A+ if (display->priv->use_auth) {
16880N/A+ if (!gdm_display_create_authority (display)) {
16880N/A+ g_warning ("Unable to set up access control for display %d",
16880N/A+ display->priv->x11_display_number);
16880N/A+ return FALSE;
16880N/A+ }
16880N/A }
16880N/A
16880N/A _gdm_display_set_status (display, GDM_DISPLAY_PREPARED);
20828N/A@@ -742,6 +777,20 @@ gdm_display_get_id (GdmDisplay *
16880N/A }
16880N/A
16880N/A gboolean
16880N/A+gdm_display_get_x11_command (GdmDisplay *display,
16880N/A+ char **command,
16880N/A+ GError **error)
16880N/A+{
16880N/A+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
16880N/A+
16880N/A+ if (command != NULL) {
16880N/A+ *command = g_strdup (display->priv->x11_command);
16880N/A+ }
16880N/A+
16880N/A+ return TRUE;
16880N/A+}
16880N/A+
16880N/A+gboolean
16880N/A gdm_display_get_x11_display_name (GdmDisplay *display,
16880N/A char **x11_display,
16880N/A GError **error)
20828N/A@@ -756,6 +805,20 @@ gdm_display_get_x11_display_name (GdmDis
17291N/A }
17291N/A
17291N/A gboolean
17291N/A+gdm_display_get_x11_display_type (GdmDisplay *display,
17291N/A+ char **type,
17291N/A+ GError **error)
17291N/A+{
17291N/A+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
17291N/A+
17291N/A+ if (type != NULL) {
17291N/A+ *type = g_strdup (display->priv->x11_display_type);
17291N/A+ }
17291N/A+
17291N/A+ return TRUE;
17291N/A+}
17291N/A+
17291N/A+gboolean
17291N/A gdm_display_is_local (GdmDisplay *display,
17291N/A gboolean *local,
17291N/A GError **error)
20828N/A@@ -769,6 +832,20 @@ gdm_display_is_local (GdmDisplay *displa
16880N/A return TRUE;
16880N/A }
16880N/A
16880N/A+gboolean
16880N/A+gdm_display_use_auth (GdmDisplay *display,
16880N/A+ gboolean *use_auth,
16880N/A+ GError **error)
16880N/A+{
16880N/A+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
16880N/A+
16880N/A+ if (use_auth != NULL) {
16880N/A+ *use_auth = display->priv->use_auth;
16880N/A+ }
16880N/A+
16880N/A+ return TRUE;
16880N/A+}
16880N/A+
16880N/A static void
16880N/A _gdm_display_set_id (GdmDisplay *display,
16880N/A const char *id)
20828N/A@@ -778,6 +855,14 @@ _gdm_display_set_id (GdmDisplay *dis
16880N/A }
16880N/A
16880N/A static void
16880N/A+_gdm_display_set_x11_command (GdmDisplay *display,
16880N/A+ const char *x11_command)
16880N/A+{
16880N/A+ g_free (display->priv->x11_command);
16880N/A+ display->priv->x11_command = g_strdup (x11_command);
16880N/A+}
16880N/A+
16880N/A+static void
16880N/A _gdm_display_set_seat_id (GdmDisplay *display,
16880N/A const char *seat_id)
16880N/A {
20828N/A@@ -786,6 +871,24 @@ _gdm_display_set_seat_id (GdmDisplay
16983N/A }
16983N/A
16983N/A static void
16983N/A+_gdm_display_set_session_id (GdmDisplay *display,
16983N/A+ const char *session_id)
16983N/A+{
16983N/A+ g_free (display->priv->session_id);
16983N/A+ display->priv->session_id = g_strdup (session_id);
16983N/A+}
16983N/A+
16983N/A+gboolean
16983N/A+gdm_display_set_session_id (GdmDisplay *display,
16983N/A+ const char *session_id,
16983N/A+ GError **error)
16983N/A+{
16983N/A+ _gdm_display_set_session_id (display, session_id);
16983N/A+ g_object_notify (G_OBJECT (display), "session-id");
16983N/A+ return TRUE;
16983N/A+}
16983N/A+
16983N/A+static void
16983N/A _gdm_display_set_remote_hostname (GdmDisplay *display,
16983N/A const char *hostname)
16983N/A {
20828N/A@@ -809,6 +912,14 @@ _gdm_display_set_x11_display_name (GdmDi
17291N/A }
17291N/A
17291N/A static void
17291N/A+_gdm_display_set_x11_display_type (GdmDisplay *display,
17291N/A+ const char *display_type)
17291N/A+{
17291N/A+ g_free (display->priv->x11_display_type);
17291N/A+ display->priv->x11_display_type = g_strdup (display_type);
17291N/A+}
17291N/A+
17291N/A+static void
17291N/A _gdm_display_set_x11_cookie (GdmDisplay *display,
17291N/A const char *x11_cookie)
17291N/A {
20828N/A@@ -824,6 +935,13 @@ _gdm_display_set_is_local (GdmDisplay
16880N/A }
16880N/A
16880N/A static void
16880N/A+_gdm_display_set_use_auth (GdmDisplay *display,
16880N/A+ gboolean use_auth)
16880N/A+{
16880N/A+ display->priv->use_auth = use_auth;
16880N/A+}
16880N/A+
16880N/A+static void
16880N/A _gdm_display_set_slave_command (GdmDisplay *display,
16880N/A const char *command)
16880N/A {
20828N/A@@ -832,6 +950,13 @@ _gdm_display_set_slave_command (GdmDispl
16983N/A }
16983N/A
16983N/A static void
16983N/A+_gdm_display_set_block_console_session_requests (GdmDisplay *display,
16983N/A+ gboolean block_console_session_requests)
16983N/A+{
16983N/A+ display->priv->block_console_session_requests = block_console_session_requests;
16983N/A+}
16983N/A+
16983N/A+static void
16983N/A gdm_display_set_property (GObject *object,
16983N/A guint prop_id,
16983N/A const GValue *value,
20828N/A@@ -845,12 +970,18 @@ gdm_display_set_property (GObject
16880N/A case PROP_ID:
16880N/A _gdm_display_set_id (self, g_value_get_string (value));
16880N/A break;
16880N/A+ case PROP_X11_COMMAND:
16880N/A+ _gdm_display_set_x11_command (self, g_value_get_string (value));
16880N/A+ break;
16880N/A case PROP_STATUS:
16880N/A _gdm_display_set_status (self, g_value_get_int (value));
16880N/A break;
16983N/A case PROP_SEAT_ID:
16983N/A _gdm_display_set_seat_id (self, g_value_get_string (value));
16983N/A break;
16983N/A+ case PROP_SESSION_ID:
16983N/A+ _gdm_display_set_session_id (self, g_value_get_string (value));
16983N/A+ break;
16983N/A case PROP_REMOTE_HOSTNAME:
16983N/A _gdm_display_set_remote_hostname (self, g_value_get_string (value));
16983N/A break;
20828N/A@@ -860,15 +991,24 @@ gdm_display_set_property (GObject
17291N/A case PROP_X11_DISPLAY_NAME:
17291N/A _gdm_display_set_x11_display_name (self, g_value_get_string (value));
17291N/A break;
17291N/A+ case PROP_X11_DISPLAY_TYPE:
17291N/A+ _gdm_display_set_x11_display_type (self, g_value_get_string (value));
17291N/A+ break;
17291N/A case PROP_X11_COOKIE:
17291N/A _gdm_display_set_x11_cookie (self, g_value_get_string (value));
17291N/A break;
16880N/A case PROP_IS_LOCAL:
16880N/A _gdm_display_set_is_local (self, g_value_get_boolean (value));
16880N/A break;
16880N/A+ case PROP_USE_AUTH:
16880N/A+ _gdm_display_set_use_auth (self, g_value_get_boolean (value));
16880N/A+ break;
16880N/A case PROP_SLAVE_COMMAND:
16880N/A _gdm_display_set_slave_command (self, g_value_get_string (value));
16880N/A break;
16983N/A+ case PROP_BLOCK_CONSOLE_SESSION_REQUESTS:
16983N/A+ _gdm_display_set_block_console_session_requests (self, g_value_get_boolean (value));
16983N/A+ break;
16983N/A default:
16983N/A G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
16983N/A break;
20828N/A@@ -889,12 +1029,18 @@ gdm_display_get_property (GObject
16880N/A case PROP_ID:
16880N/A g_value_set_string (value, self->priv->id);
16880N/A break;
16880N/A+ case PROP_X11_COMMAND:
16880N/A+ g_value_set_string (value, self->priv->x11_command);
16880N/A+ break;
16880N/A case PROP_STATUS:
16880N/A g_value_set_int (value, self->priv->status);
16880N/A break;
16983N/A case PROP_SEAT_ID:
16983N/A g_value_set_string (value, self->priv->seat_id);
16983N/A break;
16983N/A+ case PROP_SESSION_ID:
16983N/A+ g_value_set_string (value, self->priv->session_id);
16983N/A+ break;
16983N/A case PROP_REMOTE_HOSTNAME:
16983N/A g_value_set_string (value, self->priv->remote_hostname);
16983N/A break;
20828N/A@@ -904,6 +1050,9 @@ gdm_display_get_property (GObject
17291N/A case PROP_X11_DISPLAY_NAME:
17291N/A g_value_set_string (value, self->priv->x11_display_name);
17291N/A break;
17291N/A+ case PROP_X11_DISPLAY_TYPE:
17291N/A+ g_value_set_string (value, self->priv->x11_display_type);
17291N/A+ break;
17291N/A case PROP_X11_COOKIE:
17291N/A g_value_set_string (value, self->priv->x11_cookie);
17291N/A break;
20828N/A@@ -914,9 +1063,15 @@ gdm_display_get_property (GObject
16880N/A case PROP_IS_LOCAL:
16880N/A g_value_set_boolean (value, self->priv->is_local);
16880N/A break;
16880N/A+ case PROP_USE_AUTH:
16880N/A+ g_value_set_boolean (value, self->priv->use_auth);
16880N/A+ break;
16880N/A case PROP_SLAVE_COMMAND:
16880N/A g_value_set_string (value, self->priv->slave_command);
16880N/A break;
16983N/A+ case PROP_BLOCK_CONSOLE_SESSION_REQUESTS:
16983N/A+ g_value_set_boolean (value, self->priv->block_console_session_requests);
16983N/A+ break;
16983N/A default:
16983N/A G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
16983N/A break;
20828N/A@@ -1033,6 +1188,13 @@ gdm_display_class_init (GdmDisplayClass
16880N/A NULL,
16880N/A G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
16880N/A g_object_class_install_property (object_class,
16880N/A+ PROP_X11_COMMAND,
16880N/A+ g_param_spec_string ("x11-command",
16880N/A+ "x11 command",
16880N/A+ "x11 command",
16880N/A+ NULL,
16880N/A+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
16880N/A+ g_object_class_install_property (object_class,
16880N/A PROP_REMOTE_HOSTNAME,
16880N/A g_param_spec_string ("remote-hostname",
16880N/A "remote-hostname",
20828N/A@@ -1056,6 +1218,13 @@ gdm_display_class_init (GdmDisplayClass
17291N/A NULL,
17291N/A G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
17291N/A g_object_class_install_property (object_class,
17291N/A+ PROP_X11_DISPLAY_TYPE,
17291N/A+ g_param_spec_string ("x11-display-type",
17291N/A+ "x11-display-type",
17291N/A+ "x11-display-type",
17291N/A+ NULL,
17291N/A+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
17291N/A+ g_object_class_install_property (object_class,
17291N/A PROP_SEAT_ID,
17291N/A g_param_spec_string ("seat-id",
17291N/A "seat id",
20828N/A@@ -1063,6 +1232,13 @@ gdm_display_class_init (GdmDisplayClass
16983N/A NULL,
16983N/A G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
16983N/A g_object_class_install_property (object_class,
16983N/A+ PROP_SESSION_ID,
16983N/A+ g_param_spec_string ("session-id",
16983N/A+ "session id",
16983N/A+ "session id",
16983N/A+ NULL,
16983N/A+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
16983N/A+ g_object_class_install_property (object_class,
16983N/A PROP_X11_COOKIE,
16983N/A g_param_spec_string ("x11-cookie",
16983N/A "cookie",
20828N/A@@ -1076,7 +1252,6 @@ gdm_display_class_init (GdmDisplayClass
16880N/A "authority file",
16880N/A NULL,
16880N/A G_PARAM_READABLE));
16880N/A-
16880N/A g_object_class_install_property (object_class,
16880N/A PROP_IS_LOCAL,
16880N/A g_param_spec_boolean ("is-local",
20828N/A@@ -1084,7 +1259,13 @@ gdm_display_class_init (GdmDisplayClass
16880N/A NULL,
16880N/A TRUE,
16880N/A G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
16880N/A-
16880N/A+ g_object_class_install_property (object_class,
16880N/A+ PROP_USE_AUTH,
16880N/A+ g_param_spec_boolean ("use-auth",
16880N/A+ NULL,
16880N/A+ NULL,
16880N/A+ TRUE,
16880N/A+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
16880N/A g_object_class_install_property (object_class,
16880N/A PROP_SLAVE_COMMAND,
16880N/A g_param_spec_string ("slave-command",
20828N/A@@ -1093,6 +1274,13 @@ gdm_display_class_init (GdmDisplayClass
16983N/A DEFAULT_SLAVE_COMMAND,
16983N/A G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
16983N/A g_object_class_install_property (object_class,
16983N/A+ PROP_BLOCK_CONSOLE_SESSION_REQUESTS,
16983N/A+ g_param_spec_boolean ("block-console-session-requests",
16983N/A+ "Block Console Session Requests",
16983N/A+ "Block session requests from ConsoleKit",
16983N/A+ FALSE,
16983N/A+ G_PARAM_READWRITE));
16983N/A+ g_object_class_install_property (object_class,
16983N/A PROP_STATUS,
16983N/A g_param_spec_int ("status",
16983N/A "status",
20828N/A@@ -1131,9 +1319,12 @@ gdm_display_finalize (GObject *object)
16880N/A
16880N/A g_debug ("GdmDisplay: Finalizing display: %s", display->priv->id);
16880N/A g_free (display->priv->id);
16880N/A+ g_free (display->priv->x11_command);
16880N/A g_free (display->priv->seat_id);
16983N/A+ g_free (display->priv->session_id);
16880N/A g_free (display->priv->remote_hostname);
16880N/A g_free (display->priv->x11_display_name);
17291N/A+ g_free (display->priv->x11_display_type);
16983N/A g_free (display->priv->x11_cookie);
17291N/A g_free (display->priv->slave_command);
17291N/A
20828N/A@@ -1151,3 +1342,25 @@ gdm_display_finalize (GObject *object)
16983N/A
16983N/A G_OBJECT_CLASS (gdm_display_parent_class)->finalize (object);
16983N/A }
16983N/A+
16983N/A+gboolean
16983N/A+gdm_display_block_console_session_requests (GdmDisplay *display,
16983N/A+ GError **error)
16983N/A+{
16983N/A+ if (!display->priv->block_console_session_requests) {
16983N/A+ _gdm_display_set_block_console_session_requests (display, TRUE);
16983N/A+ g_object_notify (G_OBJECT (display), "block-console-session-requests");
16983N/A+ }
16983N/A+ return TRUE;
16983N/A+}
16983N/A+
16983N/A+gboolean
16983N/A+gdm_display_unblock_console_session_requests (GdmDisplay *display,
16983N/A+ GError **error)
16983N/A+{
16983N/A+ if (display->priv->block_console_session_requests) {
16983N/A+ _gdm_display_set_block_console_session_requests (display, FALSE);
16983N/A+ g_object_notify (G_OBJECT (display), "block-console-session-requests");
16983N/A+ }
16983N/A+ return TRUE;
16983N/A+}
16880N/Adiff --git a/daemon/gdm-display.h b/daemon/gdm-display.h
17662N/Aindex 607ea1d..b50549b 100644
16880N/A--- a/daemon/gdm-display.h
16880N/A+++ b/daemon/gdm-display.h
16880N/A@@ -102,6 +102,9 @@ gboolean gdm_display_unmanage (GdmDisplay *disp
16880N/A gboolean gdm_display_get_id (GdmDisplay *display,
16880N/A char **id,
16880N/A GError **error);
16880N/A+gboolean gdm_display_get_x11_command (GdmDisplay *display,
16880N/A+ char **command,
16880N/A+ GError **error);
16880N/A gboolean gdm_display_get_remote_hostname (GdmDisplay *display,
16880N/A char **hostname,
16880N/A GError **error);
17662N/A@@ -111,12 +114,21 @@ gboolean gdm_display_get_x11_display_number (GdmDisplay *disp
17291N/A gboolean gdm_display_get_x11_display_name (GdmDisplay *display,
17291N/A char **x11_display,
17291N/A GError **error);
17291N/A+gboolean gdm_display_get_x11_display_type (GdmDisplay *display,
17291N/A+ char **type,
17291N/A+ GError **error);
16983N/A gboolean gdm_display_get_seat_id (GdmDisplay *display,
16983N/A char **seat_id,
16983N/A GError **error);
16983N/A+gboolean gdm_display_get_session_id (GdmDisplay *display,
16983N/A+ char **session_id,
16983N/A+ GError **error);
16880N/A gboolean gdm_display_is_local (GdmDisplay *display,
16880N/A gboolean *local,
16880N/A GError **error);
16880N/A+gboolean gdm_display_use_auth (GdmDisplay *display,
16880N/A+ gboolean *use_auth,
16880N/A+ GError **error);
16880N/A gboolean gdm_display_get_timed_login_details (GdmDisplay *display,
16880N/A gboolean *enabled,
16880N/A char **username,
17662N/A@@ -130,6 +142,9 @@ gboolean gdm_display_get_x11_cookie (GdmDisplay *disp
16983N/A gboolean gdm_display_get_x11_authority_file (GdmDisplay *display,
16983N/A char **filename,
16983N/A GError **error);
16983N/A+gboolean gdm_display_set_session_id (GdmDisplay *display,
16983N/A+ const char *text,
16983N/A+ GError **error);
16983N/A gboolean gdm_display_add_user_authorization (GdmDisplay *display,
16983N/A const char *username,
16983N/A char **filename,
17662N/A@@ -140,6 +155,11 @@ gboolean gdm_display_remove_user_authorization (GdmDisplay *disp
16983N/A gboolean gdm_display_set_slave_bus_name (GdmDisplay *display,
16983N/A const char *name,
16983N/A GError **error);
16983N/A+gboolean gdm_display_block_console_session_requests (GdmDisplay *display,
16983N/A+ GError **error);
16983N/A+
16983N/A+gboolean gdm_display_unblock_console_session_requests (GdmDisplay *display,
16983N/A+ GError **error);
16983N/A
16983N/A
16983N/A G_END_DECLS
16880N/Adiff --git a/daemon/gdm-display.xml b/daemon/gdm-display.xml
17662N/Aindex a92e37f..c4d0b35 100644
16880N/A--- a/daemon/gdm-display.xml
16880N/A+++ b/daemon/gdm-display.xml
17291N/A@@ -4,11 +4,17 @@
16880N/A <method name="GetId">
16880N/A <arg name="id" direction="out" type="o"/>
16880N/A </method>
16880N/A+ <method name="GetX11Command">
16880N/A+ <arg name="command" direction="out" type="s"/>
16880N/A+ </method>
16880N/A <method name="GetX11DisplayName">
16880N/A <arg name="name" direction="out" type="s"/>
16880N/A </method>
17291N/A+ <method name="GetX11DisplayType">
17291N/A+ <arg name="type" direction="out" type="s"/>
17291N/A+ </method>
16880N/A <method name="GetX11DisplayNumber">
16880N/A- <arg name="name" direction="out" type="i"/>
16880N/A+ <arg name="number" direction="out" type="i"/>
16880N/A </method>
16880N/A <method name="GetX11Cookie">
16880N/A <arg name="x11_cookie" direction="out" type="ay"/>
17291N/A@@ -17,7 +23,14 @@
16880N/A <arg name="filename" direction="out" type="s"/>
16880N/A </method>
16880N/A <method name="GetSeatId">
16880N/A- <arg name="filename" direction="out" type="s"/>
16880N/A+ <arg name="seat_id" direction="out" type="s"/>
16983N/A+ </method>
16983N/A+ <method name="GetSessionId">
16983N/A+ <arg name="session_id" direction="out" type="s"/>
16983N/A+ </method>
16983N/A+ <method name="BlockConsoleSessionRequests">
16983N/A+ </method>
16983N/A+ <method name="UnblockConsoleSessionRequests">
16880N/A </method>
16880N/A <method name="GetRemoteHostname">
16880N/A <arg name="hostname" direction="out" type="s"/>
17662N/A@@ -25,6 +38,9 @@
16880N/A <method name="IsLocal">
16880N/A <arg name="local" direction="out" type="b"/>
16880N/A </method>
16880N/A+ <method name="UseAuth">
17662N/A+ <arg name="use_auth" direction="out" type="b"/>
16880N/A+ </method>
16880N/A <method name="AddUserAuthorization">
16880N/A <arg name="username" direction="in" type="s"/>
16880N/A <arg name="filename" direction="out" type="s"/>
17662N/A@@ -32,6 +48,9 @@
16983N/A <method name="RemoveUserAuthorization">
16983N/A <arg name="username" direction="in" type="s"/>
16983N/A </method>
16983N/A+ <method name="SetSessionId">
16983N/A+ <arg name="session_id" direction="in" type="s"/>
16983N/A+ </method>
16983N/A <method name="SetSlaveBusName">
16983N/A <arg name="name" direction="in" type="s"/>
16983N/A </method>
16880N/Adiff --git a/daemon/gdm-dynamic-display.c b/daemon/gdm-dynamic-display.c
16880N/Anew file mode 100644
17662N/Aindex 0000000..c0beced
16880N/A--- /dev/null
16880N/A+++ b/daemon/gdm-dynamic-display.c
20828N/A@@ -0,0 +1,246 @@
16880N/A+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
16880N/A+ *
16880N/A+ * Authors: halton.huo@sun.com
16880N/A+ * Copyright (C) 2009 Sun Microsystems, Inc.
16880N/A+ *
16880N/A+ * This program is free software; you can redistribute it and/or modify
16880N/A+ * it under the terms of the GNU General Public License as published by
16880N/A+ * the Free Software Foundation; either version 2 of the License, or
16880N/A+ * (at your option) any later version.
16880N/A+ *
16880N/A+ * This program is distributed in the hope that it will be useful,
16880N/A+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16880N/A+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16880N/A+ * GNU General Public License for more details.
16880N/A+ *
16880N/A+ * You should have received a copy of the GNU General Public License
16880N/A+ * along with this program; if not, write to the Free Software
16880N/A+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16880N/A+ *
16880N/A+ */
16880N/A+
16880N/A+#include "config.h"
16880N/A+
16880N/A+#include <errno.h>
16880N/A+#include <stdlib.h>
16880N/A+#include <stdio.h>
16880N/A+#include <fcntl.h>
16880N/A+#include <pwd.h>
16880N/A+#include <unistd.h>
16880N/A+#include <string.h>
16880N/A+#include <signal.h>
16880N/A+#include <sys/stat.h>
16880N/A+#include <sys/types.h>
16880N/A+#include <sys/socket.h>
16880N/A+
16880N/A+#include <glib.h>
16880N/A+#include <glib/gi18n.h>
16880N/A+#include <glib-object.h>
16880N/A+
16880N/A+#include "gdm-common.h"
16880N/A+#include "gdm-display.h"
16880N/A+#include "gdm-dynamic-display.h"
16880N/A+
16880N/A+#define GDM_DYNAMIC_DISPLAY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_DYNAMIC_DISPLAY, GdmDynamicDisplayPrivate))
16880N/A+
16880N/A+struct _GdmDynamicDisplayPrivate
16880N/A+{
20828N/A+ gboolean removed;
20828N/A+ gboolean do_respawn;
16880N/A+};
16880N/A+
16880N/A+enum {
16880N/A+ PROP_0,
16880N/A+};
16880N/A+
16880N/A+static void gdm_dynamic_display_class_init (GdmDynamicDisplayClass *klass);
16880N/A+static void gdm_dynamic_display_init (GdmDynamicDisplay *display);
16880N/A+static void gdm_dynamic_display_finalize (GObject *object);
16880N/A+
16880N/A+G_DEFINE_TYPE (GdmDynamicDisplay, gdm_dynamic_display, GDM_TYPE_DISPLAY)
16880N/A+
20828N/A+void
20828N/A+gdm_dynamic_display_respawn (GdmDynamicDisplay *display, gboolean respawn)
20816N/A+{
20828N/A+ display->priv->do_respawn = respawn;
20828N/A+ if (display->priv->do_respawn == TRUE)
20816N/A+ g_debug ("GdmDynamicDisplay: Set respawn to TRUE.");
20816N/A+ else
20816N/A+ g_debug ("GdmDynamicDisplay: Set respawn to FALSE.");
20816N/A+}
20816N/A+
20828N/A+void
20828N/A+gdm_dynamic_display_removed (GdmDynamicDisplay *display)
20828N/A+{
20828N/A+ display->priv->removed = TRUE;
20828N/A+}
20828N/A+
16880N/A+static gboolean
16880N/A+gdm_dynamic_display_create_authority (GdmDisplay *display)
16880N/A+{
16880N/A+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
16880N/A+
16880N/A+ GDM_DISPLAY_CLASS (gdm_dynamic_display_parent_class)->create_authority (display);
16880N/A+
16880N/A+ return TRUE;
16880N/A+}
16880N/A+
16880N/A+static gboolean
16880N/A+gdm_dynamic_display_add_user_authorization (GdmDisplay *display,
16880N/A+ const char *username,
16880N/A+ char **filename,
16880N/A+ GError **error)
16880N/A+{
16880N/A+ return GDM_DISPLAY_CLASS (gdm_dynamic_display_parent_class)->add_user_authorization (display, username, filename, error);
16880N/A+}
16880N/A+
16880N/A+static gboolean
16880N/A+gdm_dynamic_display_remove_user_authorization (GdmDisplay *display,
16880N/A+ const char *username,
16880N/A+ GError **error)
16880N/A+{
16880N/A+ return GDM_DISPLAY_CLASS (gdm_dynamic_display_parent_class)->remove_user_authorization (display, username, error);
16880N/A+}
16880N/A+
16880N/A+static gboolean
16880N/A+gdm_dynamic_display_manage (GdmDisplay *display)
16880N/A+{
16880N/A+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
16880N/A+
20319N/A+ g_debug ("GdmDynamicDisplay: Manage dynamic display");
20319N/A+
16880N/A+ GDM_DISPLAY_CLASS (gdm_dynamic_display_parent_class)->manage (display);
16880N/A+
16880N/A+ return TRUE;
16880N/A+}
16880N/A+
16880N/A+static gboolean
16880N/A+gdm_dynamic_display_finish (GdmDisplay *display)
16880N/A+{
20816N/A+ int status;
20816N/A+
20816N/A+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
20816N/A+
20816N/A+ g_debug ("GdmDynamicDisplay: Finish dynamic display");
20816N/A+
20816N/A+ /* Don't call parent's finish since we don't ever
20816N/A+ want to be put in the FINISHED state */
20816N/A+
20816N/A+ /* restart dynamic displays */
20816N/A+ gdm_display_unmanage (display);
20816N/A+
20816N/A+ status = gdm_display_get_status (display);
20828N/A+ if (GDM_DYNAMIC_DISPLAY (display)->priv->do_respawn == TRUE &&
20828N/A+ GDM_DYNAMIC_DISPLAY(display)->priv->removed == FALSE) {
20828N/A+ if (status != GDM_DISPLAY_FAILED) {
20828N/A+ g_debug ("Respawning...");
20828N/A+ gdm_display_manage (display);
20828N/A+ } else {
20828N/A+ g_debug ("Display failed, not respawning...");
20828N/A+ }
20828N/A+ } else {
20828N/A+ g_debug ("Not respawning...");
20816N/A+ }
20828N/A+ GDM_DYNAMIC_DISPLAY (display)->priv->do_respawn = FALSE;
20816N/A+
20816N/A+ return TRUE;
16880N/A+}
16880N/A+
16880N/A+static gboolean
16880N/A+gdm_dynamic_display_unmanage (GdmDisplay *display)
16880N/A+{
16880N/A+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
16880N/A+
20319N/A+ g_debug ("GdmDynamicDisplay: Unmanage dynamic display");
20319N/A+
16880N/A+ GDM_DISPLAY_CLASS (gdm_dynamic_display_parent_class)->unmanage (display);
16880N/A+
16880N/A+ return TRUE;
16880N/A+}
16880N/A+
16880N/A+static void
16880N/A+gdm_dynamic_display_set_property (GObject *object,
16880N/A+ guint prop_id,
16880N/A+ const GValue *value,
16880N/A+ GParamSpec *pspec)
16880N/A+{
16880N/A+ switch (prop_id) {
16880N/A+ default:
16880N/A+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
16880N/A+ break;
16880N/A+ }
16880N/A+}
16880N/A+
16880N/A+static void
16880N/A+gdm_dynamic_display_get_property (GObject *object,
16880N/A+ guint prop_id,
16880N/A+ GValue *value,
16880N/A+ GParamSpec *pspec)
16880N/A+{
16880N/A+ switch (prop_id) {
16880N/A+ default:
16880N/A+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
16880N/A+ break;
16880N/A+ }
16880N/A+}
16880N/A+
16880N/A+static void
16880N/A+gdm_dynamic_display_class_init (GdmDynamicDisplayClass *klass)
16880N/A+{
16880N/A+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
16880N/A+ GdmDisplayClass *display_class = GDM_DISPLAY_CLASS (klass);
16880N/A+
16880N/A+ object_class->get_property = gdm_dynamic_display_get_property;
16880N/A+ object_class->set_property = gdm_dynamic_display_set_property;
16880N/A+ object_class->finalize = gdm_dynamic_display_finalize;
16880N/A+
16880N/A+ display_class->create_authority = gdm_dynamic_display_create_authority;
16880N/A+ display_class->add_user_authorization = gdm_dynamic_display_add_user_authorization;
16880N/A+ display_class->remove_user_authorization = gdm_dynamic_display_remove_user_authorization;
16880N/A+ display_class->manage = gdm_dynamic_display_manage;
16880N/A+ display_class->finish = gdm_dynamic_display_finish;
16880N/A+ display_class->unmanage = gdm_dynamic_display_unmanage;
16880N/A+
16880N/A+ g_type_class_add_private (klass, sizeof (GdmDynamicDisplayPrivate));
16880N/A+}
16880N/A+
16880N/A+static void
16880N/A+gdm_dynamic_display_init (GdmDynamicDisplay *display)
16880N/A+{
16880N/A+ display->priv = GDM_DYNAMIC_DISPLAY_GET_PRIVATE (display);
20828N/A+ display->priv->removed = FALSE;
20828N/A+ display->priv->do_respawn = FALSE;
16880N/A+}
16880N/A+
16880N/A+static void
16880N/A+gdm_dynamic_display_finalize (GObject *object)
16880N/A+{
16880N/A+ GdmDynamicDisplay *display;
16880N/A+
16880N/A+ g_return_if_fail (object != NULL);
16880N/A+ g_return_if_fail (GDM_IS_DYNAMIC_DISPLAY (object));
16880N/A+
20319N/A+ g_debug ("GdmDynamicDisplay: Finalize dynamic display");
20319N/A+
16880N/A+ display = GDM_DYNAMIC_DISPLAY (object);
16880N/A+
16880N/A+ g_return_if_fail (display->priv != NULL);
16880N/A+
16880N/A+ G_OBJECT_CLASS (gdm_dynamic_display_parent_class)->finalize (object);
16880N/A+}
16880N/A+
16880N/A+GdmDisplay *
16880N/A+gdm_dynamic_display_new (int display_number)
16880N/A+{
16880N/A+ GObject *object;
16880N/A+ char *x11_display;
16880N/A+
16880N/A+ x11_display = g_strdup_printf (":%d", display_number);
16880N/A+ object = g_object_new (GDM_TYPE_DYNAMIC_DISPLAY,
16880N/A+ "x11-display-number", display_number,
16880N/A+ "x11-display-name", x11_display,
16880N/A+ NULL);
16880N/A+ g_free (x11_display);
16880N/A+
16880N/A+ return GDM_DISPLAY (object);
16880N/A+}
16880N/Anew file mode 100644
16880N/Aindex 0000000..9595a40
16880N/A--- /dev/null
16880N/A+++ b/daemon/gdm-dynamic-display.h
20828N/A@@ -0,0 +1,60 @@
16880N/A+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
16880N/A+ *
16880N/A+ * Authors: halton.huo@sun.com
16880N/A+ * Copyright (C) 2009 Sun Microsystems, Inc.
16880N/A+ *
16880N/A+ * This program is free software; you can redistribute it and/or modify
16880N/A+ * it under the terms of the GNU General Public License as published by
16880N/A+ * the Free Software Foundation; either version 2 of the License, or
16880N/A+ * (at your option) any later version.
16880N/A+ *
16880N/A+ * This program is distributed in the hope that it will be useful,
16880N/A+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16880N/A+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16880N/A+ * GNU General Public License for more details.
16880N/A+ *
16880N/A+ * You should have received a copy of the GNU General Public License
16880N/A+ * along with this program; if not, write to the Free Software
16880N/A+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16880N/A+ *
16880N/A+ */
16880N/A+
16880N/A+
16880N/A+#ifndef __GDM_DYNAMIC_DISPLAY_H
16880N/A+#define __GDM_DYNAMIC_DISPLAY_H
16880N/A+
16880N/A+#include <glib-object.h>
16880N/A+#include <dbus/dbus-glib.h>
16880N/A+#include "gdm-display.h"
16880N/A+
16880N/A+G_BEGIN_DECLS
16880N/A+
16880N/A+#define GDM_TYPE_DYNAMIC_DISPLAY (gdm_dynamic_display_get_type ())
16880N/A+#define GDM_DYNAMIC_DISPLAY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_DYNAMIC_DISPLAY, GdmDynamicDisplay))
16880N/A+#define GDM_DYNAMIC_DISPLAY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_DYNAMIC_DISPLAY, GdmDynamicDisplayClass))
16880N/A+#define GDM_IS_DYNAMIC_DISPLAY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_DYNAMIC_DISPLAY))
16880N/A+#define GDM_IS_DYNAMIC_DISPLAY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_DYNAMIC_DISPLAY))
16880N/A+#define GDM_DYNAMIC_DISPLAY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_DYNAMIC_DISPLAY, GdmDynamicDisplayClass))
16880N/A+
16880N/A+typedef struct _GdmDynamicDisplayPrivate GdmDynamicDisplayPrivate;
16880N/A+
16880N/A+typedef struct
16880N/A+{
16880N/A+ GdmDisplay parent;
16880N/A+ GdmDynamicDisplayPrivate *priv;
16880N/A+} GdmDynamicDisplay;
16880N/A+
16880N/A+typedef struct
16880N/A+{
16880N/A+ GdmDisplayClass parent_class;
16880N/A+
16880N/A+} GdmDynamicDisplayClass;
16880N/A+
16880N/A+GType gdm_dynamic_display_get_type (void);
16880N/A+GdmDisplay * gdm_dynamic_display_new (int display_number);
20828N/A+void gdm_dynamic_display_respawn (GdmDynamicDisplay *display, gboolean respawn);
20828N/A+void gdm_dynamic_display_removed (GdmDynamicDisplay *display);
16880N/A+
16880N/A+G_END_DECLS
16880N/A+
16880N/A+#endif /* __GDM_DYNAMIC_DISPLAY_H */
16880N/Adiff --git a/daemon/gdm-factory-slave.c b/daemon/gdm-factory-slave.c
18940N/Aindex e0be0ea..da67a87 100644
16880N/A--- a/daemon/gdm-factory-slave.c
16880N/A+++ b/daemon/gdm-factory-slave.c
20788N/A@@ -502,6 +502,7 @@ run_greeter (GdmFactorySlave *slave)
16880N/A char *display_id;
16880N/A char *display_name;
20788N/A char *seat_id;
16983N/A+ char *session_id;
16880N/A char *display_device;
16880N/A char *display_hostname;
16880N/A char *auth_file;
20788N/A@@ -513,6 +514,7 @@ run_greeter (GdmFactorySlave *slave)
16880N/A display_id = NULL;
16880N/A display_name = NULL;
20788N/A seat_id = NULL;
16983N/A+ session_id = NULL;
16880N/A auth_file = NULL;
16880N/A display_device = NULL;
16880N/A display_hostname = NULL;
20788N/A@@ -522,6 +524,7 @@ run_greeter (GdmFactorySlave *slave)
16880N/A "display-id", &display_id,
16880N/A "display-name", &display_name,
20788N/A "display-seat-id", &seat_id,
18747N/A+ "display-session-id", &session_id,
16880N/A "display-hostname", &display_hostname,
16880N/A "display-x11-authority-file", &auth_file,
16880N/A NULL);
20788N/A@@ -579,6 +582,7 @@ run_greeter (GdmFactorySlave *slave)
16880N/A g_debug ("GdmFactorySlave: Creating greeter on %s %s", display_name, display_device);
16880N/A slave->priv->greeter = gdm_greeter_session_new (display_name,
20788N/A seat_id,
16983N/A+ session_id,
16880N/A display_device,
16880N/A display_hostname,
17662N/A display_is_local);
20788N/A@@ -674,14 +678,12 @@ on_server_died (GdmServer *server,
16880N/A static gboolean
16880N/A gdm_factory_slave_run (GdmFactorySlave *slave)
16880N/A {
16880N/A- char *display_name;
16880N/A- char *auth_file;
16880N/A+ char *display_id;
16880N/A gboolean display_is_local;
16880N/A
16880N/A g_object_get (slave,
16880N/A+ "display-id", &display_id,
16880N/A "display-is-local", &display_is_local,
16880N/A- "display-name", &display_name,
16880N/A- "display-x11-authority-file", &auth_file,
16880N/A NULL);
16880N/A
16880N/A /* if this is local display start a server if one doesn't
20788N/A@@ -689,7 +691,7 @@ gdm_factory_slave_run (GdmFactorySlave *
16880N/A if (display_is_local) {
16880N/A gboolean res;
16880N/A
16880N/A- slave->priv->server = gdm_server_new (display_name, auth_file);
16880N/A+ slave->priv->server = gdm_server_new (display_id);
16880N/A g_signal_connect (slave->priv->server,
16880N/A "exited",
16880N/A G_CALLBACK (on_server_exited),
20788N/A@@ -721,8 +723,7 @@ gdm_factory_slave_run (GdmFactorySlave *
16880N/A g_timeout_add (500, (GSourceFunc)idle_connect_to_display, slave);
16880N/A }
16880N/A
16880N/A- g_free (display_name);
16880N/A- g_free (auth_file);
16880N/A+ g_free (display_id);
16880N/A
16880N/A return TRUE;
16880N/A }
16880N/Adiff --git a/daemon/gdm-greeter-session.c b/daemon/gdm-greeter-session.c
17753N/Aindex 994acbc..3dac4f9 100644
16880N/A--- a/daemon/gdm-greeter-session.c
16880N/A+++ b/daemon/gdm-greeter-session.c
20788N/A@@ -141,6 +141,7 @@ gdm_greeter_session_finalize (GObject *o
16880N/A GdmGreeterSession *
16880N/A gdm_greeter_session_new (const char *display_name,
20788N/A const char *seat_id,
16983N/A+ const char *session_id,
16880N/A const char *display_device,
16880N/A const char *display_hostname,
17662N/A gboolean display_is_local)
20788N/A@@ -155,6 +156,7 @@ gdm_greeter_session_new (const char *dis
16880N/A "register-ck-session", TRUE,
16880N/A "x11-display-name", display_name,
20788N/A "x11-display-seat-id", seat_id,
16983N/A+ "x11-display-session-id", session_id,
16880N/A "x11-display-device", display_device,
16880N/A "x11-display-hostname", display_hostname,
16880N/A "x11-display-is-local", display_is_local,
16880N/Adiff --git a/daemon/gdm-greeter-session.h b/daemon/gdm-greeter-session.h
17662N/Aindex 0a171c9..c3c3506 100644
16880N/A--- a/daemon/gdm-greeter-session.h
16880N/A+++ b/daemon/gdm-greeter-session.h
20788N/A@@ -51,6 +51,7 @@ typedef struct
16880N/A GType gdm_greeter_session_get_type (void);
16880N/A GdmGreeterSession * gdm_greeter_session_new (const char *display_name,
20788N/A const char *seat_id,
16983N/A+ const char *session_id,
16880N/A const char *display_device,
16880N/A const char *display_hostname,
17662N/A gboolean display_is_local);
16880N/Adiff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
18940N/Aindex 73ab499..f7f1a23 100644
16880N/A--- a/daemon/gdm-local-display-factory.c
16880N/A+++ b/daemon/gdm-local-display-factory.c
20839N/A@@ -27,18 +27,30 @@
20244N/A #include <glib/gi18n.h>
20244N/A #include <glib-object.h>
20244N/A
20244N/A+#include <dbus/dbus-glib-lowlevel.h>
20244N/A+
20244N/A #include "gdm-display-factory.h"
16983N/A #include "gdm-local-display-factory.h"
16983N/A #include "gdm-local-display-factory-glue.h"
16880N/A
16983N/A+#include "gdm-marshal.h"
16880N/A #include "gdm-display-store.h"
16880N/A #include "gdm-static-display.h"
16880N/A+#include "gdm-dynamic-display.h"
16880N/A #include "gdm-transient-display.h"
20839N/A #include "gdm-static-factory-display.h"
16880N/A #include "gdm-product-display.h"
16880N/A
16880N/A #define GDM_LOCAL_DISPLAY_FACTORY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_LOCAL_DISPLAY_FACTORY, GdmLocalDisplayFactoryPrivate))
16880N/A
16880N/A+#define CK_NAME "org.freedesktop.ConsoleKit"
16880N/A+#define CK_PATH "/org/freedesktop/ConsoleKit"
16880N/A+#define CK_INTERFACE "org.freedesktop.ConsoleKit"
16880N/A+#define CK_MANAGER_PATH "/org/freedesktop/ConsoleKit/Manager"
16880N/A+#define CK_MANAGER_INTERFACE "org.freedesktop.ConsoleKit.Manager"
16880N/A+#define CK_SEAT_INTERFACE "org.freedesktop.ConsoleKit.Seat"
18507N/A+#define CK_SESSION_INTERFACE "org.freedesktop.ConsoleKit.Session"
16880N/A+
16880N/A #define CK_SEAT1_PATH "/org/freedesktop/ConsoleKit/Seat1"
16880N/A
16880N/A #define GDM_DBUS_PATH "/org/gnome/DisplayManager"
20839N/A@@ -47,11 +59,17 @@
16880N/A
16880N/A #define MAX_DISPLAY_FAILURES 5
16880N/A
16880N/A+#define IS_STR_SET(x) (x != NULL && x[0] != '\0')
16880N/A+
16983N/A+#define GDM_DBUS_TYPE_G_STRING_STRING_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_STRING))
16983N/A+
16880N/A struct GdmLocalDisplayFactoryPrivate
16880N/A {
16880N/A DBusGConnection *connection;
18217N/A DBusGProxy *proxy;
16880N/A+ DBusGProxy *proxy_ck;
16880N/A GHashTable *displays;
16983N/A+ GHashTable *managed_seat_proxies;
16880N/A
16880N/A /* FIXME: this needs to be per seat? */
16880N/A guint num_failures;
20839N/A@@ -65,7 +83,14 @@ static void gdm_local_display_factor
16983N/A static void gdm_local_display_factory_init (GdmLocalDisplayFactory *factory);
16880N/A static void gdm_local_display_factory_finalize (GObject *object);
16880N/A
16983N/A-static GdmDisplay *create_display (GdmLocalDisplayFactory *factory);
16880N/A+static gboolean create_static_displays (GdmLocalDisplayFactory *factory);
16880N/A+static void on_display_status_changed (GdmDisplay *display,
16880N/A+ GParamSpec *arg1,
16880N/A+ GdmLocalDisplayFactory *factory);
16983N/A+static void on_block_console_session_requests_changed (GdmDisplay *display,
16983N/A+ GParamSpec *arg1,
16983N/A+ GdmLocalDisplayFactory *factory);
20244N/A+static gboolean connect_to_ck (GdmLocalDisplayFactory *factory);
16880N/A
16880N/A static gpointer local_display_factory_object = NULL;
16880N/A
20839N/A@@ -179,6 +204,100 @@ store_display (GdmLocalDisplayFactory *f
16880N/A g_hash_table_insert (factory->priv->displays, GUINT_TO_POINTER (num), NULL);
16880N/A }
16880N/A
16880N/A+static void
16880N/A+store_remove_display (GdmLocalDisplayFactory *factory,
16880N/A+ guint32 num,
16880N/A+ GdmDisplay *display)
16880N/A+{
16880N/A+ GdmDisplayStore *store;
16880N/A+
16880N/A+ store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
16880N/A+ gdm_display_store_remove (store, display);
16880N/A+
20319N/A+ g_debug ("GdmLocalDisplayFactory: Remove display %d from store", num);
20319N/A+
16880N/A+ /* remove from our reserved spot */
16880N/A+ g_hash_table_remove (factory->priv->displays, GUINT_TO_POINTER (num));
16880N/A+}
16880N/A+
18507N/A+static gboolean
18507N/A+lookup_by_session (const char *id,
18507N/A+ GdmDisplay *display,
18507N/A+ gpointer user_data)
18507N/A+{
18507N/A+ char *key1 = user_data;
18507N/A+ char *key2;
18507N/A+
18507N/A+ if (!GDM_IS_DISPLAY (display)) {
18507N/A+ return FALSE;
18507N/A+ }
18507N/A+
18507N/A+ gdm_display_get_session_id (display, &key2, NULL);
18507N/A+
18507N/A+ if (strcmp (key1, key2) == 0) {
18507N/A+ g_free (key2);
18507N/A+ return TRUE;
18507N/A+ }
18507N/A+ g_free (key2);
18507N/A+
18507N/A+ return FALSE;
18507N/A+}
18507N/A+
18507N/A+static gboolean
18507N/A+lookup_by_x11_display (const char *id,
18507N/A+ GdmDisplay *display,
18507N/A+ gpointer user_data)
18507N/A+{
18507N/A+ char *key1 = user_data;
18507N/A+ char *key2;
18507N/A+
18507N/A+ if (! GDM_IS_DISPLAY (display)) {
18507N/A+ return FALSE;
18507N/A+ }
18507N/A+
18507N/A+ gdm_display_get_x11_display_name (display, &key2, NULL);
18507N/A+
18507N/A+ if (strcmp (key1, key2) == 0) {
18507N/A+ g_free (key2);
18507N/A+ return TRUE;
18507N/A+ }
18507N/A+ g_free (key2);
18507N/A+
18507N/A+ return FALSE;
18507N/A+}
18507N/A+
18994N/A+static gboolean
18994N/A+lookup_by_x11_display_num (const char *id,
18994N/A+ GdmDisplay *display,
18994N/A+ gpointer user_data)
18994N/A+{
18994N/A+ guint32 key1 = GPOINTER_TO_UINT (user_data);
18994N/A+ int key2;
18994N/A+
18994N/A+ if (! GDM_IS_DISPLAY (display)) {
18994N/A+ return FALSE;
18994N/A+ }
18994N/A+
18994N/A+ gdm_display_get_x11_display_number (display, &key2, NULL);
18994N/A+
18994N/A+ if (key1 == key2) {
18994N/A+ return TRUE;
18994N/A+ }
18994N/A+
18994N/A+ return FALSE;
18994N/A+}
18994N/A+
18507N/A+static GdmDisplay *
18507N/A+factory_find_display (GdmLocalDisplayFactory *factory,
18507N/A+ GdmDisplayStoreFunc predicate,
18507N/A+ gpointer user_data)
18507N/A+{
18507N/A+ GdmDisplayStore *store;
18507N/A+
18507N/A+ store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
18507N/A+ return gdm_display_store_find (store, predicate, user_data);
18507N/A+}
18507N/A+
16880N/A /*
16880N/A Example:
16880N/A dbus-send --system --dest=org.gnome.DisplayManager \
20839N/A@@ -275,14 +394,113 @@ gdm_local_display_factory_create_product
16983N/A return ret;
16880N/A }
16880N/A
16983N/A+static gboolean
16983N/A+display_has_pending_sessions (GdmLocalDisplayFactory *factory,
16983N/A+ GdmDisplay *display)
16983N/A+{
16983N/A+ return g_object_get_data (G_OBJECT (display),
16983N/A+ "gdm-local-display-factory-console-session-requests") != NULL;
16983N/A+}
16983N/A+
20828N/A static void
20828N/A-on_static_display_status_changed (GdmDisplay *display,
20828N/A- GParamSpec *arg1,
20828N/A- GdmLocalDisplayFactory *factory)
16983N/A+manage_next_pending_session_on_display (GdmLocalDisplayFactory *factory,
16983N/A+ GdmDisplay *display)
16983N/A+{
16983N/A+ GList *pending_sessions;
16983N/A+ GList *next_session;
16983N/A+ char *ssid;
16983N/A+
20319N/A+ g_debug ("GdmLocalDisplayFactory: Manage next pending session on display");
16983N/A+
16983N/A+ pending_sessions = g_object_get_data (G_OBJECT (display),
16983N/A+ "gdm-local-display-factory-console-session-requests");
16983N/A+ next_session = g_list_last (pending_sessions);
16983N/A+
16983N/A+ if (next_session == NULL) {
16983N/A+ return;
16983N/A+ }
16983N/A+
16983N/A+ ssid = next_session->data;
16983N/A+ pending_sessions = g_list_delete_link (pending_sessions, next_session);
16983N/A+ g_object_set_data (G_OBJECT (display),
16983N/A+ "gdm-local-display-factory-console-session-requests",
16983N/A+ pending_sessions);
16983N/A+
16983N/A+ g_object_set (display, "session-id", ssid, NULL);
16983N/A+ g_free (ssid);
16983N/A+
16983N/A+ gdm_display_manage (display);
16983N/A+}
16983N/A+
18212N/A+static void
16983N/A+discard_pending_session_on_display (GdmLocalDisplayFactory *factory,
16983N/A+ GdmDisplay *display,
16983N/A+ const char *ssid)
16983N/A+{
16983N/A+ GList *pending_sessions;
16983N/A+ GList *node;
16983N/A+
16983N/A+ pending_sessions = g_object_get_data (G_OBJECT (display),
16983N/A+ "gdm-local-display-factory-console-session-requests");
16983N/A+ node = g_list_last (pending_sessions);
16983N/A+
16983N/A+ while (node != NULL) {
16983N/A+ GList *prev_node;
16983N/A+ char *node_ssid;
16983N/A+
16983N/A+ prev_node = node->prev;
16983N/A+ node_ssid = node->data;
16983N/A+
16983N/A+ if (strcmp (node_ssid, ssid) == 0) {
16983N/A+ pending_sessions = g_list_delete_link (pending_sessions, node);
16983N/A+ break;
16983N/A+ }
16983N/A+
16983N/A+ node = prev_node;
16983N/A+ }
16983N/A+
16983N/A+ g_object_set_data (G_OBJECT (display),
16983N/A+ "gdm-local-display-factory-console-session-requests",
16983N/A+ pending_sessions);
16983N/A+}
16983N/A+
20828N/A+static void
16983N/A+on_block_console_session_requests_changed (GdmDisplay *display,
16983N/A+ GParamSpec *arg1,
16983N/A+ GdmLocalDisplayFactory *factory)
16983N/A+{
16983N/A+ gboolean display_is_blocked;
16983N/A+ int status;
16983N/A+
16983N/A+ g_object_get (G_OBJECT (display),
16983N/A+ "status", &status,
16983N/A+ "block-console-session-requests",
16983N/A+ &display_is_blocked, NULL);
16983N/A+
16983N/A+ if (display_is_blocked) {
16983N/A+ int number;
16983N/A+
16983N/A+ gdm_display_get_x11_display_number (display, &number, NULL);
16983N/A+ g_debug ("GdmLocalDisplayFactory: display :%d is blocked", number);
16983N/A+ return;
16983N/A+ }
16983N/A+
16983N/A+ if (status == GDM_DISPLAY_UNMANAGED) {
16983N/A+ manage_next_pending_session_on_display (factory, display);
16983N/A+ }
16983N/A+}
16983N/A+
18994N/A+static void
16880N/A+on_display_status_changed (GdmDisplay *display,
16880N/A+ GParamSpec *arg1,
16880N/A+ GdmLocalDisplayFactory *factory)
16880N/A {
16880N/A int status;
16880N/A GdmDisplayStore *store;
16983N/A int num;
16983N/A+ gboolean display_is_blocked;
20319N/A+
20319N/A+ g_debug ("GdmLocalDisplayFactory: Display Status Changed");
16983N/A
16983N/A num = -1;
16983N/A gdm_display_get_x11_display_number (display, &num, NULL);
20839N/A@@ -292,16 +510,17 @@ on_static_display_status_changed (GdmDis
16983N/A
16983N/A status = gdm_display_get_status (display);
16880N/A
16983N/A+ g_object_get (G_OBJECT (display),
16983N/A+ "block-console-session-requests",
16983N/A+ &display_is_blocked, NULL);
16983N/A+
16983N/A g_debug ("GdmLocalDisplayFactory: static display status changed: %d", status);
16983N/A switch (status) {
16983N/A case GDM_DISPLAY_FINISHED:
18507N/A- /* remove the display number from factory->priv->displays
18507N/A- so that it may be reused */
18507N/A- g_hash_table_remove (factory->priv->displays, GUINT_TO_POINTER (num));
18507N/A- gdm_display_store_remove (store, display);
18507N/A- /* reset num failures */
18507N/A+ /* Do not remove the display number from factory->priv->displays
18507N/A+ here because it should be remove under signal "SessionRemoved"
18507N/A+ */
16983N/A factory->priv->num_failures = 0;
16983N/A- create_display (factory);
16983N/A break;
16983N/A case GDM_DISPLAY_FAILED:
16983N/A /* leave the display number in factory->priv->displays
20839N/A@@ -313,11 +532,13 @@ on_static_display_status_changed (GdmDis
16983N/A g_warning ("GdmLocalDisplayFactory: maximum number of X display failures reached: check X server log for errors");
18940N/A /* FIXME: should monitor hardware changes to
18940N/A try again when seats change */
18940N/A- } else {
18940N/A- create_display (factory);
16983N/A }
16983N/A break;
16983N/A case GDM_DISPLAY_UNMANAGED:
18940N/A+ if (display_has_pending_sessions (factory, display) && !display_is_blocked) {
16983N/A+ store_display (factory, num, display);
16983N/A+ manage_next_pending_session_on_display (factory, display);
16983N/A+ }
16983N/A break;
16983N/A case GDM_DISPLAY_PREPARED:
16983N/A break;
20839N/A@@ -329,38 +550,535 @@ on_static_display_status_changed (GdmDis
16983N/A }
16880N/A }
16880N/A
16983N/A-static GdmDisplay *
16983N/A-create_display (GdmLocalDisplayFactory *factory)
16880N/A+static void
16983N/A+seat_open_session_request (DBusGProxy *seat_proxy,
16983N/A+ const char *ssid,
17291N/A+ const char *session_type,
17291N/A+ const char *display_template_name,
16983N/A+ GHashTable *display_variables,
16983N/A+ const char *display_type,
16983N/A+ GHashTable *parameters,
16983N/A+ GdmLocalDisplayFactory *factory)
20059N/A {
20059N/A GdmDisplay *display;
20059N/A- guint32 num;
16880N/A+ gint argc;
16880N/A+ gchar **argv;
16880N/A+ GError *error;
16880N/A+ char *comm = NULL;
16880N/A+ const char *sid = NULL;
16880N/A+ gint32 display_number;
20059N/A+ gboolean is_chooser = FALSE;
20059N/A+ gboolean use_auth = FALSE;
16880N/A+ int i;
16983N/A+ char *xserver_command;
16983N/A+ gboolean display_is_blocked;
16983N/A+ GList *pending_sessions;
20319N/A+
16983N/A+ g_return_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory));
16983N/A+
20319N/A+ g_debug ("GdmLocalDisplayFactory: Open Session Request");
20319N/A+
16983N/A+ display_is_blocked = FALSE;
16983N/A+
18507N/A+ display = factory_find_display (factory, lookup_by_session, (gpointer)ssid);
16880N/A+
16983N/A+ if (display != NULL) {
16983N/A+ g_object_get (G_OBJECT (display),
16983N/A+ "block-console-session-requests",
16983N/A+ &display_is_blocked, NULL);
16983N/A+ }
20319N/A
20319N/A- num = take_next_display_number (factory);
16983N/A+ if (strcmp (display_type, "X11") != 0) {
16983N/A+ g_warning ("Unknown display type '%s' requested", display_type);
16983N/A+ return;
16983N/A+ }
20788N/A
20788N/A-#if 0
20788N/A- display = gdm_static_factory_display_new (num);
20788N/A-#else
20788N/A- display = gdm_static_display_new (num);
20788N/A-#endif
16983N/A+ xserver_command = g_hash_table_lookup (parameters, "Exec");
20788N/A
20788N/A- /* FIXME: don't hardcode seat1? */
20788N/A- g_object_set (display, "seat-id", CK_SEAT1_PATH, NULL);
16880N/A+ if (! g_shell_parse_argv (xserver_command, &argc, &argv, &error)) {
16880N/A+ g_warning ("Could not parse command %s: %s", xserver_command, error->message);
16880N/A+ g_error_free (error);
16880N/A+ return;
16880N/A+ }
20788N/A
20788N/A- g_signal_connect (display,
20788N/A- "notify::status",
20788N/A- G_CALLBACK (on_static_display_status_changed),
20788N/A- factory);
20059N/A+ g_debug("GdmLocalDisplayFactory: X11 server cmd pre-mangle: %s",
20059N/A+ xserver_command);
16880N/A+ for (i = 0; i < argc; i++) {
16880N/A+ /* replase $display in case of not specified */
16880N/A+ if (g_str_equal (argv[i], "$display")) {
16880N/A+ display_number = take_next_display_number (factory);
20059N/A+ argv[i][0] = '\0';
20059N/A+ continue;
16880N/A+ }
20788N/A
20788N/A- store_display (factory, num, display);
16880N/A+ /* get display_number in case of specified */
16880N/A+ if (g_str_has_prefix (argv[i], ":")) {
16880N/A+ display_number = atoi (argv[i]+1);
20059N/A+ argv[i][0] = '\0';
20059N/A+ continue;
20059N/A+ }
20788N/A
20788N/A- /* let store own the ref */
20788N/A- g_object_unref (display);
20059N/A+ if (! g_strcmp0 (argv[i], "-indirect")) {
20059N/A+ is_chooser = TRUE;
20059N/A+ continue;
20059N/A+ }
20788N/A
20788N/A- if (! gdm_display_manage (display)) {
20788N/A- gdm_display_unmanage (display);
20059N/A+ /*
20059N/A+ * -auth is added by gdm_server_resolve_command_line()
20059N/A+ * in gdm-server.c
20059N/A+ */
20059N/A+ if (! g_strcmp0 (argv[i], "-auth") &&
20059N/A+ ! g_strcmp0 (argv[i+1], "$auth")) {
20059N/A+ use_auth = TRUE;
20059N/A+ argv[i][0] = '\0';
20059N/A+ argv[++i][0] = '\0';
20059N/A+ continue;
20059N/A+ }
20059N/A+
20059N/A+ if (!g_strcmp0 (argv[i], "$vt")) {
20059N/A+ argv[i][0] = '\0';
20059N/A+ continue;
16880N/A+ }
16880N/A+ }
20059N/A+ comm = g_strjoinv (" ", argv);
20059N/A+ g_debug ("GdmLocalDisplayFactory: X11 server cmd post-mangle: %s",
20059N/A+ comm);
16880N/A+ g_strfreev (argv);
20788N/A+
20788N/A+ if (display == NULL) {
16983N/A+ if (is_chooser) {
16983N/A+ /* TODO: Start a xdmcp chooser as request */
16983N/A+
16983N/A+ /* display = gdm_xdmcp_chooser_display_new (display_number); */
16983N/A+ } else {
16983N/A+ display = gdm_dynamic_display_new (display_number);
16983N/A+ }
16983N/A+
16983N/A+ if (display == NULL) {
16983N/A+ g_warning ("Unable to create display: %d", display_number);
16983N/A+ g_free (comm);
16983N/A+ return;
16983N/A+ }
16983N/A+
16983N/A+ g_object_set (display, "session-id", ssid, NULL);
16983N/A+
16983N/A+ sid = dbus_g_proxy_get_path (seat_proxy);
16983N/A+ if (IS_STR_SET (sid))
16983N/A+ g_object_set (display, "seat-id", sid, NULL);
16983N/A+ if (IS_STR_SET (comm))
16983N/A+ g_object_set (display, "x11-command", comm, NULL);
16880N/A+ g_free (comm);
17291N/A+ if (IS_STR_SET (display_template_name))
17291N/A+ g_object_set (display, "x11-display-type", display_template_name, NULL);
16983N/A+ g_object_set (display, "use-auth", use_auth, NULL);
16983N/A+
16983N/A+ g_signal_connect (display,
16983N/A+ "notify::status",
16983N/A+ G_CALLBACK (on_display_status_changed),
16983N/A+ factory);
16983N/A+
16983N/A+ g_signal_connect (display,
16983N/A+ "notify::block-console-session-requests",
16983N/A+ G_CALLBACK (on_block_console_session_requests_changed),
16983N/A+ factory);
16983N/A+
16983N/A+ store_display (factory, display_number, display);
16983N/A+
16983N/A+ g_object_unref (display);
16983N/A+
16983N/A+ if (! gdm_display_manage (display)) {
16983N/A+ gdm_display_unmanage (display);
16983N/A+ }
16983N/A+
16880N/A+ return;
20828N/A }
20828N/A
20828N/A- return display;
16983N/A+ /* FIXME: Make sure the display returned is compatible
16983N/A+ */
20788N/A+
16983N/A+ if (!display_is_blocked) {
16983N/A+ /* FIXME: What do we do here?
16983N/A+ */
20066N/A+ g_debug ("Got console request to add display for session that "
20066N/A+ "already has a display, and display is already in "
20066N/A+ "use");
16983N/A+ return;
16983N/A+ }
20788N/A+
16983N/A+ pending_sessions = g_object_get_data (G_OBJECT (display),
16983N/A+ "gdm-local-display-factory-console-session-requests");
16983N/A+ pending_sessions = g_list_prepend (pending_sessions, g_strdup (ssid));
20319N/A+
16983N/A+ g_object_set_data (G_OBJECT (display),
16983N/A+ "gdm-local-display-factory-console-session-requests",
16983N/A+ pending_sessions);
16880N/A+}
20788N/A+
16880N/A+static void
16983N/A+seat_close_session_request (DBusGProxy *seat_proxy,
16983N/A+ const char *ssid,
16983N/A+ GdmLocalDisplayFactory *factory)
16880N/A+{
16880N/A+ GdmDisplay *display;
16983N/A+ int display_number;
16983N/A+ char *display_ssid;
20788N/A+
20319N/A+ g_debug ("GdmLocalDisplayFactory: Close session request");
20059N/A+
16880N/A+ g_return_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory));
16880N/A+
18507N/A+ display = factory_find_display (factory, lookup_by_session, (gpointer)ssid);
20244N/A+
20244N/A+ if (display == NULL) {
16983N/A+ g_debug ("GdmLocalDisplayFactory: display for session '%s' doesn't exists", ssid);
16983N/A+ return;
20319N/A+ }
20319N/A+
16983N/A+ g_object_get (G_OBJECT (display), "session-id", &display_ssid, NULL);
20244N/A+
16983N/A+ if (display_ssid == NULL || strcmp (ssid, display_ssid) != 0) {
16983N/A+ g_free (display_ssid);
16983N/A+ discard_pending_session_on_display (factory, display, ssid);
16880N/A+ return;
20788N/A+ }
16983N/A+ g_free (display_ssid);
20244N/A+
16880N/A+ if (! gdm_display_unmanage (display)) {
16880N/A+ display = NULL;
16880N/A+ return;
16880N/A+ }
20244N/A+
16983N/A+ gdm_display_get_x11_display_number (display, &display_number, NULL);
16880N/A+ store_remove_display (factory, display_number, display);
16880N/A+}
20244N/A+
20828N/A+static void
20828N/A+seat_session_no_respawn (DBusGProxy *seat_proxy,
20828N/A+ const char *ssid,
20828N/A+ GdmLocalDisplayFactory *factory)
20828N/A+{
20828N/A+ GdmDisplay *display;
20828N/A+ int display_number;
20828N/A+ char *display_ssid;
20828N/A+
20828N/A+ g_debug ("GdmLocalDisplayFactory: No Respawn");
20828N/A+
20828N/A+ g_return_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory));
20828N/A+
20828N/A+ display = factory_find_display (factory, lookup_by_session, (gpointer)ssid);
20828N/A+
20828N/A+ if (display == NULL) {
20828N/A+ g_debug ("GdmLocalDisplayFactory: display for session '%s' doesn't exists", ssid);
20828N/A+ return;
20828N/A+ }
20828N/A+
20828N/A+ if (GDM_IS_DYNAMIC_DISPLAY (display)) {
20828N/A+ gdm_dynamic_display_removed (GDM_DYNAMIC_DISPLAY (display));
20828N/A+ }
20828N/A+}
20828N/A+
18507N/A+static gboolean
18507N/A+get_session_x11_display (GdmLocalDisplayFactory *factory,
18507N/A+ const char *ssid,
18507N/A+ char **x11_display)
18507N/A+{
18507N/A+ DBusGProxy *proxy;
18507N/A+ gboolean res;
18507N/A+
18507N/A+ if (!x11_display)
18507N/A+ return FALSE;
18507N/A+
18507N/A+ proxy = dbus_g_proxy_new_for_name (factory->priv->connection,
18507N/A+ CK_NAME,
18507N/A+ ssid,
18507N/A+ CK_SESSION_INTERFACE);
18507N/A+ if (proxy == NULL) {
18507N/A+ return FALSE;
20244N/A+ }
20244N/A+
18507N/A+ res = dbus_g_proxy_call (proxy,
18507N/A+ "GetX11Display",
18507N/A+ NULL,
18507N/A+ G_TYPE_INVALID,
18507N/A+ G_TYPE_STRING, x11_display,
18507N/A+ G_TYPE_INVALID);
18507N/A+ if (!res) {
18507N/A+ return FALSE;
18507N/A+ }
18507N/A+
18507N/A+ return TRUE;
18507N/A+}
18507N/A+
18507N/A+static void
18507N/A+seat_session_added (DBusGProxy *seat_proxy,
18507N/A+ const char *ssid,
18507N/A+ GdmLocalDisplayFactory *factory)
18507N/A+{
18507N/A+ GdmDisplay *display;
18507N/A+ char *x11_display;
18507N/A+ gboolean res;
18507N/A+
20319N/A+ g_debug ("GdmLocalDisplayFactory: Adding Seat Session");
20319N/A+
18507N/A+ res = get_session_x11_display (factory, ssid, &x11_display);
18507N/A+ if (!res) {
18507N/A+ g_warning ("Failed to get X11 display number for %s", ssid);
18507N/A+ return;
18507N/A+ }
18507N/A+
18507N/A+ display = factory_find_display (factory, lookup_by_x11_display,
18507N/A+x11_display);
18507N/A+ if (display) {
18507N/A+ gdm_display_set_session_id (display, ssid, NULL);
18507N/A+ g_debug ("Update session id for display %s to %s",
18507N/A+ x11_display, ssid);
18507N/A+ }
18507N/A+ g_free (x11_display);
18507N/A+}
18507N/A+
18507N/A+
18507N/A+static void
18507N/A+seat_session_removed (DBusGProxy *seat_proxy,
18507N/A+ const char *ssid,
18507N/A+ GdmLocalDisplayFactory *factory)
18507N/A+{
18507N/A+ GdmDisplay *display = NULL;
18507N/A+ gboolean res;
18507N/A+ int status;
18507N/A+ int num;
18507N/A+
20319N/A+ g_debug ("GdmLocalDisplayFactory: Removed Seat Session");
20319N/A+
18507N/A+ display = factory_find_display (factory, lookup_by_session,
18507N/A+(gpointer)ssid);
18507N/A+ if (display) {
18507N/A+ num = -1;
18507N/A+ gdm_display_get_x11_display_number (display, &num, NULL);
18507N/A+ g_assert (num != -1);
18507N/A+ store_remove_display (factory, num, display);
18507N/A+ }
18507N/A+}
18507N/A+
16983N/A+static void
16983N/A+seat_remove_request (DBusGProxy *seat_proxy,
16983N/A+ GdmLocalDisplayFactory *factory)
16983N/A+{
16983N/A+ GHashTableIter iter;
16983N/A+ gpointer key, value;
16983N/A+ const char *sid_to_remove;
16983N/A+ GQueue ssids_to_remove;
16880N/A+
20319N/A+ g_debug ("GdmLocalDisplayFactory: Seat Remove Request");
20319N/A+
16983N/A+ sid_to_remove = dbus_g_proxy_get_path (seat_proxy);
16983N/A+
16983N/A+ g_queue_init (&ssids_to_remove);
18507N/A+ g_hash_table_iter_init (&iter, factory->priv->displays);
16983N/A+ while (g_hash_table_iter_next (&iter, &key, &value)) {
16983N/A+ GdmDisplay *display;
16983N/A+ char *sid;
18994N/A+ guint32 x11_display_num;
18994N/A+
18994N/A+ x11_display_num = GPOINTER_TO_UINT (key);
18994N/A+ display = factory_find_display (factory,
18994N/A+ lookup_by_x11_display_num,
18994N/A+ GUINT_TO_POINTER (x11_display_num));
16983N/A+
16983N/A+ gdm_display_get_seat_id (display, &sid, NULL);
16983N/A+
16983N/A+ if (strcmp (sid, sid_to_remove) == 0) {
16983N/A+ char *ssid;
16983N/A+
16983N/A+ gdm_display_get_session_id (display, &ssid, NULL);
16880N/A+
16983N/A+ g_queue_push_tail (&ssids_to_remove, ssid);
16983N/A+ }
16983N/A+
16983N/A+ g_free (sid);
20059N/A+ }
20059N/A+
16983N/A+ while (!g_queue_is_empty (&ssids_to_remove)) {
16983N/A+ char *ssid;
16983N/A+
16983N/A+ ssid = g_queue_pop_head (&ssids_to_remove);
16983N/A+
16983N/A+ seat_close_session_request (seat_proxy, ssid, factory);
16880N/A+
16983N/A+ g_free (ssid);
18217N/A+ }
18217N/A+
16983N/A+ g_hash_table_remove (factory->priv->managed_seat_proxies, sid_to_remove);
16880N/A+
16983N/A+ dbus_g_proxy_call_no_reply (seat_proxy,
16983N/A+ "Unmanage",
16983N/A+ G_TYPE_INVALID,
16983N/A+ G_TYPE_INVALID);
16983N/A+
20244N/A+ if (factory->priv->proxy_ck == NULL) {
20244N/A+ connect_to_ck (factory);
20244N/A+ }
20244N/A+
16983N/A+ dbus_g_proxy_call_no_reply (factory->priv->proxy_ck,
16983N/A+ "RemoveSeat",
16983N/A+ DBUS_TYPE_G_OBJECT_PATH, sid_to_remove,
16983N/A+ G_TYPE_INVALID,
16983N/A+ G_TYPE_INVALID);
16880N/A+}
16880N/A+
16880N/A+static void
16880N/A+manage_static_sessions_per_seat (GdmLocalDisplayFactory *factory,
16880N/A+ const char *sid)
16880N/A+{
16880N/A+ DBusGProxy *proxy;
16880N/A+
20319N/A+ g_debug ("GdmLocalDisplayFactory: Manage Static Sessions Per Seat");
20319N/A+
16880N/A+ proxy = dbus_g_proxy_new_for_name (factory->priv->connection,
16880N/A+ CK_NAME,
16880N/A+ sid,
16880N/A+ CK_SEAT_INTERFACE);
16880N/A+
16880N/A+ if (proxy == NULL) {
16880N/A+ g_warning ("Failed to connect to the ConsoleKit seat object");
16880N/A+ return;
20828N/A+ }
20828N/A+
17291N/A+ dbus_g_object_register_marshaller (gdm_marshal_VOID__STRING_STRING_STRING_POINTER_STRING_POINTER,
16880N/A+ G_TYPE_NONE,
17291N/A+ DBUS_TYPE_G_OBJECT_PATH,
17291N/A+ G_TYPE_STRING,
17291N/A+ G_TYPE_STRING,
16983N/A+ GDM_DBUS_TYPE_G_STRING_STRING_HASHTABLE,
16880N/A+ G_TYPE_STRING,
16983N/A+ GDM_DBUS_TYPE_G_STRING_STRING_HASHTABLE,
16880N/A+ G_TYPE_INVALID);
20788N/A+
16880N/A+ dbus_g_proxy_add_signal (proxy,
16983N/A+ "OpenSessionRequest",
16983N/A+ DBUS_TYPE_G_OBJECT_PATH,
16880N/A+ G_TYPE_STRING,
17291N/A+ G_TYPE_STRING,
16983N/A+ GDM_DBUS_TYPE_G_STRING_STRING_HASHTABLE,
16983N/A+ G_TYPE_STRING,
16983N/A+ GDM_DBUS_TYPE_G_STRING_STRING_HASHTABLE,
16880N/A+ G_TYPE_INVALID);
16880N/A+ dbus_g_proxy_add_signal (proxy,
16983N/A+ "CloseSessionRequest",
16983N/A+ DBUS_TYPE_G_OBJECT_PATH,
16983N/A+ G_TYPE_INVALID);
16983N/A+ dbus_g_proxy_add_signal (proxy,
20828N/A+ "NoRespawn",
20828N/A+ DBUS_TYPE_G_OBJECT_PATH,
20828N/A+ G_TYPE_INVALID);
20828N/A+ dbus_g_proxy_add_signal (proxy,
18507N/A+ "SessionAdded",
18507N/A+ DBUS_TYPE_G_OBJECT_PATH,
18507N/A+ G_TYPE_INVALID);
18507N/A+ dbus_g_proxy_add_signal (proxy,
18507N/A+ "SessionRemoved",
18507N/A+ DBUS_TYPE_G_OBJECT_PATH,
18507N/A+ G_TYPE_INVALID);
18507N/A+ dbus_g_proxy_add_signal (proxy,
16983N/A+ "RemoveRequest",
16880N/A+ G_TYPE_INVALID);
16880N/A+ dbus_g_proxy_connect_signal (proxy,
16983N/A+ "OpenSessionRequest",
16983N/A+ G_CALLBACK (seat_open_session_request),
16880N/A+ factory,
16880N/A+ NULL);
16880N/A+ dbus_g_proxy_connect_signal (proxy,
16983N/A+ "CloseSessionRequest",
16983N/A+ G_CALLBACK (seat_close_session_request),
16983N/A+ factory,
16983N/A+ NULL);
18507N/A+ dbus_g_proxy_connect_signal (proxy,
20828N/A+ "NoRespawn",
20828N/A+ G_CALLBACK (seat_session_no_respawn),
20828N/A+ factory,
20828N/A+ NULL);
20828N/A+ dbus_g_proxy_connect_signal (proxy,
18507N/A+ "SessionAdded",
18507N/A+ G_CALLBACK (seat_session_added),
18507N/A+ factory,
18507N/A+ NULL);
18507N/A+ dbus_g_proxy_connect_signal (proxy,
18507N/A+ "SessionRemoved",
18507N/A+ G_CALLBACK (seat_session_removed),
18507N/A+ factory,
18507N/A+ NULL);
16983N/A+ dbus_g_proxy_connect_signal (proxy,
16983N/A+ "RemoveRequest",
16983N/A+ G_CALLBACK (seat_remove_request),
16880N/A+ factory,
16880N/A+ NULL);
16880N/A+
16880N/A+ dbus_g_proxy_call_no_reply (proxy,
16983N/A+ "Manage",
16880N/A+ G_TYPE_INVALID,
16880N/A+ G_TYPE_INVALID);
16880N/A+
16983N/A+ g_hash_table_insert (factory->priv->managed_seat_proxies,
16983N/A+ g_strdup (dbus_g_proxy_get_path (proxy)),
16983N/A+ proxy);
16880N/A+}
16880N/A+
16880N/A+static void
16880N/A+seat_added (DBusGProxy *mgr_proxy,
16880N/A+ const char *sid,
16983N/A+ const char *type,
16880N/A+ GdmLocalDisplayFactory *factory)
16880N/A+{
20319N/A+ g_debug ("GdmLocalDisplayFactory: Seat Added");
20319N/A+
16983N/A+ if (strcmp (type, "Default") == 0) {
16983N/A+ manage_static_sessions_per_seat (factory, sid);
16983N/A+ }
16880N/A+}
16880N/A+
16880N/A+static gboolean
16880N/A+create_static_displays (GdmLocalDisplayFactory *factory)
16880N/A+{
16880N/A+ GError *error;
16880N/A+ gboolean res;
16880N/A+ GPtrArray *seats;
16880N/A+ int i;
16880N/A+
20319N/A+ g_debug ("GdmLocalDisplayFactory: Create Static Display");
20319N/A+
16880N/A+ seats = NULL;
16880N/A+
20244N/A+ if (factory->priv->proxy_ck == NULL) {
20244N/A+ connect_to_ck (factory);
20244N/A+ }
20244N/A+
16880N/A+ error = NULL;
16880N/A+ res = dbus_g_proxy_call (factory->priv->proxy_ck,
16880N/A+ "GetUnmanagedSeats",
16880N/A+ &error,
16880N/A+ G_TYPE_INVALID,
16880N/A+ dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH),
16880N/A+ &seats,
16880N/A+ G_TYPE_INVALID);
16880N/A+ if (! res) {
20244N/A+ if (error != NULL) {
16880N/A+ g_warning ("Failed to get list of unmanaged seats: %s", error->message);
16880N/A+ g_error_free (error);
20244N/A+ }
16880N/A+ return FALSE;
18940N/A+ }
18940N/A+
16880N/A+ for (i = 0; i < seats->len; i++) {
16880N/A+ char *sid;
16880N/A+
16880N/A+ sid = g_ptr_array_index (seats, i);
16880N/A+
16880N/A+ manage_static_sessions_per_seat (factory, sid);
16880N/A+
16880N/A+ g_free (sid);
16880N/A+ }
16880N/A+
16880N/A+ return TRUE;
20788N/A+
16983N/A }
16983N/A
18212N/A static gboolean
20839N/A@@ -375,7 +1093,7 @@ gdm_local_display_factory_start (GdmDisp
18940N/A ret = TRUE;
16880N/A
18940N/A /* FIXME: use seat configuration */
18940N/A- display = create_display (factory);
18940N/A+ display = create_static_displays (factory);
18940N/A if (display == NULL) {
18940N/A ret = FALSE;
18940N/A }
20839N/A@@ -439,6 +1157,68 @@ register_factory (GdmLocalDisplayFactory
18212N/A return TRUE;
18212N/A }
18212N/A
20244N/A+static void
20244N/A+bus_proxy_destroyed_cb (DBusGProxy *bus_proxy,
20244N/A+ GdmLocalDisplayFactoryPrivate *priv)
20244N/A+{
20244N/A+ g_debug ("Local Display Factory - Disconnected from D-Bus");
20244N/A+
20244N/A+ if (priv == NULL) {
20244N/A+ /* probably shutting down or something */
20244N/A+ return;
20244N/A+ }
20244N/A+
20244N/A+ priv->proxy_ck = NULL;
20244N/A+}
20244N/A+
16880N/A+static gboolean
16880N/A+connect_to_ck (GdmLocalDisplayFactory *factory)
16880N/A+{
16880N/A+ GdmLocalDisplayFactoryPrivate *priv;
16880N/A+
20319N/A+ g_debug ("GdmLocalDisplayFactory: Connect To ConsoleKit");
20319N/A+
16880N/A+ priv = factory->priv;
16880N/A+
16880N/A+ priv->proxy_ck = dbus_g_proxy_new_for_name (priv->connection,
16880N/A+ CK_NAME,
16880N/A+ CK_MANAGER_PATH,
16880N/A+ CK_MANAGER_INTERFACE);
16880N/A+
16880N/A+ if (priv->proxy_ck == NULL) {
16880N/A+ g_warning ("Couldn't create proxy for ConsoleKit Manager");
16880N/A+ return FALSE;
16880N/A+ }
16880N/A+
16983N/A+ dbus_g_object_register_marshaller (gdm_marshal_VOID__STRING_STRING,
16983N/A+ G_TYPE_NONE,
16983N/A+ G_TYPE_STRING, G_TYPE_STRING,
16983N/A+ G_TYPE_INVALID);
20788N/A+
16880N/A+ dbus_g_proxy_add_signal (priv->proxy_ck,
16880N/A+ "SeatAdded",
16983N/A+ G_TYPE_STRING,
16983N/A+ G_TYPE_STRING,
16880N/A+ G_TYPE_INVALID);
16880N/A+ dbus_g_proxy_connect_signal (priv->proxy_ck,
16880N/A+ "SeatAdded",
16880N/A+ G_CALLBACK (seat_added),
16880N/A+ factory,
16880N/A+ NULL);
20244N/A+ g_signal_connect (priv->proxy_ck,
20244N/A+ "destroy",
20244N/A+ G_CALLBACK (bus_proxy_destroyed_cb),
20244N/A+ priv);
16880N/A+}
16880N/A+
18217N/A+static void
18217N/A+disconnect_from_ck (GdmLocalDisplayFactory *factory)
18217N/A+{
18217N/A+ if (factory->priv->proxy_ck == NULL) {
18217N/A+ g_object_unref (factory->priv->proxy_ck);
18217N/A+ }
18217N/A+}
18217N/A+
18212N/A static GObject *
18212N/A gdm_local_display_factory_constructor (GType type,
18212N/A guint n_construct_properties,
20839N/A@@ -456,6 +1236,8 @@ gdm_local_display_factory_constructor (G
18212N/A g_warning ("Unable to register local display factory with system bus");
16880N/A }
18212N/A
18212N/A+ connect_to_ck (factory);
18212N/A+
18212N/A return G_OBJECT (factory);
16880N/A }
16880N/A
20839N/A@@ -484,6 +1266,11 @@ gdm_local_display_factory_init (GdmLocal
16983N/A factory->priv = GDM_LOCAL_DISPLAY_FACTORY_GET_PRIVATE (factory);
16983N/A
16983N/A factory->priv->displays = g_hash_table_new (NULL, NULL);
20244N/A+ factory->priv->proxy_ck = NULL;
16983N/A+
16983N/A+ factory->priv->managed_seat_proxies = g_hash_table_new_full (g_str_hash, g_str_equal,
16983N/A+ (GDestroyNotify) g_free,
16983N/A+ (GDestroyNotify) g_object_unref);
16983N/A }
16983N/A
16983N/A static void
20839N/A@@ -499,6 +1286,9 @@ gdm_local_display_factory_finalize (GObj
16983N/A g_return_if_fail (factory->priv != NULL);
16880N/A
16880N/A g_hash_table_destroy (factory->priv->displays);
16983N/A+ g_hash_table_destroy (factory->priv->managed_seat_proxies);
18217N/A+
18217N/A+ disconnect_from_ck (factory);
16880N/A
16880N/A G_OBJECT_CLASS (gdm_local_display_factory_parent_class)->finalize (object);
16880N/A }
16880N/Adiff --git a/daemon/gdm-product-slave.c b/daemon/gdm-product-slave.c
18940N/Aindex d4611a9..e344828 100644
16880N/A--- a/daemon/gdm-product-slave.c
16880N/A+++ b/daemon/gdm-product-slave.c
16880N/A@@ -415,14 +415,12 @@ on_server_died (GdmServer *server,
16880N/A static gboolean
16880N/A gdm_product_slave_create_server (GdmProductSlave *slave)
16880N/A {
16880N/A- char *display_name;
16880N/A- char *auth_file;
16880N/A+ char *display_id;
16880N/A gboolean display_is_local;
16880N/A
16880N/A g_object_get (slave,
16880N/A+ "display-id", &display_id,
16880N/A "display-is-local", &display_is_local,
16880N/A- "display-name", &display_name,
16880N/A- "display-x11-authority-file", &auth_file,
16880N/A NULL);
16880N/A
16880N/A /* if this is local display start a server if one doesn't
16880N/A@@ -430,7 +428,7 @@ gdm_product_slave_create_server (GdmProductSlave *slave)
16880N/A if (display_is_local) {
16880N/A gboolean res;
16880N/A
16880N/A- slave->priv->server = gdm_server_new (display_name, auth_file);
16880N/A+ slave->priv->server = gdm_server_new (display_id);
16880N/A g_signal_connect (slave->priv->server,
16880N/A "exited",
16880N/A G_CALLBACK (on_server_exited),
16880N/A@@ -462,8 +460,7 @@ gdm_product_slave_create_server (GdmProductSlave *slave)
16880N/A g_timeout_add (500, (GSourceFunc)idle_connect_to_display, slave);
16880N/A }
16880N/A
16880N/A- g_free (display_name);
16880N/A- g_free (auth_file);
16880N/A+ g_free (display_id);
16880N/A
16880N/A return TRUE;
16880N/A }
16880N/Adiff --git a/daemon/gdm-server.c b/daemon/gdm-server.c
18940N/Aindex feaf673..2ca03aa 100644
16880N/A--- a/daemon/gdm-server.c
16880N/A+++ b/daemon/gdm-server.c
18940N/A@@ -43,6 +43,8 @@
16880N/A #include <glib/gstdio.h>
16880N/A #include <glib-object.h>
16880N/A
16880N/A+#include <dbus/dbus-glib.h>
16880N/A+
16880N/A #include <X11/Xlib.h> /* for Display */
16880N/A
16880N/A #include "gdm-common.h"
18940N/A@@ -54,6 +56,9 @@ extern char **environ;
16880N/A
16880N/A #define GDM_SERVER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_SERVER, GdmServerPrivate))
16880N/A
16880N/A+#define GDM_DBUS_NAME "org.gnome.DisplayManager"
16880N/A+#define GDM_DBUS_DISPLAY_INTERFACE "org.gnome.DisplayManager.Display"
16880N/A+
16880N/A /* These are the servstat values, also used as server
16880N/A * process exit codes */
16880N/A #define SERVER_TIMEOUT 2 /* Server didn't start */
18940N/A@@ -69,12 +74,12 @@ struct GdmServerPrivate
17753N/A char *command;
17753N/A GPid pid;
17753N/A
17753N/A- gboolean disable_tcp;
17753N/A int priority;
17753N/A char *user_name;
16880N/A char *session_args;
16880N/A
16880N/A char *log_dir;
16880N/A+ char *display_id;
16880N/A char *display_name;
16880N/A char *display_device;
16880N/A char *auth_file;
18940N/A@@ -101,7 +106,7 @@ enum {
17753N/A PROP_USER_NAME,
16880N/A PROP_SESSION_ARGS,
16880N/A PROP_LOG_DIR,
17753N/A- PROP_DISABLE_TCP,
16880N/A+ PROP_DISPLAY_ID,
16880N/A };
16880N/A
16880N/A enum {
20059N/A@@ -267,6 +272,11 @@ gdm_server_resolve_command_line (GdmServ
20059N/A gboolean gotvtarg = FALSE;
20059N/A gboolean query_in_arglist = FALSE;
20059N/A
20059N/A+ if (!server->priv->command) {
20059N/A+ g_warning ("X11 server command line is missing");
20059N/A+ return FALSE;
20059N/A+ }
20059N/A+
20059N/A g_shell_parse_argv (server->priv->command, &argc, &argv, NULL);
20059N/A
20059N/A for (len = 0; argv != NULL && argv[len] != NULL; len++) {
20059N/A@@ -307,11 +317,6 @@ gdm_server_resolve_command_line (GdmServ
16880N/A query_in_arglist = TRUE;
16880N/A }
16880N/A
16880N/A- if (server->priv->disable_tcp && ! query_in_arglist) {
16880N/A- argv[len++] = g_strdup ("-nolisten");
16880N/A- argv[len++] = g_strdup ("tcp");
16880N/A- }
16880N/A-
16880N/A if (vtarg != NULL && ! gotvtarg) {
16880N/A argv[len++] = g_strdup (vtarg);
16880N/A }
20059N/A@@ -612,16 +617,20 @@ gdm_server_spawn (GdmServer *server,
17797N/A GPtrArray *env;
17797N/A gboolean ret;
17797N/A char *freeme;
17797N/A+ char *tmp;
17797N/A
17797N/A ret = FALSE;
17797N/A
20059N/A /* Figure out the server command */
20059N/A argv = NULL;
20059N/A argc = 0;
20059N/A- gdm_server_resolve_command_line (server,
20059N/A- vtarg,
20059N/A- &argc,
20059N/A- &argv);
20059N/A+ if (! gdm_server_resolve_command_line (server,
20059N/A+ vtarg,
20059N/A+ &argc,
20059N/A+ &argv)) {
20059N/A+ g_warning ("unable to process X11 server command line");
20059N/A+ return FALSE;
20059N/A+ }
20059N/A
20059N/A if (server->priv->session_args) {
20059N/A server_add_xserver_args (server, &argc, &argv);
20059N/A@@ -634,6 +643,29 @@ gdm_server_spawn (GdmServer *server,
17797N/A _exit (SERVER_ABORT);
17797N/A }
17797N/A
17797N/A+ /* Sometimes quit X slowly, adding this to avoid restart session
17797N/A+ failure */
17797N/A+ if ((tmp = strstr (server->priv->display_name, ":")) != NULL) {
17797N/A+ char *socket_file;
17797N/A+ int display_num;
17797N/A+ int count;
17797N/A+ char *p;
17797N/A+
17797N/A+ tmp++;
17797N/A+ display_num = g_ascii_strtod (tmp, &p);
17797N/A+
17797N/A+ socket_file = g_strdup_printf ("/tmp/.X11-unix/X%d",
17797N/A+ display_num);
17797N/A+ count = 0;
17797N/A+ while (count < 5) {
17797N/A+ if (!g_file_test (socket_file, G_FILE_TEST_EXISTS))
17797N/A+ break;
17797N/A+ sleep (1);
17797N/A+ count ++;
17797N/A+ }
17797N/A+ g_free (socket_file);
17797N/A+ }
17797N/A+
17797N/A env = get_server_environment (server);
17797N/A
17797N/A freeme = g_strjoinv (" ", argv);
20059N/A@@ -743,13 +775,12 @@ gdm_server_stop (GdmServer *server)
16880N/A return TRUE;
16880N/A }
16880N/A
16880N/A-
16880N/A static void
16880N/A-_gdm_server_set_display_name (GdmServer *server,
16880N/A- const char *name)
16880N/A+_gdm_server_set_display_id (GdmServer *server,
16880N/A+ const char *id)
16880N/A {
16880N/A- g_free (server->priv->display_name);
16880N/A- server->priv->display_name = g_strdup (name);
16880N/A+ g_free (server->priv->display_id);
16880N/A+ server->priv->display_id = g_strdup (id);
16880N/A }
16880N/A
16880N/A static void
20059N/A@@ -769,13 +800,6 @@ _gdm_server_set_user_name (GdmServer *s
17753N/A }
17753N/A
17753N/A static void
17753N/A-_gdm_server_set_disable_tcp (GdmServer *server,
17753N/A- gboolean disabled)
17753N/A-{
17753N/A- server->priv->disable_tcp = disabled;
17753N/A-}
17753N/A-
17753N/A-static void
17753N/A gdm_server_set_property (GObject *object,
17753N/A guint prop_id,
17753N/A const GValue *value,
20059N/A@@ -786,8 +810,8 @@ gdm_server_set_property (GObject *o
16880N/A self = GDM_SERVER (object);
16880N/A
16880N/A switch (prop_id) {
16880N/A- case PROP_DISPLAY_NAME:
16880N/A- _gdm_server_set_display_name (self, g_value_get_string (value));
16880N/A+ case PROP_DISPLAY_ID:
16880N/A+ _gdm_server_set_display_id (self, g_value_get_string (value));
16880N/A break;
16880N/A case PROP_AUTH_FILE:
16880N/A _gdm_server_set_auth_file (self, g_value_get_string (value));
20059N/A@@ -795,9 +819,6 @@ gdm_server_set_property (GObject *o
17753N/A case PROP_USER_NAME:
17753N/A _gdm_server_set_user_name (self, g_value_get_string (value));
17753N/A break;
17753N/A- case PROP_DISABLE_TCP:
17753N/A- _gdm_server_set_disable_tcp (self, g_value_get_boolean (value));
17753N/A- break;
17753N/A default:
17753N/A G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
17753N/A break;
20059N/A@@ -815,8 +836,8 @@ gdm_server_get_property (GObject *obj
16880N/A self = GDM_SERVER (object);
16880N/A
16880N/A switch (prop_id) {
16880N/A- case PROP_DISPLAY_NAME:
16880N/A- g_value_set_string (value, self->priv->display_name);
16880N/A+ case PROP_DISPLAY_ID:
16880N/A+ g_value_set_string (value, self->priv->display_id);
16880N/A break;
16880N/A case PROP_DISPLAY_DEVICE:
16880N/A g_value_take_string (value,
20059N/A@@ -828,9 +849,6 @@ gdm_server_get_property (GObject *obj
17753N/A case PROP_USER_NAME:
17753N/A g_value_set_string (value, self->priv->user_name);
17753N/A break;
17753N/A- case PROP_DISABLE_TCP:
17753N/A- g_value_set_boolean (value, self->priv->disable_tcp);
17753N/A- break;
17753N/A default:
17753N/A G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
17753N/A break;
20059N/A@@ -896,10 +914,10 @@ gdm_server_class_init (GdmServerClass *k
16880N/A G_TYPE_INT);
16880N/A
16880N/A g_object_class_install_property (object_class,
16880N/A- PROP_DISPLAY_NAME,
16880N/A- g_param_spec_string ("display-name",
16880N/A- "name",
16880N/A- "name",
16880N/A+ PROP_DISPLAY_ID,
16880N/A+ g_param_spec_string ("display-id",
16880N/A+ "display id",
16880N/A+ "display id",
16880N/A NULL,
16880N/A G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
16880N/A g_object_class_install_property (object_class,
20059N/A@@ -924,13 +942,6 @@ gdm_server_class_init (GdmServerClass *k
17753N/A "user name",
17753N/A NULL,
17753N/A G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
17753N/A- g_object_class_install_property (object_class,
17753N/A- PROP_DISABLE_TCP,
17753N/A- g_param_spec_boolean ("disable-tcp",
17753N/A- NULL,
17753N/A- NULL,
17753N/A- TRUE,
17753N/A- G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
17753N/A
17753N/A }
17753N/A
20059N/A@@ -941,7 +952,7 @@ gdm_server_init (GdmServer *server)
17753N/A server->priv = GDM_SERVER_GET_PRIVATE (server);
17753N/A
17753N/A server->priv->pid = -1;
20788N/A- server->priv->command = g_strdup (X_SERVER " -br -verbose -logverbose 7");
17753N/A+ server->priv->command = NULL;
17753N/A server->priv->log_dir = g_strdup (LOGDIR);
17753N/A
17753N/A add_ready_handler (server);
20319N/A@@ -978,15 +989,123 @@ gdm_server_finalize (GObject *object)
16880N/A }
16880N/A
16880N/A GdmServer *
16880N/A-gdm_server_new (const char *display_name,
16880N/A- const char *auth_file)
16880N/A+gdm_server_new (const char *display_id)
16880N/A {
16880N/A- GObject *object;
16880N/A+ GObject *object;
16880N/A+ GdmServer *server;
16880N/A+ DBusGConnection *connection;
16880N/A+ DBusGProxy *proxy;
16880N/A+ GError *error;
16880N/A+ gboolean res;
16880N/A+ char *id;
20319N/A+
20319N/A+ g_debug ("GdmServer: New Server");
16880N/A
16880N/A object = g_object_new (GDM_TYPE_SERVER,
16880N/A- "display-name", display_name,
16880N/A- "auth-file", auth_file,
16880N/A+ "display-id", display_id,
16880N/A NULL);
16880N/A
16880N/A- return GDM_SERVER (object);
16880N/A+ server = GDM_SERVER (object);
16880N/A+
16880N/A+ server->priv->pid = -1;
16880N/A+
16880N/A+ g_assert (server->priv->display_id != NULL);
16880N/A+
16880N/A+ error = NULL;
16880N/A+ connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
16880N/A+ if (connection == NULL) {
16880N/A+ if (error != NULL) {
16880N/A+ g_critical ("error getting system bus: %s", error->message);
16880N/A+ g_error_free (error);
16880N/A+ }
16880N/A+
16880N/A+ exit (1);
16880N/A+ }
16880N/A+
16880N/A+ g_debug ("GdmServer: Creating proxy for %s", server->priv->display_id);
16880N/A+ error = NULL;
16880N/A+ proxy = dbus_g_proxy_new_for_name_owner (connection,
16880N/A+ GDM_DBUS_NAME,
16880N/A+ server->priv->display_id,
16880N/A+ GDM_DBUS_DISPLAY_INTERFACE,
16880N/A+ &error);
16880N/A+ if (proxy == NULL) {
16880N/A+ if (error != NULL) {
16880N/A+ g_warning ("Failed to create display proxy %s: %s", server->priv->display_id, error->message);
16880N/A+ g_error_free (error);
16880N/A+ } else {
16880N/A+ g_warning ("Unable to create display proxy");
16880N/A+ }
16880N/A+
16880N/A+ exit (1);
16880N/A+ }
16880N/A+
16880N/A+ /* cache some values up front */
16880N/A+ error = NULL;
16880N/A+ res = dbus_g_proxy_call (proxy,
16880N/A+ "GetX11DisplayName",
16880N/A+ &error,
16880N/A+ G_TYPE_INVALID,
16880N/A+ G_TYPE_STRING, &server->priv->display_name,
16880N/A+ G_TYPE_INVALID);
16880N/A+ if (! res) {
16880N/A+ if (error != NULL) {
16880N/A+ g_warning ("Failed to get value: %s", error->message);
16880N/A+ g_error_free (error);
16880N/A+ } else {
16880N/A+ g_warning ("Failed to get value");
16880N/A+ }
16880N/A+
16880N/A+ exit (1);
16880N/A+ }
16880N/A+
16880N/A+ /* If display_name is not set, quit */
16880N/A+ if (! server->priv->display_name || (strlen (server->priv->display_name) == 0)) {
16880N/A+ g_warning ("Wrong value of method GetX11DisplayName for %s",server->priv->display_id);
16880N/A+ exit (1);
16880N/A+ }
16880N/A+
16880N/A+ error = NULL;
16880N/A+ res = dbus_g_proxy_call (proxy,
16880N/A+ "GetX11Command",
16880N/A+ &error,
16880N/A+ G_TYPE_INVALID,
16880N/A+ G_TYPE_STRING, &server->priv->command,
16880N/A+ G_TYPE_INVALID);
16880N/A+ if (! res) {
16880N/A+ if (error != NULL) {
16880N/A+ g_warning ("Failed to get value: %s", error->message);
16880N/A+ g_error_free (error);
16880N/A+ } else {
16880N/A+ g_warning ("Failed to get value");
16880N/A+ }
16880N/A+
16880N/A+ exit (1);
16880N/A+ }
16880N/A+
16880N/A+ error = NULL;
16880N/A+ res = dbus_g_proxy_call (proxy,
16880N/A+ "GetX11AuthorityFile",
16880N/A+ &error,
16880N/A+ G_TYPE_INVALID,
16880N/A+ G_TYPE_STRING, &server->priv->auth_file,
16880N/A+ G_TYPE_INVALID);
16880N/A+ if (! res) {
16880N/A+ if (error != NULL) {
16880N/A+ g_warning ("Failed to get value: %s", error->message);
16880N/A+ g_error_free (error);
16880N/A+ } else {
16880N/A+ g_warning ("Failed to get value");
16880N/A+ }
16880N/A+
16880N/A+ exit (1);
16880N/A+ }
16880N/A+
16880N/A+ /* If auth_file is not set, set it NULL */
16880N/A+ if (server->priv->auth_file && (strlen (server->priv->auth_file) == 0)) {
16880N/A+ g_free (server->priv->auth_file);
16880N/A+ server->priv->auth_file = NULL;
16880N/A+ }
16880N/A+
16880N/A+ return server;
16880N/A }
16880N/Adiff --git a/daemon/gdm-server.h b/daemon/gdm-server.h
16880N/Aindex 535a69a..84feb1f 100644
16880N/A--- a/daemon/gdm-server.h
16880N/A+++ b/daemon/gdm-server.h
16880N/A@@ -53,8 +53,7 @@ typedef struct
16880N/A } GdmServerClass;
16880N/A
16880N/A GType gdm_server_get_type (void);
16880N/A-GdmServer * gdm_server_new (const char *display_id,
16880N/A- const char *auth_file);
16880N/A+GdmServer * gdm_server_new (const char *display_id);
16880N/A gboolean gdm_server_start (GdmServer *server);
16880N/A gboolean gdm_server_stop (GdmServer *server);
16880N/A char * gdm_server_get_display_device (GdmServer *server);
16983N/Adiff --git a/daemon/gdm-session-direct.c b/daemon/gdm-session-direct.c
18940N/Aindex d1fec90..20f8057 100644
16983N/A--- a/daemon/gdm-session-direct.c
16983N/A+++ b/daemon/gdm-session-direct.c
20788N/A@@ -59,6 +59,8 @@
17398N/A #include "gdm-session-worker-job.h"
20788N/A #include "gdm-common.h"
17398N/A
17398N/A+#define GDM_DBUS_NAME "org.gnome.DisplayManager"
17398N/A+#define GDM_DBUS_DISPLAY_INTERFACE "org.gnome.DisplayManager.Display"
17398N/A #define GDM_SESSION_DBUS_PATH "/org/gnome/DisplayManager/Session"
17398N/A #define GDM_SESSION_DBUS_INTERFACE "org.gnome.DisplayManager.Session"
17398N/A #define GDM_SESSION_DBUS_ERROR_CANCEL "org.gnome.DisplayManager.Session.Error.Cancel"
20788N/A@@ -101,6 +103,9 @@ struct _GdmSessionDirectPrivate
16983N/A char *display_hostname;
16983N/A char *display_device;
16983N/A char *display_x11_authority_file;
16983N/A+ char *display_console_session;
17398N/A+ char *display_type;
17398N/A+ char *display_seat_id;
16983N/A gboolean display_is_local;
16983N/A
18940N/A char *fallback_session_name;
20788N/A@@ -108,6 +113,7 @@ struct _GdmSessionDirectPrivate
16983N/A DBusServer *server;
17398N/A char *server_address;
17398N/A GHashTable *environment;
17398N/A+ DBusGProxy *display_proxy;
17398N/A DBusGConnection *connection;
17398N/A };
17398N/A
20788N/A@@ -119,7 +125,10 @@ enum {
16983N/A PROP_DISPLAY_IS_LOCAL,
16983N/A PROP_DISPLAY_DEVICE,
16983N/A PROP_DISPLAY_X11_AUTHORITY_FILE,
16983N/A+ PROP_DISPLAY_CONSOLE_SESSION,
16983N/A PROP_USER_X11_AUTHORITY_FILE,
17398N/A+ PROP_DISPLAY_TYPE,
17398N/A+ PROP_DISPLAY_SEAT_ID,
16983N/A };
16983N/A
17398N/A static void gdm_session_iface_init (GdmSessionIface *iface);
20788N/A@@ -826,6 +835,34 @@ gdm_session_direct_handle_username_chang
16983N/A return DBUS_HANDLER_RESULT_HANDLED;
16983N/A }
16983N/A
16983N/A+static DBusHandlerResult
16983N/A+gdm_session_direct_handle_display_console_session_updated (GdmSessionDirect *session,
20788N/A+ GdmSessionConversation *conversation,
16983N/A+ DBusMessage *message)
16983N/A+{
16983N/A+ DBusMessage *reply;
16983N/A+ DBusError error;
16983N/A+ const char *text;
16983N/A+
16983N/A+ dbus_error_init (&error);
16983N/A+ if (! dbus_message_get_args (message, &error,
16983N/A+ DBUS_TYPE_STRING, &text,
16983N/A+ DBUS_TYPE_INVALID)) {
16983N/A+ g_warning ("ERROR: %s", error.message);
16983N/A+ }
16983N/A+
16983N/A+ reply = dbus_message_new_method_return (message);
20788N/A+ dbus_connection_send (conversation->worker_connection, reply, NULL);
16983N/A+ dbus_message_unref (reply);
16983N/A+
16983N/A+ g_debug ("GdmSessionDirect: changing ck session id to '%s'",
16983N/A+ text);
16983N/A+
16983N/A+
16983N/A+
16983N/A+ return DBUS_HANDLER_RESULT_HANDLED;
16983N/A+}
16983N/A+
16983N/A static void
20788N/A cancel_pending_query (GdmSessionConversation *conversation)
16983N/A {
20788N/A@@ -1279,6 +1316,8 @@ session_worker_message (DBusConnection *
20788N/A return gdm_session_direct_handle_accreditation_failed (session, conversation, message);
16983N/A } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "UsernameChanged")) {
20788N/A return gdm_session_direct_handle_username_changed (session, conversation, message);
16983N/A+ } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "DisplayConsoleSessionUpdated")) {
20788N/A+ return gdm_session_direct_handle_display_console_session_updated (session, conversation, message);
18400N/A } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "SessionOpened")) {
20788N/A return gdm_session_direct_handle_session_opened (session, conversation, message);
18400N/A } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "OpenFailed")) {
20788N/A@@ -1385,6 +1424,8 @@ do_introspect (DBusConnection *connectio
17291N/A " <signal name=\"Setup\">\n"
17291N/A " <arg name=\"service_name\" type=\"s\"/>\n"
17291N/A " <arg name=\"x11_display_name\" type=\"s\"/>\n"
17291N/A+ " <arg name=\"x11_display_type\" type=\"s\"/>\n"
17398N/A+ " <arg name=\"x11_display_seat_id\" type=\"s\"/>\n"
17291N/A " <arg name=\"display_device\" type=\"s\"/>\n"
17291N/A " <arg name=\"hostname\" type=\"s\"/>\n"
17291N/A " <arg name=\"x11_authority_file\" type=\"s\"/>\n"
20788N/A@@ -1392,6 +1433,8 @@ do_introspect (DBusConnection *connectio
17291N/A " <signal name=\"SetupForUser\">\n"
17291N/A " <arg name=\"service_name\" type=\"s\"/>\n"
17291N/A " <arg name=\"x11_display_name\" type=\"s\"/>\n"
17291N/A+ " <arg name=\"x11_display_type\" type=\"s\"/>\n"
17398N/A+ " <arg name=\"x11_seat_id\" type=\"s\"/>\n"
17291N/A " <arg name=\"display_device\" type=\"s\"/>\n"
17291N/A " <arg name=\"hostname\" type=\"s\"/>\n"
17291N/A " <arg name=\"x11_authority_file\" type=\"s\"/>\n"
20788N/A@@ -1922,6 +1965,8 @@ send_setup (GdmSessionDirect *session,
17291N/A DBusMessage *message;
17291N/A DBusMessageIter iter;
17291N/A const char *display_name;
17291N/A+ const char *display_type;
17398N/A+ const char *display_seat_id;
17291N/A const char *display_device;
17291N/A const char *display_hostname;
17291N/A const char *display_x11_authority_file;
20788N/A@@ -1934,6 +1979,16 @@ send_setup (GdmSessionDirect *session,
17291N/A } else {
17291N/A display_name = "";
17291N/A }
17291N/A+ if (session->priv->display_type != NULL) {
17291N/A+ display_type = session->priv->display_type;
17291N/A+ } else {
17291N/A+ display_type = "";
17291N/A+ }
17398N/A+ if (session->priv->display_seat_id!= NULL) {
17398N/A+ display_seat_id = session->priv->display_seat_id;
17398N/A+ } else {
17398N/A+ display_seat_id = "";
17398N/A+ }
17291N/A if (session->priv->display_hostname != NULL) {
17291N/A display_hostname = session->priv->display_hostname;
17291N/A } else {
20788N/A@@ -1959,6 +2014,8 @@ send_setup (GdmSessionDirect *session,
17291N/A dbus_message_iter_init_append (message, &iter);
17291N/A dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &service_name);
17291N/A dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_name);
17291N/A+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_type);
17398N/A+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_seat_id);
17291N/A dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_device);
17291N/A dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_hostname);
17291N/A dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_x11_authority_file);
20788N/A@@ -1978,6 +2035,8 @@ send_setup_for_user (GdmSessionDirect *s
17291N/A DBusMessage *message;
17291N/A DBusMessageIter iter;
17291N/A const char *display_name;
17291N/A+ const char *display_type;
17398N/A+ const char *display_seat_id;
17291N/A const char *display_device;
17291N/A const char *display_hostname;
17291N/A const char *display_x11_authority_file;
20788N/A@@ -1991,6 +2050,16 @@ send_setup_for_user (GdmSessionDirect *s
17291N/A } else {
17291N/A display_name = "";
17291N/A }
17291N/A+ if (session->priv->display_type != NULL) {
17291N/A+ display_type = session->priv->display_type;
17291N/A+ } else {
17291N/A+ display_type = "";
17291N/A+ }
17398N/A+ if (session->priv->display_seat_id != NULL) {
17398N/A+ display_seat_id = session->priv->display_seat_id;
17398N/A+ } else {
17398N/A+ display_seat_id = "";
17398N/A+ }
17291N/A if (session->priv->display_hostname != NULL) {
17291N/A display_hostname = session->priv->display_hostname;
17291N/A } else {
20788N/A@@ -2021,6 +2090,8 @@ send_setup_for_user (GdmSessionDirect *s
17291N/A dbus_message_iter_init_append (message, &iter);
17291N/A dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &service_name);
17291N/A dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_name);
17291N/A+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_type);
17398N/A+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_seat_id);
17291N/A dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_device);
17291N/A dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_hostname);
17291N/A dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_x11_authority_file);
20788N/A@@ -2600,6 +2671,30 @@ _gdm_session_direct_set_display_x11_auth
17291N/A }
17291N/A
17291N/A static void
17291N/A+_gdm_session_direct_set_display_type (GdmSessionDirect *session,
17291N/A+ const char *type)
17291N/A+{
17291N/A+ g_free (session->priv->display_type);
17291N/A+ session->priv->display_type = g_strdup (type);
17291N/A+}
17291N/A+
17291N/A+static void
17398N/A+_gdm_session_direct_set_display_seat_id (GdmSessionDirect *session,
17398N/A+ const char *sid)
17398N/A+{
17398N/A+ g_free (session->priv->display_seat_id);
17398N/A+ session->priv->display_seat_id = g_strdup (sid);
17398N/A+}
17398N/A+
17398N/A+static void
16983N/A+_gdm_session_direct_set_display_console_session (GdmSessionDirect *session,
16983N/A+ const char *console_session)
16983N/A+{
16983N/A+ g_free (session->priv->display_console_session);
16983N/A+ session->priv->display_console_session = g_strdup (console_session);
16983N/A+}
16983N/A+
16983N/A+static void
16983N/A _gdm_session_direct_set_display_is_local (GdmSessionDirect *session,
16983N/A gboolean is)
16983N/A {
20788N/A@@ -2635,9 +2730,18 @@ gdm_session_direct_set_property (GObject
16983N/A case PROP_DISPLAY_X11_AUTHORITY_FILE:
16983N/A _gdm_session_direct_set_display_x11_authority_file (self, g_value_get_string (value));
16983N/A break;
16983N/A+ case PROP_DISPLAY_CONSOLE_SESSION:
16983N/A+ _gdm_session_direct_set_display_console_session (self, g_value_get_string (value));
16983N/A+ break;
16983N/A case PROP_DISPLAY_IS_LOCAL:
16983N/A _gdm_session_direct_set_display_is_local (self, g_value_get_boolean (value));
16983N/A break;
17398N/A+ case PROP_DISPLAY_TYPE:
17398N/A+ _gdm_session_direct_set_display_type (self, g_value_get_string (value));
17398N/A+ break;
17398N/A+ case PROP_DISPLAY_SEAT_ID:
17398N/A+ _gdm_session_direct_set_display_seat_id (self, g_value_get_string (value));
17398N/A+ break;
17398N/A default:
17398N/A G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
17291N/A break;
20788N/A@@ -2673,9 +2777,18 @@ gdm_session_direct_get_property (GObject
16983N/A case PROP_DISPLAY_X11_AUTHORITY_FILE:
16983N/A g_value_set_string (value, self->priv->display_x11_authority_file);
16983N/A break;
16983N/A+ case PROP_DISPLAY_CONSOLE_SESSION:
16983N/A+ g_value_set_string (value, self->priv->display_console_session);
16983N/A+ break;
16983N/A case PROP_DISPLAY_IS_LOCAL:
16983N/A g_value_set_boolean (value, self->priv->display_is_local);
16983N/A break;
17398N/A+ case PROP_DISPLAY_TYPE:
17398N/A+ g_value_set_string (value, self->priv->display_type);
17398N/A+ break;
17398N/A+ case PROP_DISPLAY_SEAT_ID:
17398N/A+ g_value_set_string (value, self->priv->display_seat_id);
17398N/A+ break;
17398N/A default:
17398N/A G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
17398N/A break;
20788N/A@@ -2711,6 +2824,12 @@ gdm_session_direct_dispose (GObject *obj
17398N/A g_free (session->priv->server_address);
17398N/A session->priv->server_address = NULL;
17291N/A
17291N/A+ g_free (session->priv->display_type);
17291N/A+ session->priv->display_type = NULL;
17291N/A+
17398N/A+ g_free (session->priv->display_seat_id);
17398N/A+ session->priv->display_seat_id = NULL;
17398N/A+
17398N/A if (session->priv->server != NULL) {
17398N/A dbus_server_disconnect (session->priv->server);
17398N/A dbus_server_unref (session->priv->server);
20788N/A@@ -2722,6 +2841,11 @@ gdm_session_direct_dispose (GObject *obj
17398N/A session->priv->environment = NULL;
17398N/A }
17291N/A
17398N/A+ if (session->priv->display_proxy != NULL) {
17398N/A+ g_object_unref (session->priv->display_proxy);
17398N/A+ }
17398N/A+
17398N/A+
17398N/A G_OBJECT_CLASS (gdm_session_direct_parent_class)->dispose (object);
17398N/A }
17398N/A
20788N/A@@ -2872,6 +2996,14 @@ gdm_session_direct_class_init (GdmSessio
16983N/A "display x11 authority file",
16983N/A NULL,
16983N/A G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
16983N/A+
16983N/A+ g_object_class_install_property (object_class,
16983N/A+ PROP_DISPLAY_CONSOLE_SESSION,
16983N/A+ g_param_spec_string ("display-console-session",
16983N/A+ "Display ConsoleKit session",
16983N/A+ "The ConsoleKit Session Id for the display",
16983N/A+ NULL,
16983N/A+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
16983N/A /* not construct only */
16983N/A g_object_class_install_property (object_class,
16983N/A PROP_USER_X11_AUTHORITY_FILE,
20788N/A@@ -2887,11 +3019,140 @@ gdm_session_direct_class_init (GdmSessio
17398N/A "display device",
17398N/A NULL,
17398N/A G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
17398N/A+ g_object_class_install_property (object_class,
17398N/A+ PROP_DISPLAY_TYPE,
17398N/A+ g_param_spec_string ("display-type",
17398N/A+ "display type",
17398N/A+ "display type",
17398N/A+ NULL,
17398N/A+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
17398N/A+ g_object_class_install_property (object_class,
17398N/A+ PROP_DISPLAY_SEAT_ID,
17398N/A+ g_param_spec_string ("seat-id",
17398N/A+ "seat id",
17398N/A+ "seat id",
17398N/A+ NULL,
17398N/A+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
17398N/A
17398N/A
17398N/A dbus_g_object_type_install_info (GDM_TYPE_SESSION_DIRECT, &dbus_glib_gdm_session_direct_object_info);
17398N/A }
17398N/A
17398N/A+static void
17398N/A+display_proxy_destroyed_cb (DBusGProxy *display_proxy,
17398N/A+ GdmSessionDirect *session)
17398N/A+{
17398N/A+ g_debug ("GdmSessionDirect: Disconnected from display");
17398N/A+
17398N/A+ session->priv->display_proxy = NULL;
17398N/A+}
17398N/A+
17398N/A+static gboolean
17398N/A+init_display_data (GdmSessionDirect *session)
17398N/A+{
17398N/A+ gboolean res;
17398N/A+ char *id;
17398N/A+ GError *error;
17398N/A+
17398N/A+ g_assert (session->priv->display_proxy == NULL);
17398N/A+
17398N/A+ error = NULL;
17398N/A+ session->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
17398N/A+ if (session->priv->connection == NULL) {
17398N/A+ if (error != NULL) {
17398N/A+ g_critical ("error getting system bus: %s", error->message);
17398N/A+ g_error_free (error);
17398N/A+ }
17398N/A+ exit (1);
17398N/A+ }
17398N/A+
17398N/A+ error = NULL;
17398N/A+ session->priv->display_proxy = dbus_g_proxy_new_for_name_owner (
17398N/A+ session->priv->connection,
17398N/A+ GDM_DBUS_NAME,
17398N/A+ session->priv->display_id,
17398N/A+ GDM_DBUS_DISPLAY_INTERFACE,
17398N/A+ &error);
17398N/A+
17398N/A+ g_signal_connect (session->priv->display_proxy,
17398N/A+ "destroy",
17398N/A+ G_CALLBACK (display_proxy_destroyed_cb),
17398N/A+ session);
17398N/A+
17398N/A+ if (session->priv->display_proxy == NULL) {
17398N/A+ if (error != NULL) {
17398N/A+ g_warning ("Failed to create display proxy %s: %s", session->priv->display_id, error->message);
17398N/A+ g_error_free (error);
17398N/A+ } else {
17398N/A+ g_warning ("Unable to create display proxy");
17398N/A+ }
17398N/A+ return FALSE;
17398N/A+ }
17398N/A+
17398N/A+ /* Make sure display ID works */
17398N/A+ error = NULL;
17398N/A+ res = dbus_g_proxy_call (session->priv->display_proxy,
17398N/A+ "GetId",
17398N/A+ &error,
17398N/A+ G_TYPE_INVALID,
17398N/A+ DBUS_TYPE_G_OBJECT_PATH, &id,
17398N/A+ G_TYPE_INVALID);
17398N/A+ if (! res) {
17398N/A+ if (error != NULL) {
17398N/A+ g_warning ("Failed to get display id %s: %s", session->priv->display_id, error->message);
17398N/A+ g_error_free (error);
17398N/A+ } else {
17398N/A+ g_warning ("Failed to get display id %s", session->priv->display_id);
17398N/A+ }
17398N/A+
17398N/A+ return FALSE;
17398N/A+ }
17398N/A+
17398N/A+ if (strcmp (id, session->priv->display_id) != 0) {
17398N/A+ g_critical ("Display ID doesn't match");
17398N/A+ exit (1);
17398N/A+ }
17398N/A+
17398N/A+ error = NULL;
17398N/A+ res = dbus_g_proxy_call (session->priv->display_proxy,
17398N/A+ "GetX11DisplayType",
17398N/A+ &error,
17398N/A+ G_TYPE_INVALID,
17398N/A+ G_TYPE_STRING, &session->priv->display_type,
17398N/A+ G_TYPE_INVALID);
17398N/A+ if (! res) {
17398N/A+ if (error != NULL) {
17398N/A+ g_warning ("Failed to get value: %s", error->message);
17398N/A+ g_error_free (error);
17398N/A+ } else {
17398N/A+ g_warning ("Failed to get value");
17398N/A+ }
17398N/A+
17398N/A+ return FALSE;
17398N/A+ }
17398N/A+
17398N/A+ error = NULL;
17398N/A+ res = dbus_g_proxy_call (session->priv->display_proxy,
17398N/A+ "GetSeatId",
17398N/A+ &error,
17398N/A+ G_TYPE_INVALID,
17398N/A+ G_TYPE_STRING, &session->priv->display_seat_id,
17398N/A+ G_TYPE_INVALID);
17398N/A+ if (! res) {
17398N/A+ if (error != NULL) {
17398N/A+ g_warning ("Failed to get value: %s", error->message);
17398N/A+ g_error_free (error);
17398N/A+ } else {
17398N/A+ g_warning ("Failed to get value");
17398N/A+ }
17398N/A+
17398N/A+ return FALSE;
17398N/A+ }
17398N/A+
17398N/A+ return TRUE;
17398N/A+}
17398N/A+
17398N/A+
17291N/A GdmSessionDirect *
17291N/A gdm_session_direct_new (const char *display_id,
17291N/A const char *display_name,
20788N/A@@ -2911,6 +3172,8 @@ gdm_session_direct_new (const char *disp
17398N/A "display-is-local", display_is_local,
17398N/A NULL);
17291N/A
17398N/A+ init_display_data (session);
17398N/A+
17398N/A return session;
17398N/A }
17398N/A
16983N/Adiff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
18940N/Aindex 35a6bfe..7d72a9e 100644
16983N/A--- a/daemon/gdm-session-worker.c
16983N/A+++ b/daemon/gdm-session-worker.c
20839N/A@@ -115,6 +115,8 @@ struct GdmSessionWorkerPrivate
17291N/A /* from Setup */
17291N/A char *service;
17291N/A char *x11_display_name;
17291N/A+ char *x11_display_type;
17398N/A+ char *seat_id;
17291N/A char *x11_authority_file;
17291N/A char *display_device;
17291N/A char *hostname;
20839N/A@@ -174,6 +176,8 @@ open_ck_session (GdmSessionWorker *work
17291N/A int res;
17291N/A DBusError error;
17291N/A const char *display_name;
17291N/A+ const char *display_type;
17398N/A+ const char *seat_id;
17291N/A const char *display_device;
17291N/A const char *display_hostname;
17291N/A gboolean is_local;
20839N/A@@ -185,6 +189,16 @@ open_ck_session (GdmSessionWorker *work
17291N/A } else {
17291N/A display_name = "";
17291N/A }
17291N/A+ if (worker->priv->x11_display_type != NULL) {
17291N/A+ display_type = worker->priv->x11_display_type;
17291N/A+ } else {
17291N/A+ display_type = "";
17291N/A+ }
17398N/A+ if (worker->priv->seat_id != NULL) {
17398N/A+ seat_id = worker->priv->seat_id;
17398N/A+ } else {
17398N/A+ seat_id = "";
17398N/A+ }
17291N/A if (worker->priv->hostname != NULL) {
17291N/A display_hostname = worker->priv->hostname;
17291N/A } else {
20839N/A@@ -221,6 +235,8 @@ open_ck_session (GdmSessionWorker *work
17291N/A dbus_error_init (&error);
17291N/A res = ck_connector_open_session_with_parameters (worker->priv->ckc,
17291N/A &error,
17291N/A+ "display-type", &display_type,
17398N/A+ "seat-id", &seat_id,
17291N/A "unix-user", &pwent->pw_uid,
17291N/A "x11-display", &display_name,
17291N/A "x11-display-device", &display_device,
20839N/A@@ -1553,6 +1569,7 @@ static void
16983N/A register_ck_session (GdmSessionWorker *worker)
16983N/A {
16983N/A const char *session_cookie;
16983N/A+ const char *session_id;
16983N/A gboolean res;
16983N/A
16983N/A session_cookie = NULL;
20839N/A@@ -1565,6 +1582,11 @@ register_ck_session (GdmSessionWorker *w
16983N/A "XDG_SESSION_COOKIE",
16983N/A session_cookie);
16983N/A }
16983N/A+ session_id = ck_connector_get_session_id (worker->priv->ckc);
16983N/A+
16983N/A+ send_dbus_string_method (worker->priv->connection,
16983N/A+ "DisplayConsoleSessionUpdated",
16983N/A+ session_id);
16983N/A }
16983N/A
16983N/A static void
20839N/A@@ -1584,19 +1606,26 @@ session_worker_child_watch (GPid
17226N/A if (WIFEXITED (status)) {
17226N/A int code = WEXITSTATUS (status);
17226N/A
17226N/A+ ck_connector_set_remove_on_close (worker->priv->ckc,
17226N/A+ TRUE,
17226N/A+ NULL);
20788N/A+
17226N/A send_dbus_int_method (worker->priv->connection,
17226N/A "SessionExited",
17226N/A code);
17226N/A } else if (WIFSIGNALED (status)) {
17226N/A int num = WTERMSIG (status);
17226N/A
17226N/A+ ck_connector_set_remove_on_close (worker->priv->ckc,
17226N/A+ TRUE,
17226N/A+ NULL);
20788N/A+
17226N/A send_dbus_int_method (worker->priv->connection,
17226N/A "SessionDied",
17226N/A num);
17226N/A }
17226N/A
17226N/A if (worker->priv->ckc != NULL) {
17226N/A- ck_connector_close_session (worker->priv->ckc, NULL);
17226N/A ck_connector_unref (worker->priv->ckc);
17226N/A worker->priv->ckc = NULL;
17226N/A }
20839N/A@@ -2352,6 +2381,8 @@ on_setup (GdmSessionWorker *worker,
17291N/A DBusError error;
17291N/A const char *service;
17291N/A const char *x11_display_name;
17291N/A+ const char *x11_display_type;
17398N/A+ const char *seat_id;
17291N/A const char *x11_authority_file;
17291N/A const char *console;
17291N/A const char *hostname;
20839N/A@@ -2367,6 +2398,8 @@ on_setup (GdmSessionWorker *worker,
17291N/A &error,
17291N/A DBUS_TYPE_STRING, &service,
17291N/A DBUS_TYPE_STRING, &x11_display_name,
17291N/A+ DBUS_TYPE_STRING, &x11_display_type,
17398N/A+ DBUS_TYPE_STRING, &seat_id,
17291N/A DBUS_TYPE_STRING, &console,
17291N/A DBUS_TYPE_STRING, &hostname,
17291N/A DBUS_TYPE_STRING, &x11_authority_file,
20839N/A@@ -2374,6 +2407,8 @@ on_setup (GdmSessionWorker *worker,
17291N/A if (res) {
17291N/A worker->priv->service = g_strdup (service);
17291N/A worker->priv->x11_display_name = g_strdup (x11_display_name);
17291N/A+ worker->priv->x11_display_type = g_strdup (x11_display_type);
17398N/A+ worker->priv->seat_id = g_strdup (seat_id);
17291N/A worker->priv->x11_authority_file = g_strdup (x11_authority_file);
17291N/A worker->priv->display_device = g_strdup (console);
17291N/A worker->priv->hostname = g_strdup (hostname);
20839N/A@@ -2394,6 +2429,8 @@ on_setup_for_user (GdmSessionWorker *wor
18940N/A DBusError error;
18940N/A const char *service;
18940N/A const char *x11_display_name;
18940N/A+ const char *x11_display_type;
18940N/A+ const char *seat_id;
18940N/A const char *x11_authority_file;
18940N/A const char *console;
18940N/A const char *hostname;
20839N/A@@ -2410,6 +2447,8 @@ on_setup_for_user (GdmSessionWorker *wor
18940N/A &error,
18940N/A DBUS_TYPE_STRING, &service,
18940N/A DBUS_TYPE_STRING, &x11_display_name,
18940N/A+ DBUS_TYPE_STRING, &x11_display_type,
18940N/A+ DBUS_TYPE_STRING, &seat_id,
18940N/A DBUS_TYPE_STRING, &console,
18940N/A DBUS_TYPE_STRING, &hostname,
18940N/A DBUS_TYPE_STRING, &x11_authority_file,
20839N/A@@ -2418,6 +2457,8 @@ on_setup_for_user (GdmSessionWorker *wor
18940N/A if (res) {
18940N/A worker->priv->service = g_strdup (service);
18940N/A worker->priv->x11_display_name = g_strdup (x11_display_name);
18940N/A+ worker->priv->x11_display_type = g_strdup (x11_display_type);
18940N/A+ worker->priv->seat_id = g_strdup (seat_id);
18940N/A worker->priv->x11_authority_file = g_strdup (x11_authority_file);
18940N/A worker->priv->display_device = g_strdup (console);
18940N/A worker->priv->hostname = g_strdup (hostname);
20839N/A@@ -2615,6 +2656,10 @@ worker_dbus_filter_function (DBusConnect
20809N/A
20809N/A g_debug ("GdmSessionWorker: Got disconnected from the server");
20809N/A
20809N/A+ ck_connector_set_remove_on_close (worker->priv->ckc,
20809N/A+ TRUE,
20809N/A+ NULL);
20809N/A+
20809N/A dbus_connection_unref (connection);
20809N/A worker->priv->connection = NULL;
20809N/A
16880N/Adiff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
18940N/Aindex fb14223..682982a 100644
16880N/A--- a/daemon/gdm-simple-slave.c
16880N/A+++ b/daemon/gdm-simple-slave.c
20788N/A@@ -472,6 +472,10 @@ start_session_timeout (GdmSimpleSlave *s
16983N/A goto out;
16983N/A }
16983N/A
16983N/A+ /* Defer requests to use this display from ConsoleKit
16983N/A+ * for the time being
16983N/A+ */
16983N/A+ gdm_slave_block_console_session_requests_on_display (GDM_SLAVE (slave));
16983N/A stop_greeter (slave);
16983N/A
16983N/A auth_file = NULL;
20788N/A@@ -487,6 +491,7 @@ start_session_timeout (GdmSimpleSlave *s
16983N/A
20788N/A gdm_session_start_session (GDM_SESSION (slave->priv->session),
20788N/A slave->priv->start_session_service_name);
16983N/A+ gdm_slave_unblock_console_session_requests_on_display (GDM_SLAVE (slave));
16983N/A out:
16983N/A slave->priv->start_session_id = 0;
20788N/A g_free (slave->priv->start_session_service_name);
20788N/A@@ -729,6 +734,16 @@ start_autologin_conversation_if_necessar
16983N/A }
16983N/A
16983N/A static void
16983N/A+on_console_session_changed (GdmSession *session,
16983N/A+ const char *text,
16983N/A+ GdmSimpleSlave *slave)
16983N/A+{
16983N/A+ g_debug ("GdmSimpleSlave: Default session name changed: %s", text);
16983N/A+
16983N/A+ gdm_slave_set_console_session_id (GDM_SLAVE (slave), text);
16983N/A+}
16983N/A+
16983N/A+static void
16983N/A create_new_session (GdmSimpleSlave *slave)
16983N/A {
16983N/A gboolean display_is_local;
20788N/A@@ -763,6 +778,7 @@ create_new_session (GdmSimpleSlave *slav
17398N/A g_free (display_name);
17398N/A g_free (display_device);
17398N/A g_free (display_hostname);
17398N/A+ g_free (display_x11_authority_file);
17291N/A
17398N/A g_signal_connect (slave->priv->session,
18400N/A "conversation-started",
20788N/A@@ -873,6 +889,11 @@ create_new_session (GdmSimpleSlave *slav
16983N/A G_CALLBACK (on_default_session_name_changed),
16983N/A slave);
20788N/A
16983N/A+ g_signal_connect (slave->priv->session,
16983N/A+ "notify::display-console-session",
16983N/A+ G_CALLBACK (on_console_session_changed),
16983N/A+ slave);
20788N/A+
20788N/A start_autologin_conversation_if_necessary (slave);
16983N/A }
16983N/A
20816N/A@@ -992,7 +1013,7 @@ on_greeter_session_exited (GdmGreeterSes
20816N/A GdmSimpleSlave *slave)
20816N/A {
20816N/A g_debug ("GdmSimpleSlave: Greeter exited: %d", code);
20816N/A- gdm_slave_stopped (GDM_SLAVE (slave));
20816N/A+ gdm_slave_failed (GDM_SLAVE (slave));
20816N/A }
20816N/A
20816N/A static void
20788N/A@@ -1192,6 +1213,7 @@ start_greeter (GdmSimpleSlave *slave)
16880N/A char *display_id;
16880N/A char *display_name;
20788N/A char *seat_id;
16983N/A+ char *session_id;
16880N/A char *display_device;
16880N/A char *display_hostname;
16880N/A char *auth_file;
20788N/A@@ -1204,6 +1226,7 @@ start_greeter (GdmSimpleSlave *slave)
16880N/A display_id = NULL;
16880N/A display_name = NULL;
20788N/A seat_id = NULL;
16983N/A+ session_id = NULL;
16880N/A auth_file = NULL;
16880N/A display_device = NULL;
16880N/A display_hostname = NULL;
20788N/A@@ -1213,6 +1236,7 @@ start_greeter (GdmSimpleSlave *slave)
16880N/A "display-is-local", &display_is_local,
16880N/A "display-name", &display_name,
20788N/A "display-seat-id", &seat_id,
16983N/A+ "display-session-id", &session_id,
16880N/A "display-hostname", &display_hostname,
16880N/A "display-x11-authority-file", &auth_file,
16880N/A NULL);
20788N/A@@ -1297,6 +1321,7 @@ start_greeter (GdmSimpleSlave *slave)
16880N/A g_debug ("GdmSimpleSlave: Creating greeter on %s %s %s", display_name, display_device, display_hostname);
16880N/A slave->priv->greeter = gdm_greeter_session_new (display_name,
20788N/A seat_id,
16983N/A+ session_id,
16880N/A display_device,
16880N/A display_hostname,
17662N/A display_is_local);
20816N/A@@ -1385,7 +1410,11 @@ on_server_exited (GdmServer *server
20816N/A {
20816N/A g_debug ("GdmSimpleSlave: server exited with code %d\n", exit_code);
20816N/A
20816N/A- gdm_slave_stopped (GDM_SLAVE (slave));
20816N/A+ if (exit_code != 0) {
20816N/A+ gdm_slave_failed (GDM_SLAVE (slave));
20816N/A+ } else {
20816N/A+ gdm_slave_stopped (GDM_SLAVE (slave));
20816N/A+ }
20816N/A }
20816N/A
20816N/A static void
20816N/A@@ -1403,31 +1432,20 @@ on_server_died (GdmServer *server,
16880N/A static gboolean
16880N/A gdm_simple_slave_run (GdmSimpleSlave *slave)
16880N/A {
16880N/A- char *display_name;
16880N/A- char *auth_file;
16880N/A+ char *display_id;
16880N/A gboolean display_is_local;
16880N/A
16880N/A g_object_get (slave,
16880N/A+ "display-id", &display_id,
16880N/A "display-is-local", &display_is_local,
16880N/A- "display-name", &display_name,
16880N/A- "display-x11-authority-file", &auth_file,
16880N/A NULL);
16880N/A
16880N/A /* if this is local display start a server if one doesn't
17753N/A * exist */
17753N/A if (display_is_local) {
16880N/A gboolean res;
17753N/A- gboolean disable_tcp;
20816N/A
16880N/A- slave->priv->server = gdm_server_new (display_name, auth_file);
20816N/A-
17753N/A- disable_tcp = TRUE;
17753N/A- if (gdm_settings_client_get_boolean (GDM_KEY_DISALLOW_TCP,
17753N/A- &disable_tcp)) {
17753N/A- g_object_set (slave->priv->server,
17753N/A- "disable-tcp", disable_tcp,
17753N/A- NULL);
17753N/A- }
16880N/A+ slave->priv->server = gdm_server_new (display_id);
16880N/A
17753N/A g_signal_connect (slave->priv->server,
17753N/A "exited",
20816N/A@@ -1460,8 +1478,7 @@ gdm_simple_slave_run (GdmSimpleSlave *sl
16880N/A g_timeout_add (500, (GSourceFunc)idle_connect_to_display, slave);
16880N/A }
16880N/A
16880N/A- g_free (display_name);
16880N/A- g_free (auth_file);
16880N/A+ g_free (display_id);
16880N/A
16880N/A return TRUE;
16880N/A }
16880N/Adiff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
18940N/Aindex 2915da0..08cc1ec 100644
16880N/A--- a/daemon/gdm-slave.c
16880N/A+++ b/daemon/gdm-slave.c
20816N/A@@ -83,11 +83,13 @@ struct GdmSlavePrivate
17291N/A /* cached display values */
17291N/A char *display_id;
17291N/A char *display_name;
17291N/A+ char *display_type;
16880N/A int display_number;
16880N/A char *display_hostname;
16880N/A gboolean display_is_local;
16880N/A gboolean display_is_parented;
16880N/A char *display_seat_id;
16983N/A+ char *display_session_id;
16880N/A char *display_x11_authority_file;
16983N/A char *parent_display_name;
16983N/A char *parent_display_x11_authority_file;
20816N/A@@ -103,15 +105,18 @@ enum {
17291N/A PROP_0,
17291N/A PROP_DISPLAY_ID,
17291N/A PROP_DISPLAY_NAME,
17291N/A+ PROP_DISPLAY_TYPE,
16880N/A PROP_DISPLAY_NUMBER,
16880N/A PROP_DISPLAY_HOSTNAME,
16880N/A PROP_DISPLAY_IS_LOCAL,
16880N/A PROP_DISPLAY_SEAT_ID,
16983N/A+ PROP_DISPLAY_SESSION_ID,
16880N/A PROP_DISPLAY_X11_AUTHORITY_FILE
16880N/A };
16983N/A
20816N/A enum {
20816N/A STOPPED,
20816N/A+ FAILED,
20816N/A LAST_SIGNAL
20816N/A };
20816N/A
20816N/A@@ -749,6 +754,24 @@ gdm_slave_real_start (GdmSlave *slave)
17291N/A
17291N/A error = NULL;
17291N/A res = dbus_g_proxy_call (slave->priv->display_proxy,
17291N/A+ "GetX11DisplayType",
17291N/A+ &error,
17291N/A+ G_TYPE_INVALID,
17291N/A+ G_TYPE_STRING, &slave->priv->display_type,
17291N/A+ G_TYPE_INVALID);
17291N/A+ if (! res) {
17291N/A+ if (error != NULL) {
17291N/A+ g_warning ("Failed to get value: %s", error->message);
17291N/A+ g_error_free (error);
17291N/A+ } else {
17291N/A+ g_warning ("Failed to get value");
17291N/A+ }
17291N/A+
17291N/A+ return FALSE;
17291N/A+ }
17291N/A+
17291N/A+ error = NULL;
17291N/A+ res = dbus_g_proxy_call (slave->priv->display_proxy,
17291N/A "GetX11DisplayNumber",
17291N/A &error,
17291N/A G_TYPE_INVALID,
20816N/A@@ -838,6 +861,24 @@ gdm_slave_real_start (GdmSlave *slave)
16983N/A return FALSE;
16983N/A }
16983N/A
16983N/A+ error = NULL;
16983N/A+ res = dbus_g_proxy_call (slave->priv->display_proxy,
16983N/A+ "GetSessionId",
16983N/A+ &error,
16983N/A+ G_TYPE_INVALID,
16983N/A+ G_TYPE_STRING, &slave->priv->display_session_id,
16983N/A+ G_TYPE_INVALID);
16983N/A+ if (! res) {
16983N/A+ if (error != NULL) {
16983N/A+ g_warning ("Failed to get value: %s", error->message);
16983N/A+ g_error_free (error);
16983N/A+ } else {
16983N/A+ g_warning ("Failed to get value");
16983N/A+ }
16983N/A+
16983N/A+ return FALSE;
16983N/A+ }
16983N/A+
16983N/A return TRUE;
16983N/A }
16983N/A
20816N/A@@ -893,6 +934,42 @@ gdm_slave_stopped (GdmSlave *slave)
16983N/A g_signal_emit (slave, signals [STOPPED], 0);
16983N/A }
16983N/A
16983N/A+void
20816N/A+gdm_slave_failed (GdmSlave *slave)
20816N/A+{
20816N/A+ g_return_if_fail (GDM_IS_SLAVE (slave));
20816N/A+
20816N/A+ g_signal_emit (slave, signals [FAILED], 0);
20816N/A+}
20816N/A+
20816N/A+void
16983N/A+gdm_slave_set_console_session_id (GdmSlave *slave,
16983N/A+ const char *session_id)
16983N/A+{
16983N/A+ gboolean res;
16983N/A+ GError *error;
16983N/A+
16983N/A+ g_debug ("GdmSlave: Informing display of new session id");
16983N/A+
16983N/A+ error = NULL;
16983N/A+ res = dbus_g_proxy_call (slave->priv->display_proxy,
16983N/A+ "SetConsoleSessionId",
16983N/A+ &error,
16983N/A+ G_TYPE_STRING, session_id,
16983N/A+ G_TYPE_INVALID, G_TYPE_INVALID);
16983N/A+
16983N/A+ if (! res) {
16983N/A+ if (error != NULL) {
16983N/A+ g_warning ("Failed to set console session id: %s", error->message);
16983N/A+ g_error_free (error);
16983N/A+ } else {
16983N/A+ g_warning ("Failed to set console session id");
16983N/A+ }
16983N/A+ } else {
16983N/A+ g_debug ("GdmSlave: Set console session id");
16983N/A+ }
16983N/A+}
16983N/A+
16983N/A gboolean
16983N/A gdm_slave_add_user_authorization (GdmSlave *slave,
16983N/A const char *username,
20816N/A@@ -1476,6 +1553,59 @@ gdm_slave_switch_to_user_session (GdmSla
16983N/A return ret;
16983N/A }
16983N/A
16983N/A+void
16983N/A+gdm_slave_block_console_session_requests_on_display (GdmSlave *slave)
16983N/A+{
16983N/A+ gboolean res;
16983N/A+ GError *error;
16983N/A+
16983N/A+ g_debug ("GdmSlave: Asking display to ignore ConsoleKit");
16983N/A+
16983N/A+ error = NULL;
16983N/A+ res = dbus_g_proxy_call (slave->priv->display_proxy,
16983N/A+ "BlockConsoleSessionRequests",
16983N/A+ &error,
16983N/A+ G_TYPE_INVALID, G_TYPE_INVALID);
16983N/A+
16983N/A+ if (! res) {
16983N/A+ if (error != NULL) {
16983N/A+ g_warning ("Failed to get display to ignore ConsoleKit: %s", error->message);
16983N/A+ g_error_free (error);
16983N/A+ } else {
16983N/A+ g_warning ("Failed to get display to ignore ConsoleKit");
16983N/A+ }
16983N/A+ } else {
16983N/A+ g_debug ("GdmSlave: Display is now ignoring ConsoleKit");
16983N/A+ }
16983N/A+}
16983N/A+
16983N/A+void
16983N/A+gdm_slave_unblock_console_session_requests_on_display (GdmSlave *slave)
16983N/A+{
16983N/A+ gboolean res;
16983N/A+ GError *error;
16983N/A+
16983N/A+ g_debug ("GdmSlave: Informing display to stop ignoring ConsoleKit");
16983N/A+
16983N/A+ error = NULL;
16983N/A+ res = dbus_g_proxy_call (slave->priv->display_proxy,
16983N/A+ "UnblockConsoleSessionRequests",
16983N/A+ &error,
16983N/A+ G_TYPE_INVALID, G_TYPE_INVALID);
16983N/A+
16983N/A+ if (! res) {
16983N/A+ if (error != NULL) {
16983N/A+ g_warning ("Failed to get display to stop ignoring ConsoleKit: %s", error->message);
16983N/A+ g_error_free (error);
16983N/A+ } else {
16983N/A+ g_warning ("Failed to get display to stop ignoring ConsoleKit");
16983N/A+ }
16983N/A+ } else {
16983N/A+ g_debug ("GdmSlave: Display is no longer ignoring ConsoleKit");
16983N/A+ }
16983N/A+}
16983N/A+
16983N/A+
16983N/A static void
16983N/A _gdm_slave_set_display_id (GdmSlave *slave,
16983N/A const char *id)
20816N/A@@ -1492,6 +1622,15 @@ _gdm_slave_set_display_name (GdmSlave
17291N/A slave->priv->display_name = g_strdup (name);
17291N/A }
17291N/A
17291N/A+
17291N/A+static void
17291N/A+_gdm_slave_set_display_type (GdmSlave *slave,
17291N/A+ const char *type)
17291N/A+{
17291N/A+ g_free (slave->priv->display_type);
17291N/A+ slave->priv->display_type = g_strdup (type);
17291N/A+}
17291N/A+
17291N/A static void
17291N/A _gdm_slave_set_display_number (GdmSlave *slave,
17291N/A int number)
20816N/A@@ -1524,6 +1663,14 @@ _gdm_slave_set_display_seat_id (GdmSlave
16983N/A }
16983N/A
16983N/A static void
16983N/A+_gdm_slave_set_display_session_id (GdmSlave *slave,
16983N/A+ const char *id)
16983N/A+{
16983N/A+ g_free (slave->priv->display_session_id);
16983N/A+ slave->priv->display_session_id = g_strdup (id);
16983N/A+}
16983N/A+
16983N/A+static void
16983N/A _gdm_slave_set_display_is_local (GdmSlave *slave,
16983N/A gboolean is)
16983N/A {
20816N/A@@ -1547,6 +1694,9 @@ gdm_slave_set_property (GObject *ob
17291N/A case PROP_DISPLAY_NAME:
17291N/A _gdm_slave_set_display_name (self, g_value_get_string (value));
17291N/A break;
17291N/A+ case PROP_DISPLAY_TYPE:
17291N/A+ _gdm_slave_set_display_type (self, g_value_get_string (value));
17291N/A+ break;
17291N/A case PROP_DISPLAY_NUMBER:
17291N/A _gdm_slave_set_display_number (self, g_value_get_int (value));
17291N/A break;
20816N/A@@ -1556,6 +1706,9 @@ gdm_slave_set_property (GObject *ob
16983N/A case PROP_DISPLAY_SEAT_ID:
16983N/A _gdm_slave_set_display_seat_id (self, g_value_get_string (value));
16983N/A break;
16983N/A+ case PROP_DISPLAY_SESSION_ID:
16983N/A+ _gdm_slave_set_display_session_id (self, g_value_get_string (value));
16983N/A+ break;
16983N/A case PROP_DISPLAY_X11_AUTHORITY_FILE:
16983N/A _gdm_slave_set_display_x11_authority_file (self, g_value_get_string (value));
16983N/A break;
20816N/A@@ -1585,6 +1738,9 @@ gdm_slave_get_property (GObject *obje
17291N/A case PROP_DISPLAY_NAME:
17291N/A g_value_set_string (value, self->priv->display_name);
17291N/A break;
17291N/A+ case PROP_DISPLAY_TYPE:
17291N/A+ g_value_set_string (value, self->priv->display_type);
17291N/A+ break;
17291N/A case PROP_DISPLAY_NUMBER:
17291N/A g_value_set_int (value, self->priv->display_number);
17291N/A break;
20816N/A@@ -1594,6 +1750,9 @@ gdm_slave_get_property (GObject *obje
16983N/A case PROP_DISPLAY_SEAT_ID:
16983N/A g_value_set_string (value, self->priv->display_seat_id);
16983N/A break;
16983N/A+ case PROP_DISPLAY_SESSION_ID:
16983N/A+ g_value_set_string (value, self->priv->display_session_id);
16983N/A+ break;
16983N/A case PROP_DISPLAY_X11_AUTHORITY_FILE:
16983N/A g_value_set_string (value, self->priv->display_x11_authority_file);
16983N/A break;
20816N/A@@ -1688,6 +1847,13 @@ gdm_slave_class_init (GdmSlaveClass *kla
17291N/A NULL,
17291N/A G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
17291N/A g_object_class_install_property (object_class,
17291N/A+ PROP_DISPLAY_TYPE,
17291N/A+ g_param_spec_string ("display-type",
17291N/A+ "display type",
17291N/A+ "display type",
17291N/A+ NULL,
17291N/A+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
17291N/A+ g_object_class_install_property (object_class,
17291N/A PROP_DISPLAY_NUMBER,
17291N/A g_param_spec_int ("display-number",
17291N/A "display number",
20816N/A@@ -1711,6 +1877,13 @@ gdm_slave_class_init (GdmSlaveClass *kla
16983N/A NULL,
16983N/A G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
16983N/A g_object_class_install_property (object_class,
16983N/A+ PROP_DISPLAY_SESSION_ID,
16983N/A+ g_param_spec_string ("display-session-id",
16983N/A+ "",
16983N/A+ "",
16983N/A+ NULL,
16983N/A+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
16983N/A+ g_object_class_install_property (object_class,
16983N/A PROP_DISPLAY_X11_AUTHORITY_FILE,
16983N/A g_param_spec_string ("display-x11-authority-file",
16983N/A "",
20816N/A@@ -1736,6 +1909,17 @@ gdm_slave_class_init (GdmSlaveClass *kla
20816N/A G_TYPE_NONE,
20816N/A 0);
20816N/A
20816N/A+ signals [FAILED] =
20816N/A+ g_signal_new ("failed",
20816N/A+ G_TYPE_FROM_CLASS (object_class),
20816N/A+ G_SIGNAL_RUN_LAST,
20816N/A+ G_STRUCT_OFFSET (GdmSlaveClass, failed),
20816N/A+ NULL,
20816N/A+ NULL,
20816N/A+ g_cclosure_marshal_VOID__VOID,
20816N/A+ G_TYPE_NONE,
20816N/A+ 0);
20816N/A+
20816N/A dbus_g_object_type_install_info (GDM_TYPE_SLAVE, &dbus_glib_gdm_slave_object_info);
20816N/A }
20816N/A
20816N/A@@ -1765,6 +1949,7 @@ gdm_slave_finalize (GObject *object)
17291N/A g_free (slave->priv->id);
17291N/A g_free (slave->priv->display_id);
17291N/A g_free (slave->priv->display_name);
17291N/A+ g_free (slave->priv->display_type);
17291N/A g_free (slave->priv->display_hostname);
17291N/A g_free (slave->priv->display_seat_id);
17291N/A g_free (slave->priv->display_x11_authority_file);
16983N/Adiff --git a/daemon/gdm-slave.h b/daemon/gdm-slave.h
16983N/Aindex af28b00..3783c2a 100644
16983N/A--- a/daemon/gdm-slave.h
16983N/A+++ b/daemon/gdm-slave.h
20816N/A@@ -51,6 +51,7 @@ typedef struct
20816N/A
20816N/A /* signals */
20816N/A void (*stopped) (GdmSlave *slave);
20816N/A+ void (*failed) (GdmSlave *slave);
20816N/A } GdmSlaveClass;
20816N/A
20816N/A GType gdm_slave_get_type (void);
20816N/A@@ -72,6 +73,9 @@ gboolean gdm_slave_add_user_a
16983N/A gboolean gdm_slave_switch_to_user_session (GdmSlave *slave,
16983N/A const char *username);
16983N/A
16983N/A+void gdm_slave_block_console_session_requests_on_display (GdmSlave *slave);
16983N/A+void gdm_slave_unblock_console_session_requests_on_display (GdmSlave *slave);
16983N/A+
16983N/A gboolean gdm_slave_connect_to_x11_display (GdmSlave *slave);
20788N/A
20788N/A void gdm_slave_set_initial_cursor_position (GdmSlave *slave);
20816N/A@@ -81,6 +85,8 @@ gboolean gdm_slave_run_script
16983N/A const char *dir,
16983N/A const char *username);
16983N/A void gdm_slave_stopped (GdmSlave *slave);
16983N/A+void gdm_slave_set_console_session_id (GdmSlave *slave,
16983N/A+ const char *session_id);
20788N/A
16983N/A G_END_DECLS
16983N/A
16880N/Adiff --git a/daemon/gdm-welcome-session.c b/daemon/gdm-welcome-session.c
18940N/Aindex 39c53d8..426e3d0 100644
16880N/A--- a/daemon/gdm-welcome-session.c
16880N/A+++ b/daemon/gdm-welcome-session.c
20788N/A@@ -67,6 +67,7 @@ struct GdmWelcomeSessionPrivate
16880N/A
16880N/A char *x11_display_name;
20788N/A char *x11_display_seat_id;
16983N/A+ char *x11_display_session_id;
16880N/A char *x11_display_device;
16880N/A char *x11_display_hostname;
16880N/A char *x11_authority_file;
20839N/A@@ -88,6 +89,7 @@ enum {
16880N/A PROP_0,
16880N/A PROP_X11_DISPLAY_NAME,
20788N/A PROP_X11_DISPLAY_SEAT_ID,
16983N/A+ PROP_X11_DISPLAY_SESSION_ID,
16880N/A PROP_X11_DISPLAY_DEVICE,
16880N/A PROP_X11_DISPLAY_HOSTNAME,
16880N/A PROP_X11_AUTHORITY_FILE,
20839N/A@@ -137,6 +139,8 @@ open_welcome_session (GdmWelcomeSession
20839N/A const char *session_type;
20839N/A const char *hostname;
20839N/A const char *x11_display_device;
20839N/A+ const char *seat_id;
20839N/A+ const char *session_id;
20839N/A int res;
20839N/A gboolean ret;
20839N/A DBusError error;
20839N/A@@ -172,6 +176,18 @@ open_welcome_session (GdmWelcomeSession
20839N/A x11_display_device = "";
20839N/A }
20839N/A
20839N/A+ if (welcome_session->priv->x11_display_seat_id != NULL) {
20839N/A+ seat_id = welcome_session->priv->x11_display_seat_id;
20839N/A+ } else {
20839N/A+ seat_id = "";
20839N/A+ }
20839N/A+
20839N/A+ if (welcome_session->priv->x11_display_session_id != NULL) {
20839N/A+ session_id = welcome_session->priv->x11_display_session_id;
20839N/A+ } else {
20839N/A+ session_id = "";
20839N/A+ }
20839N/A+
20839N/A g_debug ("GdmWelcomeSession: Opening ConsoleKit session for user:%d x11-display:'%s' x11-display-device:'%s' remote-host-name:'%s' is-local:%d",
20839N/A pwent->pw_uid,
20839N/A welcome_session->priv->x11_display_name,
20839N/A@@ -185,6 +201,8 @@ open_welcome_session (GdmWelcomeSession
20839N/A "unix-user", &pwent->pw_uid,
20839N/A "session-type", &session_type,
20839N/A "x11-display", &welcome_session->priv->x11_display_name,
20839N/A+ "seat-id", &seat_id,
20839N/A+ "session", &session_id,
20839N/A "x11-display-device", &x11_display_device,
20839N/A "remote-host-name", &hostname,
20839N/A "is-local", &welcome_session->priv->x11_display_is_local,
20839N/A@@ -1060,6 +1078,14 @@ _gdm_welcome_session_set_x11_display_sea
16880N/A }
16880N/A
16880N/A static void
16983N/A+_gdm_welcome_session_set_x11_display_session_id (GdmWelcomeSession *welcome_session,
16983N/A+ const char *ssid)
16983N/A+{
16983N/A+ g_free (welcome_session->priv->x11_display_session_id);
16983N/A+ welcome_session->priv->x11_display_session_id = g_strdup (ssid);
16983N/A+}
16983N/A+
16983N/A+static void
16880N/A _gdm_welcome_session_set_x11_display_hostname (GdmWelcomeSession *welcome_session,
16880N/A const char *name)
16880N/A {
20839N/A@@ -1082,7 +1108,6 @@ _gdm_welcome_session_set_x11_display_is_
20839N/A welcome_session->priv->x11_display_is_local = is_local;
20839N/A }
20839N/A
20839N/A-
20839N/A static void
20839N/A _gdm_welcome_session_set_x11_authority_file (GdmWelcomeSession *welcome_session,
20839N/A const char *file)
20839N/A@@ -1171,6 +1196,9 @@ gdm_welcome_session_set_property (GObjec
20788N/A case PROP_X11_DISPLAY_SEAT_ID:
20788N/A _gdm_welcome_session_set_x11_display_seat_id (self, g_value_get_string (value));
16880N/A break;
16983N/A+ case PROP_X11_DISPLAY_SESSION_ID:
16983N/A+ _gdm_welcome_session_set_x11_display_session_id (self, g_value_get_string (value));
16983N/A+ break;
16880N/A case PROP_X11_DISPLAY_HOSTNAME:
16880N/A _gdm_welcome_session_set_x11_display_hostname (self, g_value_get_string (value));
16880N/A break;
20839N/A@@ -1233,6 +1261,9 @@ gdm_welcome_session_get_property (GObjec
20788N/A case PROP_X11_DISPLAY_SEAT_ID:
20788N/A g_value_set_string (value, self->priv->x11_display_seat_id);
16880N/A break;
16983N/A+ case PROP_X11_DISPLAY_SESSION_ID:
16983N/A+ g_value_set_string (value, self->priv->x11_display_session_id);
16983N/A+ break;
16880N/A case PROP_X11_DISPLAY_HOSTNAME:
16880N/A g_value_set_string (value, self->priv->x11_display_hostname);
16880N/A break;
20839N/A@@ -1318,6 +1349,29 @@ gdm_welcome_session_class_init (GdmWelco
20788N/A "seat id",
16880N/A NULL,
16880N/A G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
20788N/A+
20788N/A+ g_object_class_install_property (object_class,
20788N/A+ PROP_X11_DISPLAY_SESSION_ID,
20788N/A+ g_param_spec_string ("x11-display-session-id",
20788N/A+ "session id",
20788N/A+ "session id",
20788N/A+ NULL,
20788N/A+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
20788N/A+
20788N/A+ g_object_class_install_property (object_class,
16880N/A+ PROP_X11_DISPLAY_SEAT_ID,
16880N/A+ g_param_spec_string ("x11-display-seat-id",
16880N/A+ "seat id",
16880N/A+ "seat id",
16880N/A+ NULL,
16880N/A+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
16880N/A+ g_object_class_install_property (object_class,
16983N/A+ PROP_X11_DISPLAY_SESSION_ID,
16983N/A+ g_param_spec_string ("x11-display-session-id",
16983N/A+ "session id",
16983N/A+ "session id",
16983N/A+ NULL,
16983N/A+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
20788N/A g_object_class_install_property (object_class,
16880N/A PROP_X11_DISPLAY_HOSTNAME,
16880N/A g_param_spec_string ("x11-display-hostname",
20839N/A@@ -1488,6 +1542,7 @@ gdm_welcome_session_finalize (GObject *o
17724N/A g_free (welcome_session->priv->runtime_dir);
16880N/A g_free (welcome_session->priv->x11_display_name);
20788N/A g_free (welcome_session->priv->x11_display_seat_id);
18940N/A+ g_free (welcome_session->priv->x11_display_session_id);
16880N/A g_free (welcome_session->priv->x11_display_device);
16880N/A g_free (welcome_session->priv->x11_display_hostname);
16880N/A g_free (welcome_session->priv->x11_authority_file);
16880N/Adiff --git a/daemon/gdm-xdmcp-chooser-display.c b/daemon/gdm-xdmcp-chooser-display.c
16880N/Aindex 85bd3b7..f7b5a0b 100644
16880N/A--- a/daemon/gdm-xdmcp-chooser-display.c
16880N/A+++ b/daemon/gdm-xdmcp-chooser-display.c
16880N/A@@ -224,7 +224,7 @@ gdm_xdmcp_chooser_display_new (const char *hostname,
16880N/A "remote-hostname", hostname,
16880N/A "x11-display-number", number,
16880N/A "x11-display-name", x11_display,
16880N/A- "is-local", FALSE,
16880N/A+ "is-local", TRUE,
16880N/A "remote-address", address,
16880N/A "session-number", session_number,
16880N/A NULL);
18160N/Adiff --git a/data/Init.in b/data/Init.in
18160N/Aindex dca63a2..f2d4c0a 100644
18160N/A--- a/data/Init.in
18160N/A+++ b/data/Init.in
18160N/A@@ -3,7 +3,7 @@
18160N/A # Plus a lot of fun stuff added
18160N/A # -George
18160N/A
18160N/A-PATH="@X_PATH@:$PATH"
18160N/A+PATH="@SCRIPT_PATH@"
18160N/A OLD_IFS=$IFS
18160N/A
18160N/A gdmwhich () {
18160N/Adiff --git a/data/Makefile.am b/data/Makefile.am
18160N/Aindex 60d7624..3ee1a67 100644
18160N/A--- a/data/Makefile.am
18160N/A+++ b/data/Makefile.am
18160N/A@@ -21,17 +21,6 @@ Xsession: $(srcdir)/Xsession.in
18160N/A -e 's,[@]libexecdir[@],$(libexecdir),g' \
18160N/A <$(srcdir)/Xsession.in >Xsession
18160N/A
18160N/A-Init: $(srcdir)/Init.in
18160N/A- sed -e 's,[@]X_PATH[@],$(X_PATH),g' \
18160N/A- <$(srcdir)/Init.in >Init
18160N/A-
18160N/A-PreSession: $(srcdir)/PreSession.in
18160N/A- sed -e 's,[@]X_PATH[@],$(X_PATH),g' \
18160N/A- <$(srcdir)/PreSession.in >PreSession
18160N/A-PostSession: $(srcdir)/PostSession.in
18160N/A- sed -e 's,[@]X_PATH[@],$(X_PATH),g' \
18160N/A- <$(srcdir)/PostSession.in >PostSession
18160N/A-
18160N/A gdm.conf-custom: $(srcdir)/gdm.conf-custom.in
18160N/A sed -e 's,[@]GDM_DEFAULTS_CONF[@],$(GDM_DEFAULTS_CONF),g' \
18160N/A <$(srcdir)/gdm.conf-custom.in >gdm.conf-custom
18160N/Adiff --git a/data/PostSession.in b/data/PostSession.in
18160N/Aindex c52d3c2..54276fd 100755
18160N/A--- a/data/PostSession.in
18160N/A+++ b/data/PostSession.in
18160N/A@@ -1,3 +1,4 @@
18160N/A #!/bin/sh
18160N/A+PATH="@SCRIPT_PATH@"
18160N/A
18160N/A exit 0
18160N/Adiff --git a/data/PreSession.in b/data/PreSession.in
18160N/Aindex cfabee7..09ad05b 100755
18160N/A--- a/data/PreSession.in
18160N/A+++ b/data/PreSession.in
18160N/A@@ -6,4 +6,4 @@
18160N/A #
18160N/A # Note that output goes into the .xsession-errors file for easy debugging
18160N/A #
18160N/A-PATH="@X_PATH@:$PATH"
18160N/A+PATH="@SCRIPT_PATH@"
17753N/Adiff --git a/data/gdm.schemas.in.in b/data/gdm.schemas.in.in
18747N/Aindex 514117d..8c551ce 100644
17753N/A--- a/data/gdm.schemas.in.in
17753N/A+++ b/data/gdm.schemas.in.in
17753N/A@@ -55,12 +55,6 @@
17753N/A </schema>
17753N/A
17753N/A <schema>
17753N/A- <key>security/DisallowTCP</key>
17753N/A- <signature>b</signature>
17753N/A- <default>true</default>
17753N/A- </schema>
17753N/A-
17753N/A- <schema>
17753N/A <key>greeter/Include</key>
17753N/A <signature>s</signature>
17753N/A <default></default>
17753N/Adiff --git a/docs/C/gdm.xml b/docs/C/gdm.xml
18747N/Aindex 8ad3046..c996fd3 100644
17753N/A--- a/docs/C/gdm.xml
17753N/A+++ b/docs/C/gdm.xml
17753N/A@@ -1364,18 +1364,6 @@ TimedLogin=you
17753N/A <variablelist>
17753N/A <title>[security]</title>
17753N/A
17753N/A- <varlistentry>
17753N/A- <term>DisallowTCP</term>
17753N/A- <listitem>
17753N/A- <synopsis>DisallowTCP=true</synopsis>
17753N/A- <para>
17753N/A- If true, then always append <filename>-nolisten tcp</filename>
17753N/A- to the command line when starting attached Xservers, thus
17753N/A- disallowing TCP connection. This is a more secure
17753N/A- configuration if you are not using remote connections.
17753N/A- </para>
17753N/A- </listitem>
17753N/A- </varlistentry>
17753N/A </variablelist>
17753N/A </sect3>
17753N/A
20244N/A--- gdm-2.30.6/daemon/main.c-orig 2011-04-29 01:37:53.212108822 -0500
20244N/A+++ gdm-2.30.6/daemon/main.c 2011-04-29 01:44:25.634203279 -0500
20244N/A@@ -216,7 +216,19 @@ bus_proxy_destroyed_cb (DBusGProxy *bus
20244N/A g_object_unref (*managerp);
20244N/A *managerp = NULL;
20244N/A
20244N/A+#if __sun
20244N/A+ /*
20244N/A+ * This function is only called when the D-Bus Service exits. Calling
20244N/A+ * this timeout function causes all GDM sessions to exit anyway. The
20244N/A+ * timeout function just cauess GDM to act like it is starting again.
20244N/A+ * Since SMF already takes care of restarting GDM on Solaris, and since
20244N/A+ * using the timeout confuses SMF, just exit and let SMF take care of
20244N/A+ * this.
20244N/A+ */
20244N/A+ exit (-1);
20244N/A+#else
20244N/A g_timeout_add_seconds (3, (GSourceFunc)bus_reconnect, managerp);
20244N/A+#endif
20244N/A }
20244N/A
20244N/A static void
20839N/A--- gdm-2.30.6/daemon/gdm-slave-proxy.c-orig 2011-07-27 22:39:34.093633335 -0500
20839N/A+++ gdm-2.30.6/daemon/gdm-slave-proxy.c 2011-07-27 22:39:53.645417598 -0500
20839N/A@@ -245,6 +245,7 @@ kill_slave (GdmSlaveProxy *slave)
20839N/A g_warning ("Unable to kill slave process");
20839N/A } else {
20839N/A exit_status = gdm_wait_on_pid (slave->priv->pid);
20839N/A+ g_debug ("GdmSlaveProxy: Slave exit status %d", exit_status);
20839N/A g_spawn_close_pid (slave->priv->pid);
20839N/A slave->priv->pid = 0;
20839N/A }
20828N/A--- gdm-2.30.6/daemon/simple-slave-main.c-orig 2011-07-27 22:39:00.175370529 -0500
20828N/A+++ gdm-2.30.6/daemon/simple-slave-main.c 2011-07-27 22:39:53.643306968 -0500
20816N/A@@ -154,6 +154,15 @@ on_slave_stopped (GdmSlave *slave,
20816N/A g_main_loop_quit (main_loop);
20816N/A }
20816N/A
20816N/A+static void
20816N/A+on_slave_failed (GdmSlave *slave,
20816N/A+ GMainLoop *main_loop)
20816N/A+{
20816N/A+ g_debug ("slave failed");
20816N/A+ gdm_return_code = 1;
20816N/A+ g_main_loop_quit (main_loop);
20816N/A+}
20816N/A+
20816N/A static gboolean
20816N/A is_debug_set (void)
20816N/A {
20816N/A@@ -256,6 +265,10 @@ main (int argc,
20816N/A "stopped",
20816N/A G_CALLBACK (on_slave_stopped),
20816N/A main_loop);
20816N/A+ g_signal_connect (slave,
20816N/A+ "failed",
20816N/A+ G_CALLBACK (on_slave_failed),
20816N/A+ main_loop);
20816N/A gdm_slave_start (slave);
20816N/A
20816N/A g_main_loop_run (main_loop);