diff options
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | daemon/INTERNALS | 22 | ||||
-rw-r--r-- | daemon/Makefile.am | 91 | ||||
-rw-r--r-- | daemon/gdm-factory-slave.c | 940 | ||||
-rw-r--r-- | daemon/gdm-factory-slave.h | 55 | ||||
-rw-r--r-- | daemon/gdm-factory-slave.xml | 5 | ||||
-rw-r--r-- | daemon/gdm-local-display-factory.c | 49 | ||||
-rw-r--r-- | daemon/gdm-local-display-factory.h | 7 | ||||
-rw-r--r-- | daemon/gdm-local-display-factory.xml | 5 | ||||
-rw-r--r-- | daemon/gdm-product-display.c | 269 | ||||
-rw-r--r-- | daemon/gdm-product-display.h | 63 | ||||
-rw-r--r-- | daemon/gdm-product-display.xml | 8 | ||||
-rw-r--r-- | daemon/gdm-product-slave.c | 1407 | ||||
-rw-r--r-- | daemon/gdm-product-slave.h | 55 | ||||
-rw-r--r-- | daemon/gdm-product-slave.xml | 5 | ||||
-rw-r--r-- | daemon/gdm-session-relay.h | 64 | ||||
-rw-r--r-- | daemon/product-slave-main.c | 270 |
17 files changed, 0 insertions, 3318 deletions
@@ -28,12 +28,9 @@ configure.lineno gdm.conf gdm.conf-custom gdm-display-glue.h -gdm-factory-slave-glue.h gdm-local-display-factory-glue.h gdm-manager-glue.h gdm.pot -gdm-product-display-glue.h -gdm-product-slave-glue.h gdm-restart gdm-safe-restart gdm.schemas diff --git a/daemon/INTERNALS b/daemon/INTERNALS index 9e6ee41c..13f8ba3d 100644 --- a/daemon/INTERNALS +++ b/daemon/INTERNALS @@ -35,12 +35,6 @@ Server diplay. A subclass of GdmDisplay that represents a local display. -*** GdmProductDisplay - -A subclass of GdmDisplay that only runs a user session. It does not -run a login greeter interface. It will also be destroyed when -the user session ends. - *** GdmXdmcpDisplay A subclass of GdmDisplay that represents a remote XDMCP display. @@ -57,15 +51,6 @@ slave communicates with the parent display using the D-Bus protocol. A subclass of GdmSlave that runs both a login greeter and a user session. -*** GdmFactorySlave - -A subclass of GdmSlave that only runs a login greeter. - -*** GdmProductSlave - -A subclass of GdmSlave that only runs a user session. - - ** GdmServer A class that manages running a local X Server. @@ -93,13 +78,6 @@ A class of object that implements the GdmSession interface. It is used to start and directly control a GdmSessionWorker subprocess by creating a D-Bus server on a private connection. -*** GdmSessionRelay - -A class of object that implements the GdmSession interface. It is -used to relay session controls to a remote listener. In particular, -it is used to relay messages between the GreeterServer in a -GdmFactorySlave and the GdmSessionDirect in a GdmProductSlave. - ** GdmSessionWorkerJob A class that manages running a GdmSessionWorker subprocess. This will diff --git a/daemon/Makefile.am b/daemon/Makefile.am index 9b64d880..d0d75a07 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -31,8 +31,6 @@ AM_CPPFLAGS = \ BUILT_SOURCES = \ gdm-slave-glue.h \ gdm-simple-slave-glue.h \ - gdm-factory-slave-glue.h \ - gdm-product-slave-glue.h \ gdm-xdmcp-chooser-slave-glue.h \ gdm-session-direct-glue.h \ gdm-manager-glue.h \ @@ -42,7 +40,6 @@ BUILT_SOURCES = \ gdm-static-display-glue.h \ gdm-transient-display-glue.h \ gdm-local-display-factory-glue.h \ - gdm-product-display-glue.h \ $(NULL) gdm-manager-glue.h: gdm-manager.xml Makefile.am @@ -51,10 +48,6 @@ gdm-slave-glue.h: gdm-slave.xml Makefile.am dbus-binding-tool --prefix=gdm_slave --mode=glib-server --output=gdm-slave-glue.h $(srcdir)/gdm-slave.xml gdm-simple-slave-glue.h: gdm-simple-slave.xml Makefile.am dbus-binding-tool --prefix=gdm_simple_slave --mode=glib-server --output=gdm-simple-slave-glue.h $(srcdir)/gdm-simple-slave.xml -gdm-factory-slave-glue.h: gdm-factory-slave.xml Makefile.am - dbus-binding-tool --prefix=gdm_factory_slave --mode=glib-server --output=gdm-factory-slave-glue.h $(srcdir)/gdm-factory-slave.xml -gdm-product-slave-glue.h: gdm-product-slave.xml Makefile.am - dbus-binding-tool --prefix=gdm_product_slave --mode=glib-server --output=gdm-product-slave-glue.h $(srcdir)/gdm-product-slave.xml gdm-xdmcp-chooser-slave-glue.h: gdm-xdmcp-chooser-slave.xml Makefile.am dbus-binding-tool --prefix=gdm_xdmcp_chooser_slave --mode=glib-server --output=gdm-xdmcp-chooser-slave-glue.h $(srcdir)/gdm-xdmcp-chooser-slave.xml gdm-session-direct-glue.h: gdm-session-direct.xml Makefile.am @@ -71,8 +64,6 @@ gdm-transient-display-glue.h: gdm-transient-display.xml Makefile.am dbus-binding-tool --prefix=gdm_transient_display --mode=glib-server --output=gdm-transient-display-glue.h $(srcdir)/gdm-transient-display.xml gdm-local-display-factory-glue.h: gdm-local-display-factory.xml Makefile.am dbus-binding-tool --prefix=gdm_local_display_factory --mode=glib-server --output=gdm-local-display-factory-glue.h $(srcdir)/gdm-local-display-factory.xml -gdm-product-display-glue.h: gdm-product-display.xml Makefile.am - dbus-binding-tool --prefix=gdm_product_display --mode=glib-server --output=gdm-product-display-glue.h $(srcdir)/gdm-product-display.xml noinst_PROGRAMS = \ test-session \ @@ -101,8 +92,6 @@ test_session_LDADD = \ libexec_PROGRAMS = \ gdm-simple-slave \ - gdm-factory-slave \ - gdm-product-slave \ gdm-session-worker \ $(NULL) @@ -152,82 +141,6 @@ gdm_simple_slave_LDADD = \ $(SYSTEMD_LIBS) \ $(NULL) -gdm_factory_slave_SOURCES = \ - factory-slave-main.c \ - gdm-greeter-server.c \ - gdm-greeter-server.h \ - gdm-welcome-session.c \ - gdm-welcome-session.h \ - gdm-greeter-session.c \ - gdm-greeter-session.h \ - gdm-server.c \ - gdm-server.h \ - gdm-session.c \ - gdm-session.h \ - gdm-session-direct.c \ - gdm-session-direct.h \ - gdm-session-private.h \ - gdm-session-record.c \ - gdm-session-record.h \ - gdm-session-relay.c \ - gdm-session-relay.h \ - gdm-session-worker-job.c \ - gdm-session-worker-job.h \ - gdm-xerrors.h \ - gdm-xerrors.c \ - gdm-slave.c \ - gdm-slave.h \ - gdm-factory-slave.c \ - gdm-factory-slave.h \ - $(NULL) - -gdm_factory_slave_LDFLAGS = \ - $(PAM_LIBS) \ - $(LIBXKLAVIER_LIBS) \ - $(NULL) - -gdm_factory_slave_LDADD = \ - $(top_builddir)/common/libgdmcommon.la \ - $(XLIB_LIBS) \ - $(DAEMON_LIBS) \ - $(SYSTEMD_LIBS) \ - $(NULL) - -gdm_product_slave_SOURCES = \ - product-slave-main.c \ - gdm-server.c \ - gdm-server.h \ - gdm-session.c \ - gdm-session.h \ - gdm-session-private.h \ - gdm-session-direct.c \ - gdm-session-direct.h \ - gdm-session-record.c \ - gdm-session-record.h \ - gdm-session-worker-job.c \ - gdm-session-worker-job.h \ - gdm-xerrors.h \ - gdm-xerrors.c \ - gdm-slave.c \ - gdm-slave.h \ - gdm-product-slave.c \ - gdm-product-slave.h \ - $(NULL) - -gdm_product_slave_LDFLAGS = \ - $(PAM_LIBS) \ - $(LIBXKLAVIER_LIBS) \ - $(NULL) - -gdm_product_slave_LDADD = \ - $(top_builddir)/common/libgdmcommon.la \ - $(XLIB_LIBS) \ - $(DAEMON_LIBS) \ - $(EXTRA_DAEMON_LIBS) \ - $(LIBXKLAVIER_LIBS) \ - $(SYSTEMD_LIBS) \ - $(NULL) - gdm_xdmcp_chooser_slave_SOURCES = \ xdmcp-chooser-slave-main.c \ gdm-chooser-server.c \ @@ -313,8 +226,6 @@ gdm_binary_SOURCES = \ gdm-static-display.h \ gdm-transient-display.c \ gdm-transient-display.h \ - gdm-product-display.c \ - gdm-product-display.h \ gdm-manager.c \ gdm-manager.h \ gdm-slave-proxy.c \ @@ -380,7 +291,6 @@ EXTRA_DIST = \ gdm.in \ gdm-slave.xml \ gdm-simple-slave.xml \ - gdm-factory-slave.xml \ gdm-product-slave.xml \ gdm-xdmcp-chooser-slave.xml \ gdm-session-direct.xml \ @@ -391,5 +301,4 @@ EXTRA_DIST = \ gdm-static-display.xml \ gdm-transient-display.xml \ gdm-local-display-factory.xml \ - gdm-product-display.xml \ $(NULL) diff --git a/daemon/gdm-factory-slave.c b/daemon/gdm-factory-slave.c deleted file mode 100644 index 35386279..00000000 --- a/daemon/gdm-factory-slave.c +++ /dev/null @@ -1,940 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- - * - * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ - -#include "config.h" - -#include <stdlib.h> -#include <stdio.h> -#include <fcntl.h> -#include <unistd.h> -#include <string.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <errno.h> -#include <pwd.h> -#include <grp.h> - -#include <glib.h> -#include <glib/gi18n.h> -#include <glib/gstdio.h> -#include <glib-object.h> - -#define DBUS_API_SUBJECT_TO_CHANGE -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-lowlevel.h> - -#include <X11/Xlib.h> /* for Display */ - -#include "gdm-common.h" - -#include "gdm-factory-slave.h" -#include "gdm-factory-slave-glue.h" - -#include "gdm-server.h" -#include "gdm-greeter-session.h" -#include "gdm-greeter-server.h" - -#include "gdm-session-relay.h" - -extern char **environ; - -#define GDM_FACTORY_SLAVE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_FACTORY_SLAVE, GdmFactorySlavePrivate)) - -#define GDM_DBUS_NAME "org.gnome.DisplayManager" -#define GDM_DBUS_LOCAL_DISPLAY_FACTORY_PATH "/org/gnome/DisplayManager/LocalDisplayFactory" -#define GDM_DBUS_LOCAL_DISPLAY_FACTORY_INTERFACE "org.gnome.DisplayManager.LocalDisplayFactory" - -#define MAX_CONNECT_ATTEMPTS 10 - -struct GdmFactorySlavePrivate -{ - char *id; - GPid pid; - guint greeter_reset_id; - - GPid server_pid; - Display *server_display; - guint connection_attempts; - - GdmServer *server; - GdmSessionRelay *session; - GdmGreeterServer *greeter_server; - GdmGreeterSession *greeter; - DBusGProxy *factory_proxy; - DBusGConnection *connection; -}; - -static void gdm_factory_slave_class_init (GdmFactorySlaveClass *klass); -static void gdm_factory_slave_init (GdmFactorySlave *factory_slave); -static void gdm_factory_slave_finalize (GObject *object); - -G_DEFINE_TYPE (GdmFactorySlave, gdm_factory_slave, GDM_TYPE_SLAVE) - -static gboolean -greeter_reset_timeout (GdmFactorySlave *slave) -{ - gdm_greeter_server_reset (slave->priv->greeter_server); - slave->priv->greeter_reset_id = 0; - return FALSE; -} - -static void -queue_greeter_reset (GdmFactorySlave *slave) -{ - if (slave->priv->greeter_reset_id > 0) { - return; - } - - slave->priv->greeter_reset_id = g_timeout_add_seconds (2, (GSourceFunc)greeter_reset_timeout, slave); -} - -static void -on_greeter_session_start (GdmGreeterSession *greeter, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: Greeter started"); -} - -static void -on_greeter_session_stop (GdmGreeterSession *greeter, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: Greeter stopped"); - - g_object_unref (GDM_FACTORY_SLAVE (slave)->priv->greeter); - GDM_FACTORY_SLAVE (slave)->priv->greeter = NULL; -} - -static void -on_greeter_session_exited (GdmGreeterSession *greeter, - int code, - GdmFactorySlave *slave) -{ - g_debug ("GdmSimpleSlave: Greeter exited: %d", code); - gdm_slave_stopped (GDM_SLAVE (slave)); -} - -static void -on_greeter_session_died (GdmGreeterSession *greeter, - int signal, - GdmFactorySlave *slave) -{ - g_debug ("GdmSimpleSlave: Greeter died: %d", signal); - gdm_slave_stopped (GDM_SLAVE (slave)); -} - - -static void -on_session_info (GdmSession *session, - const char *service_name, - const char *text, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: Info: %s", text); - gdm_greeter_server_info (slave->priv->greeter_server, service_name, text); -} - -static void -on_session_problem (GdmSession *session, - const char *service_name, - const char *text, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: Problem: %s", text); - gdm_greeter_server_problem (slave->priv->greeter_server, service_name, text); -} - -static void -on_session_info_query (GdmSession *session, - const char *service_name, - const char *text, - GdmFactorySlave *slave) -{ - - g_debug ("GdmFactorySlave: Info query: %s", text); - gdm_greeter_server_info_query (slave->priv->greeter_server, service_name, text); -} - -static void -on_session_secret_info_query (GdmSession *session, - const char *service_name, - const char *text, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: Secret info query: %s", text); - gdm_greeter_server_secret_info_query (slave->priv->greeter_server, service_name, text); -} - -static void -on_session_conversation_started (GdmSession *session, - const char *service_name, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: session conversation started"); - - gdm_greeter_server_ready (slave->priv->greeter_server, - service_name); -} - -static void -on_session_setup_complete (GdmSession *session, - const char *service_name, - GdmFactorySlave *slave) -{ - gdm_session_authenticate (session, service_name); -} - -static void -on_session_setup_failed (GdmSession *session, - const char *service_name, - const char *message, - GdmFactorySlave *slave) -{ - gdm_greeter_server_problem (slave->priv->greeter_server, service_name, _("Unable to initialize login system")); - - queue_greeter_reset (slave); -} - -static void -on_session_reset_complete (GdmSession *session, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: PAM reset"); -} - -static void -on_session_reset_failed (GdmSession *session, - const char *message, - GdmFactorySlave *slave) -{ - g_critical ("Unable to reset PAM"); -} - -static void -on_session_authenticated (GdmSession *session, - const char *service_name, - GdmFactorySlave *slave) -{ - gdm_session_authorize (session, service_name); -} - -static void -on_session_authentication_failed (GdmSession *session, - const char *service_name, - const char *message, - GdmFactorySlave *slave) -{ - gdm_greeter_server_problem (slave->priv->greeter_server, service_name, _("Unable to authenticate user")); - - queue_greeter_reset (slave); -} - -static void -on_session_authorized (GdmSession *session, - const char *service_name, - GdmFactorySlave *slave) -{ - int flag; - - /* FIXME: check for migration? */ - flag = GDM_SESSION_CRED_ESTABLISH; - - gdm_session_accredit (session, service_name, flag); -} - -static void -on_session_authorization_failed (GdmSession *session, - const char *service_name, - const char *message, - GdmFactorySlave *slave) -{ - gdm_greeter_server_problem (slave->priv->greeter_server, service_name, _("Unable to authorize user")); - - queue_greeter_reset (slave); -} - -static void -on_session_accredited (GdmSession *session, - const char *service_name, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: session user verified"); - - gdm_session_open_session (session, service_name); -} - -static void -on_session_accreditation_failed (GdmSession *session, - const char *service_name, - const char *message, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: could not successfully authenticate user: %s", - message); - - gdm_greeter_server_problem (slave->priv->greeter_server, service_name, _("Unable to establish credentials")); - - queue_greeter_reset (slave); -} - -static void -on_session_opened (GdmSession *session, - const char *service_name, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: session opened"); - - gdm_session_start_session (session, service_name); - - gdm_greeter_server_reset (slave->priv->greeter_server); -} - -static void -on_session_open_failed (GdmSession *session, - const char *service_name, - const char *message, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: could not open session: %s", message); - - gdm_greeter_server_problem (slave->priv->greeter_server, service_name, _("Unable to open session")); - - queue_greeter_reset (slave); -} - -static void -on_session_session_started (GdmSession *session, - int pid, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: Relay session started"); - - gdm_greeter_server_reset (slave->priv->greeter_server); -} - -static gboolean -create_product_display (GdmFactorySlave *slave) -{ - char *parent_display_id; - char *server_address; - char *product_id; - GError *error; - gboolean res; - gboolean ret; - - ret = FALSE; - - g_debug ("GdmFactorySlave: Create product display"); - - g_debug ("GdmFactorySlave: Connecting to local display factory"); - slave->priv->factory_proxy = dbus_g_proxy_new_for_name (slave->priv->connection, - GDM_DBUS_NAME, - GDM_DBUS_LOCAL_DISPLAY_FACTORY_PATH, - GDM_DBUS_LOCAL_DISPLAY_FACTORY_INTERFACE); - if (slave->priv->factory_proxy == NULL) { - g_warning ("Failed to create local display factory proxy"); - goto out; - } - - server_address = gdm_session_relay_get_address (slave->priv->session); - - g_object_get (slave, - "display-id", &parent_display_id, - NULL); - - error = NULL; - res = dbus_g_proxy_call (slave->priv->factory_proxy, - "CreateProductDisplay", - &error, - DBUS_TYPE_G_OBJECT_PATH, parent_display_id, - G_TYPE_STRING, server_address, - G_TYPE_INVALID, - DBUS_TYPE_G_OBJECT_PATH, &product_id, - G_TYPE_INVALID); - g_free (server_address); - g_free (parent_display_id); - - if (! res) { - if (error != NULL) { - g_warning ("Failed to create product display: %s", error->message); - g_error_free (error); - } else { - g_warning ("Failed to create product display"); - } - goto out; - } - - ret = TRUE; - - out: - return ret; -} - -static void -on_session_relay_disconnected (GdmSessionRelay *session, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: Relay disconnected"); - - /* FIXME: do some kind of loop detection */ - gdm_greeter_server_reset (slave->priv->greeter_server); - create_product_display (slave); -} - -static void -on_session_relay_connected (GdmSessionRelay *session, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: Relay Connected"); -} - -static void -on_greeter_start_conversation (GdmGreeterServer *greeter_server, - const char *service_name, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: start conversation"); - - gdm_session_start_conversation (GDM_SESSION (slave->priv->session), service_name); -} - -static void -on_greeter_begin_verification (GdmGreeterServer *greeter_server, - const char *service_name, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: begin verification"); - gdm_session_setup (GDM_SESSION (slave->priv->session), - service_name); -} - -static void -on_greeter_begin_verification_for_user (GdmGreeterServer *greeter_server, - const char *service_name, - const char *username, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: begin verification for user"); - gdm_session_setup_for_user (GDM_SESSION (slave->priv->session), - service_name, - username); -} - -static void -on_greeter_answer (GdmGreeterServer *greeter_server, - const char *service_name, - const char *text, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: Greeter answer"); - gdm_session_answer_query (GDM_SESSION (slave->priv->session), service_name, text); -} - -static void -on_greeter_session_selected (GdmGreeterServer *greeter_server, - const char *text, - GdmFactorySlave *slave) -{ - gdm_session_select_session (GDM_SESSION (slave->priv->session), text); -} - -static void -on_greeter_language_selected (GdmGreeterServer *greeter_server, - const char *text, - GdmFactorySlave *slave) -{ - gdm_session_select_language (GDM_SESSION (slave->priv->session), text); -} - -static void -on_greeter_user_selected (GdmGreeterServer *greeter_server, - const char *text, - GdmFactorySlave *slave) -{ - gdm_session_select_user (GDM_SESSION (slave->priv->session), text); -} - -static void -on_greeter_cancel (GdmGreeterServer *greeter_server, - GdmFactorySlave *slave) -{ - gdm_session_cancel (GDM_SESSION (slave->priv->session)); -} - -static void -on_greeter_connected (GdmGreeterServer *greeter_server, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: Greeter started"); - - create_product_display (slave); -} - -static void -setup_server (GdmFactorySlave *slave) -{ - /* Set the busy cursor */ - gdm_slave_set_busy_cursor (GDM_SLAVE (slave)); -} - -static void -run_greeter (GdmFactorySlave *slave) -{ - gboolean display_is_local; - char *display_id; - char *display_name; - char *seat_id; - char *display_device; - char *display_hostname; - char *auth_file; - char *address; - - g_debug ("GdmFactorySlave: Running greeter"); - - display_is_local = FALSE; - display_id = NULL; - display_name = NULL; - seat_id = NULL; - auth_file = NULL; - display_device = NULL; - display_hostname = NULL; - - g_object_get (slave, - "display-is-local", &display_is_local, - "display-id", &display_id, - "display-name", &display_name, - "display-seat-id", &seat_id, - "display-hostname", &display_hostname, - "display-x11-authority-file", &auth_file, - NULL); - - if (slave->priv->server != NULL) { - display_device = gdm_server_get_display_device (slave->priv->server); - } - - /* FIXME: send a signal back to the master */ - - /* Run the init script. gdmslave suspends until script has terminated */ - gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR "/Init", GDM_USERNAME); - - slave->priv->greeter_server = gdm_greeter_server_new (display_id); - g_signal_connect (slave->priv->greeter_server, - "start-conversation", - G_CALLBACK (on_greeter_start_conversation), - slave); - g_signal_connect (slave->priv->greeter_server, - "begin-verification", - G_CALLBACK (on_greeter_begin_verification), - slave); - g_signal_connect (slave->priv->greeter_server, - "begin-verification-for-user", - G_CALLBACK (on_greeter_begin_verification_for_user), - slave); - g_signal_connect (slave->priv->greeter_server, - "query-answer", - G_CALLBACK (on_greeter_answer), - slave); - g_signal_connect (slave->priv->greeter_server, - "session-selected", - G_CALLBACK (on_greeter_session_selected), - slave); - g_signal_connect (slave->priv->greeter_server, - "language-selected", - G_CALLBACK (on_greeter_language_selected), - slave); - g_signal_connect (slave->priv->greeter_server, - "user-selected", - G_CALLBACK (on_greeter_user_selected), - slave); - g_signal_connect (slave->priv->greeter_server, - "connected", - G_CALLBACK (on_greeter_connected), - slave); - g_signal_connect (slave->priv->greeter_server, - "cancelled", - G_CALLBACK (on_greeter_cancel), - slave); - gdm_greeter_server_start (slave->priv->greeter_server); - - address = gdm_greeter_server_get_address (slave->priv->greeter_server); - - g_debug ("GdmFactorySlave: Creating greeter on %s %s", display_name, display_device); - slave->priv->greeter = gdm_greeter_session_new (display_name, - seat_id, - display_device, - display_hostname, - display_is_local); - g_signal_connect (slave->priv->greeter, - "started", - G_CALLBACK (on_greeter_session_start), - slave); - g_signal_connect (slave->priv->greeter, - "stopped", - G_CALLBACK (on_greeter_session_stop), - slave); - g_signal_connect (slave->priv->greeter, - "exited", - G_CALLBACK (on_greeter_session_exited), - slave); - g_signal_connect (slave->priv->greeter, - "died", - G_CALLBACK (on_greeter_session_died), - slave); - g_object_set (slave->priv->greeter, - "x11-authority-file", auth_file, - NULL); - gdm_welcome_session_set_server_address (GDM_WELCOME_SESSION (slave->priv->greeter), address); - gdm_welcome_session_start (GDM_WELCOME_SESSION (slave->priv->greeter)); - - g_free (address); - - g_free (display_id); - g_free (display_name); - g_free (seat_id); - g_free (display_device); - g_free (display_hostname); - g_free (auth_file); -} - -static gboolean -idle_connect_to_display (GdmFactorySlave *slave) -{ - gboolean res; - - slave->priv->connection_attempts++; - - g_debug ("GdmFactorySlave: Connect to display"); - - res = gdm_slave_connect_to_x11_display (GDM_SLAVE (slave)); - if (res) { - /* FIXME: handle wait-for-go */ - - setup_server (slave); - run_greeter (slave); - } else { - if (slave->priv->connection_attempts >= MAX_CONNECT_ATTEMPTS) { - g_warning ("Unable to connect to display after %d tries - bailing out", slave->priv->connection_attempts); - exit (1); - } - return TRUE; - } - - return FALSE; -} - -static void -on_server_ready (GdmServer *server, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: Server ready"); - - g_timeout_add (500, (GSourceFunc)idle_connect_to_display, slave); -} - -static void -on_server_exited (GdmServer *server, - int exit_code, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: server exited with code %d\n", exit_code); - - gdm_slave_stopped (GDM_SLAVE (slave)); -} - -static void -on_server_died (GdmServer *server, - int signal_number, - GdmFactorySlave *slave) -{ - g_debug ("GdmFactorySlave: server died with signal %d, (%s)", - signal_number, - g_strsignal (signal_number)); - - gdm_slave_stopped (GDM_SLAVE (slave)); -} - -static gboolean -gdm_factory_slave_run (GdmFactorySlave *slave) -{ - char *display_name; - char *seat_id; - char *auth_file; - gboolean display_is_local; - - g_object_get (slave, - "display-is-local", &display_is_local, - "display-name", &display_name, - "display-seat-id", &seat_id, - "display-x11-authority-file", &auth_file, - NULL); - - /* if this is local display start a server if one doesn't - * exist */ - if (display_is_local) { - gboolean res; - - slave->priv->server = gdm_server_new (display_name, seat_id, auth_file); - g_signal_connect (slave->priv->server, - "exited", - G_CALLBACK (on_server_exited), - slave); - g_signal_connect (slave->priv->server, - "died", - G_CALLBACK (on_server_died), - slave); - g_signal_connect (slave->priv->server, - "ready", - G_CALLBACK (on_server_ready), - slave); - - res = gdm_server_start (slave->priv->server); - if (! res) { - g_warning (_("Could not start the X " - "server (your graphical environment) " - "due to an internal error. " - "Please contact your system administrator " - "or check your syslog to diagnose. " - "In the meantime this display will be " - "disabled. Please restart GDM when " - "the problem is corrected.")); - exit (1); - } - - g_debug ("GdmFactorySlave: Started X server"); - } else { - g_timeout_add (500, (GSourceFunc)idle_connect_to_display, slave); - } - - g_free (display_name); - g_free (auth_file); - - return TRUE; -} - -static gboolean -gdm_factory_slave_start (GdmSlave *slave) -{ - gboolean ret; - - ret = FALSE; - - g_debug ("GdmFactorySlave: Starting factory slave"); - - GDM_SLAVE_CLASS (gdm_factory_slave_parent_class)->start (slave); - - GDM_FACTORY_SLAVE (slave)->priv->session = gdm_session_relay_new (); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "conversation-started", - G_CALLBACK (on_session_conversation_started), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "setup-complete", - G_CALLBACK (on_session_setup_complete), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "setup-failed", - G_CALLBACK (on_session_setup_failed), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "reset-complete", - G_CALLBACK (on_session_reset_complete), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "reset-failed", - G_CALLBACK (on_session_reset_failed), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "authenticated", - G_CALLBACK (on_session_authenticated), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "authentication-failed", - G_CALLBACK (on_session_authentication_failed), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "authorized", - G_CALLBACK (on_session_authorized), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "authorization-failed", - G_CALLBACK (on_session_authorization_failed), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "accredited", - G_CALLBACK (on_session_accredited), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "accreditation-failed", - G_CALLBACK (on_session_accreditation_failed), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "session-opened", - G_CALLBACK (on_session_opened), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "session-open-failed", - G_CALLBACK (on_session_open_failed), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "info", - G_CALLBACK (on_session_info), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "problem", - G_CALLBACK (on_session_problem), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "info-query", - G_CALLBACK (on_session_info_query), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "secret-info-query", - G_CALLBACK (on_session_secret_info_query), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "session-started", - G_CALLBACK (on_session_session_started), - slave); - - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "connected", - G_CALLBACK (on_session_relay_connected), - slave); - g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session, - "disconnected", - G_CALLBACK (on_session_relay_disconnected), - slave); - - gdm_session_relay_start (GDM_FACTORY_SLAVE (slave)->priv->session); - - gdm_factory_slave_run (GDM_FACTORY_SLAVE (slave)); - - ret = TRUE; - - return ret; -} - -static gboolean -gdm_factory_slave_stop (GdmSlave *slave) -{ - g_debug ("GdmFactorySlave: Stopping factory_slave"); - - GDM_SLAVE_CLASS (gdm_factory_slave_parent_class)->stop (slave); - - if (GDM_FACTORY_SLAVE (slave)->priv->session != NULL) { - gdm_session_relay_stop (GDM_FACTORY_SLAVE (slave)->priv->session); - g_object_unref (GDM_FACTORY_SLAVE (slave)->priv->session); - GDM_FACTORY_SLAVE (slave)->priv->session = NULL; - } - - if (GDM_FACTORY_SLAVE (slave)->priv->greeter_server != NULL) { - gdm_greeter_server_stop (GDM_FACTORY_SLAVE (slave)->priv->greeter_server); - g_object_unref (GDM_FACTORY_SLAVE (slave)->priv->greeter_server); - GDM_FACTORY_SLAVE (slave)->priv->greeter_server = NULL; - } - - if (GDM_FACTORY_SLAVE (slave)->priv->greeter != NULL) { - gdm_welcome_session_stop (GDM_WELCOME_SESSION (GDM_FACTORY_SLAVE (slave)->priv->greeter)); - } - - if (GDM_FACTORY_SLAVE (slave)->priv->server != NULL) { - gdm_server_stop (GDM_FACTORY_SLAVE (slave)->priv->server); - g_object_unref (GDM_FACTORY_SLAVE (slave)->priv->server); - GDM_FACTORY_SLAVE (slave)->priv->server = NULL; - } - - if (GDM_FACTORY_SLAVE (slave)->priv->factory_proxy != NULL) { - g_object_unref (GDM_FACTORY_SLAVE (slave)->priv->factory_proxy); - } - - return TRUE; -} - -static void -gdm_factory_slave_class_init (GdmFactorySlaveClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GdmSlaveClass *slave_class = GDM_SLAVE_CLASS (klass); - - object_class->finalize = gdm_factory_slave_finalize; - - slave_class->start = gdm_factory_slave_start; - slave_class->stop = gdm_factory_slave_stop; - - g_type_class_add_private (klass, sizeof (GdmFactorySlavePrivate)); - - dbus_g_object_type_install_info (GDM_TYPE_FACTORY_SLAVE, &dbus_glib_gdm_factory_slave_object_info); -} - -static void -gdm_factory_slave_init (GdmFactorySlave *slave) -{ - GError *error; - - slave->priv = GDM_FACTORY_SLAVE_GET_PRIVATE (slave); - - slave->priv->pid = -1; - - error = NULL; - slave->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); - if (slave->priv->connection == NULL) { - if (error != NULL) { - g_critical ("error getting system bus: %s", error->message); - g_error_free (error); - } - exit (1); - } -} - -static void -gdm_factory_slave_finalize (GObject *object) -{ - GdmFactorySlave *factory_slave; - - g_return_if_fail (object != NULL); - g_return_if_fail (GDM_IS_FACTORY_SLAVE (object)); - - factory_slave = GDM_FACTORY_SLAVE (object); - - g_debug ("GdmFactorySlave: Finalizing slave"); - - g_return_if_fail (factory_slave->priv != NULL); - - gdm_factory_slave_stop (GDM_SLAVE (factory_slave)); - - if (factory_slave->priv->greeter_reset_id > 0) { - g_source_remove (factory_slave->priv->greeter_reset_id); - factory_slave->priv->greeter_reset_id = 0; - } - - G_OBJECT_CLASS (gdm_factory_slave_parent_class)->finalize (object); -} - -GdmSlave * -gdm_factory_slave_new (const char *id) -{ - GObject *object; - - object = g_object_new (GDM_TYPE_FACTORY_SLAVE, - "display-id", id, - NULL); - - return GDM_SLAVE (object); -} diff --git a/daemon/gdm-factory-slave.h b/daemon/gdm-factory-slave.h deleted file mode 100644 index 9e9770f0..00000000 --- a/daemon/gdm-factory-slave.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- - * - * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ - - -#ifndef __GDM_FACTORY_SLAVE_H -#define __GDM_FACTORY_SLAVE_H - -#include <glib-object.h> -#include "gdm-slave.h" - -G_BEGIN_DECLS - -#define GDM_TYPE_FACTORY_SLAVE (gdm_factory_slave_get_type ()) -#define GDM_FACTORY_SLAVE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_FACTORY_SLAVE, GdmFactorySlave)) -#define GDM_FACTORY_SLAVE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_FACTORY_SLAVE, GdmFactorySlaveClass)) -#define GDM_IS_FACTORY_SLAVE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_FACTORY_SLAVE)) -#define GDM_IS_FACTORY_SLAVE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_FACTORY_SLAVE)) -#define GDM_FACTORY_SLAVE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_FACTORY_SLAVE, GdmFactorySlaveClass)) - -typedef struct GdmFactorySlavePrivate GdmFactorySlavePrivate; - -typedef struct -{ - GdmSlave parent; - GdmFactorySlavePrivate *priv; -} GdmFactorySlave; - -typedef struct -{ - GdmSlaveClass parent_class; -} GdmFactorySlaveClass; - -GType gdm_factory_slave_get_type (void); -GdmSlave * gdm_factory_slave_new (const char *id); - -G_END_DECLS - -#endif /* __GDM_FACTORY_SLAVE_H */ diff --git a/daemon/gdm-factory-slave.xml b/daemon/gdm-factory-slave.xml deleted file mode 100644 index 74520ffb..00000000 --- a/daemon/gdm-factory-slave.xml +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> -<node> - <interface name="org.gnome.DisplayManager.FactorySlave"> - </interface> -</node> diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c index cb69a88b..9d823eb8 100644 --- a/daemon/gdm-local-display-factory.c +++ b/daemon/gdm-local-display-factory.c @@ -41,7 +41,6 @@ #include "gdm-display-store.h" #include "gdm-static-display.h" #include "gdm-transient-display.h" -#include "gdm-product-display.h" #define GDM_LOCAL_DISPLAY_FACTORY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_LOCAL_DISPLAY_FACTORY, GdmLocalDisplayFactoryPrivate)) @@ -252,54 +251,6 @@ gdm_local_display_factory_create_transient_display (GdmLocalDisplayFactory *fact return ret; } -gboolean -gdm_local_display_factory_create_product_display (GdmLocalDisplayFactory *factory, - const char *parent_display_id, - const char *relay_address, - char **id, - GError **error) -{ - gboolean ret; - GdmDisplay *display; - guint32 num; - const char *seat_id; - - g_return_val_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory), FALSE); - - ret = FALSE; - - g_debug ("GdmLocalDisplayFactory: Creating product display parent %s address:%s", - parent_display_id, relay_address); - - num = take_next_display_number (factory); - - g_debug ("GdmLocalDisplayFactory: got display num %u", num); - - display = gdm_product_display_new (num, relay_address); - - seat_id = get_seat_of_transient_display (factory); - g_object_set (display, "seat-id", seat_id, NULL); - - store_display (factory, num, display); - - if (! gdm_display_manage (display)) { - display = NULL; - goto out; - } - - if (! gdm_display_get_id (display, id, NULL)) { - display = NULL; - goto out; - } - - ret = TRUE; - out: - /* ref either held by store or not at all */ - g_object_unref (display); - - return ret; -} - static void on_static_display_status_changed (GdmDisplay *display, GParamSpec *arg1, diff --git a/daemon/gdm-local-display-factory.h b/daemon/gdm-local-display-factory.h index 2abb0530..36514316 100644 --- a/daemon/gdm-local-display-factory.h +++ b/daemon/gdm-local-display-factory.h @@ -64,13 +64,6 @@ GdmLocalDisplayFactory * gdm_local_display_factory_new (G gboolean gdm_local_display_factory_create_transient_display (GdmLocalDisplayFactory *factory, char **id, GError **error); - -gboolean gdm_local_display_factory_create_product_display (GdmLocalDisplayFactory *factory, - const char *parent_display_id, - const char *relay_address, - char **id, - GError **error); - G_END_DECLS #endif /* __GDM_LOCAL_DISPLAY_FACTORY_H */ diff --git a/daemon/gdm-local-display-factory.xml b/daemon/gdm-local-display-factory.xml index 51f5153b..515d9913 100644 --- a/daemon/gdm-local-display-factory.xml +++ b/daemon/gdm-local-display-factory.xml @@ -1,11 +1,6 @@ <!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> <node name="/org/gnome/DisplayManager/LocalDisplayFactory"> <interface name="org.gnome.DisplayManager.LocalDisplayFactory"> - <method name="CreateProductDisplay"> - <arg name="parent_display_id" direction="in" type="o"/> - <arg name="relay_address" direction="in" type="s"/> - <arg name="id" direction="out" type="o"/> - </method> <method name="CreateTransientDisplay"> <arg name="id" direction="out" type="o"/> </method> diff --git a/daemon/gdm-product-display.c b/daemon/gdm-product-display.c deleted file mode 100644 index 9b68cb9a..00000000 --- a/daemon/gdm-product-display.c +++ /dev/null @@ -1,269 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- - * - * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ - -#include "config.h" - -#include <stdlib.h> -#include <stdio.h> -#include <fcntl.h> -#include <unistd.h> -#include <string.h> -#include <signal.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <sys/socket.h> - -#include <glib.h> -#include <glib/gi18n.h> -#include <glib-object.h> - -#include "gdm-display.h" -#include "gdm-product-display.h" -#include "gdm-product-display-glue.h" - -#define GDM_PRODUCT_DISPLAY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_PRODUCT_DISPLAY, GdmProductDisplayPrivate)) - -#define DEFAULT_SLAVE_COMMAND LIBEXECDIR"/gdm-product-slave" - -struct GdmProductDisplayPrivate -{ - char *relay_address; -}; - -enum { - PROP_0, - PROP_RELAY_ADDRESS, -}; - -static void gdm_product_display_class_init (GdmProductDisplayClass *klass); -static void gdm_product_display_init (GdmProductDisplay *product_display); -static void gdm_product_display_finalize (GObject *object); - -G_DEFINE_TYPE (GdmProductDisplay, gdm_product_display, GDM_TYPE_DISPLAY) - -static gboolean -gdm_product_display_create_authority (GdmDisplay *display) -{ - g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE); - - GDM_DISPLAY_CLASS (gdm_product_display_parent_class)->create_authority (display); - - return TRUE; -} - -static gboolean -gdm_product_display_add_user_authorization (GdmDisplay *display, - const char *username, - char **filename, - GError **error) -{ - return GDM_DISPLAY_CLASS (gdm_product_display_parent_class)->add_user_authorization (display, username, filename, error); -} - -static gboolean -gdm_product_display_remove_user_authorization (GdmDisplay *display, - const char *username, - GError **error) -{ - return GDM_DISPLAY_CLASS (gdm_product_display_parent_class)->remove_user_authorization (display, username, error); -} - -static gboolean -gdm_product_display_manage (GdmDisplay *display) -{ - g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE); - - GDM_DISPLAY_CLASS (gdm_product_display_parent_class)->manage (display); - - return TRUE; -} - -static gboolean -gdm_product_display_finish (GdmDisplay *display) -{ - g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE); - - GDM_DISPLAY_CLASS (gdm_product_display_parent_class)->finish (display); - - /* when a product display is done it is done */ - gdm_display_unmanage (display); - - return TRUE; -} - -static gboolean -gdm_product_display_unmanage (GdmDisplay *display) -{ - g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE); - - GDM_DISPLAY_CLASS (gdm_product_display_parent_class)->unmanage (display); - - return TRUE; -} - -gboolean -gdm_product_display_get_relay_address (GdmProductDisplay *display, - char **address, - GError **error) -{ - g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE); - - if (address != NULL) { - *address = g_strdup (display->priv->relay_address); - g_debug ("GdmProductDisplay: Returning address: %s", display->priv->relay_address); - } - - return TRUE; -} - -static void -gdm_product_display_set_relay_address (GdmProductDisplay *display, - const char *address) -{ - g_free (display->priv->relay_address); - display->priv->relay_address = g_strdup (address); -} - - -static void -gdm_product_display_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - GdmProductDisplay *self; - - self = GDM_PRODUCT_DISPLAY (object); - - switch (prop_id) { - case PROP_RELAY_ADDRESS: - gdm_product_display_set_relay_address (self, g_value_get_string (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gdm_product_display_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GdmProductDisplay *self; - - self = GDM_PRODUCT_DISPLAY (object); - - switch (prop_id) { - case PROP_RELAY_ADDRESS: - g_value_set_string (value, self->priv->relay_address); - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static GObject * -gdm_product_display_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_properties) -{ - GdmProductDisplay *display; - - display = GDM_PRODUCT_DISPLAY (G_OBJECT_CLASS (gdm_product_display_parent_class)->constructor (type, - n_construct_properties, - construct_properties)); - return G_OBJECT (display); -} - -static void -gdm_product_display_class_init (GdmProductDisplayClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GdmDisplayClass *display_class = GDM_DISPLAY_CLASS (klass); - - object_class->get_property = gdm_product_display_get_property; - object_class->set_property = gdm_product_display_set_property; - object_class->constructor = gdm_product_display_constructor; - object_class->finalize = gdm_product_display_finalize; - - display_class->create_authority = gdm_product_display_create_authority; - display_class->add_user_authorization = gdm_product_display_add_user_authorization; - display_class->remove_user_authorization = gdm_product_display_remove_user_authorization; - display_class->manage = gdm_product_display_manage; - display_class->finish = gdm_product_display_finish; - display_class->unmanage = gdm_product_display_unmanage; - - g_type_class_add_private (klass, sizeof (GdmProductDisplayPrivate)); - - g_object_class_install_property (object_class, - PROP_RELAY_ADDRESS, - g_param_spec_string ("relay-address", - "relay address", - "relay address", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - - dbus_g_object_type_install_info (GDM_TYPE_PRODUCT_DISPLAY, &dbus_glib_gdm_product_display_object_info); -} - -static void -gdm_product_display_init (GdmProductDisplay *product_display) -{ - - product_display->priv = GDM_PRODUCT_DISPLAY_GET_PRIVATE (product_display); -} - -static void -gdm_product_display_finalize (GObject *object) -{ - GdmProductDisplay *product_display; - - g_return_if_fail (object != NULL); - g_return_if_fail (GDM_IS_PRODUCT_DISPLAY (object)); - - product_display = GDM_PRODUCT_DISPLAY (object); - - g_return_if_fail (product_display->priv != NULL); - - g_free (product_display->priv->relay_address); - - G_OBJECT_CLASS (gdm_product_display_parent_class)->finalize (object); -} - -GdmDisplay * -gdm_product_display_new (int display_number, - const char *relay_address) -{ - GObject *object; - char *x11_display; - - x11_display = g_strdup_printf (":%d", display_number); - object = g_object_new (GDM_TYPE_PRODUCT_DISPLAY, - "slave-command", DEFAULT_SLAVE_COMMAND, - "x11-display-number", display_number, - "x11-display-name", x11_display, - "relay-address", relay_address, - NULL); - g_free (x11_display); - - return GDM_DISPLAY (object); -} diff --git a/daemon/gdm-product-display.h b/daemon/gdm-product-display.h deleted file mode 100644 index 8806c1f9..00000000 --- a/daemon/gdm-product-display.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- - * - * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ - - -#ifndef __GDM_PRODUCT_DISPLAY_H -#define __GDM_PRODUCT_DISPLAY_H - -#include <glib-object.h> -#include <dbus/dbus-glib.h> -#include "gdm-display.h" - -G_BEGIN_DECLS - -#define GDM_TYPE_PRODUCT_DISPLAY (gdm_product_display_get_type ()) -#define GDM_PRODUCT_DISPLAY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_PRODUCT_DISPLAY, GdmProductDisplay)) -#define GDM_PRODUCT_DISPLAY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_PRODUCT_DISPLAY, GdmProductDisplayClass)) -#define GDM_IS_PRODUCT_DISPLAY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_PRODUCT_DISPLAY)) -#define GDM_IS_PRODUCT_DISPLAY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_PRODUCT_DISPLAY)) -#define GDM_PRODUCT_DISPLAY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_PRODUCT_DISPLAY, GdmProductDisplayClass)) - -typedef struct GdmProductDisplayPrivate GdmProductDisplayPrivate; - -typedef struct -{ - GdmDisplay parent; - GdmProductDisplayPrivate *priv; -} GdmProductDisplay; - -typedef struct -{ - GdmDisplayClass parent_class; - -} GdmProductDisplayClass; - -GType gdm_product_display_get_type (void); -GdmDisplay * gdm_product_display_new (int display_number, - const char *server_address); - -gboolean gdm_product_display_get_relay_address (GdmProductDisplay *display, - char **address, - GError **error); - - -G_END_DECLS - -#endif /* __GDM_PRODUCT_DISPLAY_H */ diff --git a/daemon/gdm-product-display.xml b/daemon/gdm-product-display.xml deleted file mode 100644 index b8d31c3d..00000000 --- a/daemon/gdm-product-display.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> -<node> - <interface name="org.gnome.DisplayManager.ProductDisplay"> - <method name="GetRelayAddress"> - <arg name="address" direction="out" type="s"/> - </method> - </interface> -</node> diff --git a/daemon/gdm-product-slave.c b/daemon/gdm-product-slave.c deleted file mode 100644 index 844af485..00000000 --- a/daemon/gdm-product-slave.c +++ /dev/null @@ -1,1407 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- - * - * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ - -#include "config.h" - -#include <stdlib.h> -#include <stdio.h> -#include <fcntl.h> -#include <unistd.h> -#include <string.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <errno.h> -#include <pwd.h> -#include <grp.h> - -#include <glib.h> -#include <glib/gi18n.h> -#include <glib/gstdio.h> -#include <glib-object.h> - -#define DBUS_API_SUBJECT_TO_CHANGE -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-lowlevel.h> - -#include <X11/Xlib.h> /* for Display */ - -#include "gdm-common.h" - -#include "gdm-product-slave.h" -#include "gdm-product-slave-glue.h" - -#include "gdm-server.h" -#include "gdm-session-direct.h" - -extern char **environ; - -#define GDM_PRODUCT_SLAVE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_PRODUCT_SLAVE, GdmProductSlavePrivate)) - -#define GDM_DBUS_NAME "org.gnome.DisplayManager" -#define GDM_DBUS_PRODUCT_DISPLAY_INTERFACE "org.gnome.DisplayManager.ProductDisplay" - -#define RELAY_SERVER_DBUS_PATH "/org/gnome/DisplayManager/SessionRelay" -#define RELAY_SERVER_DBUS_INTERFACE "org.gnome.DisplayManager.SessionRelay" - -#define MAX_CONNECT_ATTEMPTS 10 - -struct GdmProductSlavePrivate -{ - char *id; - GPid pid; - - char *relay_address; - - GPid server_pid; - Display *server_display; - guint connection_attempts; - - GdmServer *server; - GdmSessionDirect *session; - DBusConnection *session_relay_connection; - - DBusGProxy *product_display_proxy; - DBusGConnection *connection; - - char *start_session_service_name; -}; - -static void gdm_product_slave_class_init (GdmProductSlaveClass *klass); -static void gdm_product_slave_init (GdmProductSlave *product_slave); -static void gdm_product_slave_finalize (GObject *object); - -G_DEFINE_TYPE (GdmProductSlave, gdm_product_slave, GDM_TYPE_SLAVE) - -static gboolean -send_dbus_string_string_method (DBusConnection *connection, - const char *method, - const char *payload1, - const char *payload2) -{ - DBusError error; - DBusMessage *message; - DBusMessage *reply; - DBusMessageIter iter; - const char *str; - - g_debug ("GdmProductSlave: Calling %s", method); - message = dbus_message_new_method_call (NULL, - RELAY_SERVER_DBUS_PATH, - RELAY_SERVER_DBUS_INTERFACE, - method); - if (message == NULL) { - g_warning ("Couldn't allocate the D-Bus message"); - return FALSE; - } - - dbus_message_iter_init_append (message, &iter); - - if (payload1 != NULL) { - str = payload1; - } else { - str = ""; - } - dbus_message_iter_append_basic (&iter, - DBUS_TYPE_STRING, - &str); - if (payload2 != NULL) { - str = payload2; - } else { - str = ""; - } - dbus_message_iter_append_basic (&iter, - DBUS_TYPE_STRING, - &str); - dbus_error_init (&error); - reply = dbus_connection_send_with_reply_and_block (connection, - message, - -1, - &error); - - dbus_message_unref (message); - - if (dbus_error_is_set (&error)) { - g_warning ("%s %s raised: %s\n", - method, - error.name, - error.message); - return FALSE; - } - if (reply != NULL) { - dbus_message_unref (reply); - } - dbus_connection_flush (connection); - - return TRUE; -} -static gboolean -send_dbus_string_method (DBusConnection *connection, - const char *method, - const char *payload) -{ - DBusError error; - DBusMessage *message; - DBusMessage *reply; - DBusMessageIter iter; - const char *str; - - if (payload != NULL) { - str = payload; - } else { - str = ""; - } - - g_debug ("GdmProductSlave: Calling %s", method); - message = dbus_message_new_method_call (NULL, - RELAY_SERVER_DBUS_PATH, - RELAY_SERVER_DBUS_INTERFACE, - method); - if (message == NULL) { - g_warning ("Couldn't allocate the D-Bus message"); - return FALSE; - } - - dbus_message_iter_init_append (message, &iter); - dbus_message_iter_append_basic (&iter, - DBUS_TYPE_STRING, - &str); - - dbus_error_init (&error); - reply = dbus_connection_send_with_reply_and_block (connection, - message, - -1, - &error); - - dbus_message_unref (message); - - if (dbus_error_is_set (&error)) { - g_warning ("%s %s raised: %s\n", - method, - error.name, - error.message); - return FALSE; - } - if (reply != NULL) { - dbus_message_unref (reply); - } - dbus_connection_flush (connection); - - return TRUE; -} - -static gboolean -send_dbus_void_method (DBusConnection *connection, - const char *method) -{ - DBusError error; - DBusMessage *message; - DBusMessage *reply; - - g_debug ("GdmProductSlave: Calling %s", method); - message = dbus_message_new_method_call (NULL, - RELAY_SERVER_DBUS_PATH, - RELAY_SERVER_DBUS_INTERFACE, - method); - if (message == NULL) { - g_warning ("Couldn't allocate the D-Bus message"); - return FALSE; - } - - dbus_error_init (&error); - reply = dbus_connection_send_with_reply_and_block (connection, - message, - -1, - &error); - - dbus_message_unref (message); - - if (dbus_error_is_set (&error)) { - g_warning ("%s %s raised: %s\n", - method, - error.name, - error.message); - return FALSE; - } - if (reply != NULL) { - dbus_message_unref (reply); - } - dbus_connection_flush (connection); - - return TRUE; -} - - -static gboolean -send_dbus_int_method (DBusConnection *connection, - const char *method, - int payload) -{ - DBusError error; - DBusMessage *message; - DBusMessage *reply; - DBusMessageIter iter; - - g_debug ("GdmSessionWorker: Calling %s", method); - message = dbus_message_new_method_call (NULL, - RELAY_SERVER_DBUS_PATH, - RELAY_SERVER_DBUS_INTERFACE, - method); - if (message == NULL) { - g_warning ("Couldn't allocate the D-Bus message"); - return FALSE; - } - - dbus_message_iter_init_append (message, &iter); - dbus_message_iter_append_basic (&iter, - DBUS_TYPE_INT32, - &payload); - - dbus_error_init (&error); - reply = dbus_connection_send_with_reply_and_block (connection, - message, - -1, - &error); - dbus_message_unref (message); - if (reply != NULL) { - dbus_message_unref (reply); - } - dbus_connection_flush (connection); - - if (dbus_error_is_set (&error)) { - g_debug ("%s %s raised: %s\n", - method, - error.name, - error.message); - return FALSE; - } - - return TRUE; -} - -static void -relay_session_started (GdmProductSlave *slave, - int pid) -{ - send_dbus_int_method (slave->priv->session_relay_connection, - "SessionStarted", - pid); -} - -static void -relay_session_conversation_started (GdmProductSlave *slave, - const char *service_name) -{ - send_dbus_string_method (slave->priv->session_relay_connection, - "ConversationStarted", service_name); -} - -static void -on_session_conversation_started (GdmSession *session, - const char *service_name, - GdmProductSlave *slave) -{ - g_debug ("GdmProductSlave: session conversation started"); - - relay_session_conversation_started (slave, service_name); -} - -static void -disconnect_relay (GdmProductSlave *slave) -{ - /* drop the connection */ - - dbus_connection_close (slave->priv->session_relay_connection); - slave->priv->session_relay_connection = NULL; -} - -static void -on_session_started (GdmSession *session, - int pid, - GdmProductSlave *slave) -{ - g_debug ("GdmProductSlave: session started"); - - relay_session_started (slave, pid); - - disconnect_relay (slave); -} - -static void -on_session_exited (GdmSession *session, - int exit_code, - GdmProductSlave *slave) -{ - g_debug ("GdmProductSlave: session exited with code %d", exit_code); - - gdm_slave_stopped (GDM_SLAVE (slave)); -} - -static void -on_session_died (GdmSession *session, - int signal_number, - GdmProductSlave *slave) -{ - g_debug ("GdmProductSlave: session died with signal %d, (%s)", - signal_number, - g_strsignal (signal_number)); - - gdm_slave_stopped (GDM_SLAVE (slave)); -} - -static void -setup_server (GdmProductSlave *slave) -{ - /* Set the busy cursor */ - gdm_slave_set_busy_cursor (GDM_SLAVE (slave)); -} - -static gboolean -add_user_authorization (GdmProductSlave *slave, - char **filename) -{ - char *username; - gboolean ret; - - username = gdm_session_direct_get_username (slave->priv->session); - - ret = gdm_slave_add_user_authorization (GDM_SLAVE (slave), - username, - filename); - g_debug ("GdmProductSlave: Adding user authorization for %s: %s", username, *filename); - - g_free (username); - - return ret; -} - -static gboolean -setup_session (GdmProductSlave *slave) -{ - char *auth_file; - char *display_device; - - auth_file = NULL; - add_user_authorization (slave, &auth_file); - - g_assert (auth_file != NULL); - - display_device = NULL; - if (slave->priv->server != NULL) { - display_device = gdm_server_get_display_device (slave->priv->server); - } - - g_object_set (slave->priv->session, - "display-device", display_device, - "user-x11-authority-file", auth_file, - NULL); - - g_free (display_device); - g_free (auth_file); - - gdm_session_start_session (GDM_SESSION (slave->priv->session), - slave->priv->start_session_service_name); - - return TRUE; -} - -static gboolean -idle_connect_to_display (GdmProductSlave *slave) -{ - gboolean res; - - slave->priv->connection_attempts++; - - res = gdm_slave_connect_to_x11_display (GDM_SLAVE (slave)); - if (res) { - /* FIXME: handle wait-for-go */ - - setup_server (slave); - setup_session (slave); - } else { - if (slave->priv->connection_attempts >= MAX_CONNECT_ATTEMPTS) { - g_warning ("Unable to connect to display after %d tries - bailing out", slave->priv->connection_attempts); - exit (1); - } - return TRUE; - } - - return FALSE; -} - -static void -on_server_ready (GdmServer *server, - GdmProductSlave *slave) -{ - g_timeout_add (500, (GSourceFunc)idle_connect_to_display, slave); -} - -static void -on_server_exited (GdmServer *server, - int exit_code, - GdmProductSlave *slave) -{ - g_debug ("GdmProductSlave: server exited with code %d\n", exit_code); - - gdm_slave_stopped (GDM_SLAVE (slave)); -} - -static void -on_server_died (GdmServer *server, - int signal_number, - GdmProductSlave *slave) -{ - g_debug ("GdmProductSlave: server died with signal %d, (%s)", - signal_number, - g_strsignal (signal_number)); - - gdm_slave_stopped (GDM_SLAVE (slave)); -} - -static gboolean -gdm_product_slave_create_server (GdmProductSlave *slave) -{ - char *display_name; - char *auth_file; - char *seat_id; - gboolean display_is_local; - - g_object_get (slave, - "display-is-local", &display_is_local, - "display-name", &display_name, - "display-seat-id", &seat_id, - "display-x11-authority-file", &auth_file, - NULL); - - /* if this is local display start a server if one doesn't - * exist */ - if (display_is_local) { - gboolean res; - - slave->priv->server = gdm_server_new (display_name, seat_id, auth_file); - g_signal_connect (slave->priv->server, - "exited", - G_CALLBACK (on_server_exited), - slave); - g_signal_connect (slave->priv->server, - "died", - G_CALLBACK (on_server_died), - slave); - g_signal_connect (slave->priv->server, - "ready", - G_CALLBACK (on_server_ready), - slave); - - res = gdm_server_start (slave->priv->server); - if (! res) { - g_warning (_("Could not start the X " - "server (your graphical environment) " - "due to an internal error. " - "Please contact your system administrator " - "or check your syslog to diagnose. " - "In the meantime this display will be " - "disabled. Please restart GDM when " - "the problem is corrected.")); - exit (1); - } - - g_debug ("GdmProductSlave: Started X server"); - } else { - g_timeout_add (500, (GSourceFunc)idle_connect_to_display, slave); - } - - g_free (display_name); - g_free (auth_file); - - return TRUE; -} - -static void -on_session_setup_complete (GdmSession *session, - GdmProductSlave *slave) -{ - send_dbus_void_method (slave->priv->session_relay_connection, - "SetupComplete"); -} - -static void -on_session_setup_failed (GdmSession *session, - const char *message, - GdmProductSlave *slave) -{ - send_dbus_string_method (slave->priv->session_relay_connection, - "SetupFailed", - message); -} - -static void -on_session_reset_complete (GdmSession *session, - GdmProductSlave *slave) -{ - send_dbus_void_method (slave->priv->session_relay_connection, - "ResetComplete"); -} - -static void -on_session_reset_failed (GdmSession *session, - const char *message, - GdmProductSlave *slave) -{ - send_dbus_string_method (slave->priv->session_relay_connection, - "ResetFailed", - message); -} - -static void -on_session_authenticated (GdmSession *session, - const char *service_name, - GdmProductSlave *slave) -{ - send_dbus_string_method (slave->priv->session_relay_connection, - "Authenticated", service_name); -} - -static void -on_session_authentication_failed (GdmSession *session, - const char *service_name, - const char *message, - GdmProductSlave *slave) -{ - send_dbus_string_string_method (slave->priv->session_relay_connection, - "AuthenticationFailed", - service_name, - message); -} - -static void -on_session_authorized (GdmSession *session, - const char *service_name, - GdmProductSlave *slave) -{ - send_dbus_string_method (slave->priv->session_relay_connection, - "Authorized", service_name); -} - -static void -on_session_authorization_failed (GdmSession *session, - const char *service_name, - const char *message, - GdmProductSlave *slave) -{ - send_dbus_string_string_method (slave->priv->session_relay_connection, - "AuthorizationFailed", - service_name, - message); -} - -static void -on_session_accredited (GdmSession *session, - const char *service_name, - GdmProductSlave *slave) -{ - send_dbus_string_method (slave->priv->session_relay_connection, - "Accredited", service_name); -} - -static void -on_session_accreditation_failed (GdmSession *session, - const char *service_name, - const char *message, - GdmProductSlave *slave) -{ - send_dbus_string_string_method (slave->priv->session_relay_connection, - "AccreditationFailed", - service_name, - message); -} - -static void -on_session_opened (GdmSession *session, - const char *service_name, - GdmProductSlave *slave) -{ - send_dbus_string_method (slave->priv->session_relay_connection, - "SessionOpened", service_name); -} - -static void -on_session_open_failed (GdmSession *session, - const char *service_name, - const char *message, - GdmProductSlave *slave) -{ - send_dbus_string_string_method (slave->priv->session_relay_connection, - "SessionOpenFailed", - service_name, - message); -} - -static void -on_session_info (GdmSession *session, - const char *service_name, - const char *text, - GdmProductSlave *slave) -{ - send_dbus_string_string_method (slave->priv->session_relay_connection, - "Info", - service_name, - text); -} - -static void -on_session_problem (GdmSession *session, - const char *service_name, - const char *text, - GdmProductSlave *slave) -{ - send_dbus_string_string_method (slave->priv->session_relay_connection, - "Problem", - service_name, - text); -} - -static void -on_session_info_query (GdmSession *session, - const char *service_name, - const char *text, - GdmProductSlave *slave) -{ - send_dbus_string_string_method (slave->priv->session_relay_connection, - "InfoQuery", - service_name, text); -} - -static void -on_session_secret_info_query (GdmSession *session, - const char *service_name, - const char *text, - GdmProductSlave *slave) -{ - send_dbus_string_string_method (slave->priv->session_relay_connection, - "SecretInfoQuery", - service_name, - text); -} - -static void -on_relay_setup (GdmProductSlave *slave, - DBusMessage *message) -{ - DBusError error; - const char *service_name; - dbus_bool_t res; - - service_name = NULL; - - dbus_error_init (&error); - res = dbus_message_get_args (message, - &error, - DBUS_TYPE_STRING, &service_name, - DBUS_TYPE_INVALID); - if (res) { - g_debug ("GdmProductSlave: Relay Setup"); - gdm_session_setup (GDM_SESSION (slave->priv->session), - service_name); - } else { - g_warning ("Unable to get arguments: %s", error.message); - dbus_error_free (&error); - } -} - -static void -on_relay_setup_for_user (GdmProductSlave *slave, - DBusMessage *message) -{ - DBusError error; - const char *service_name; - const char *username; - dbus_bool_t res; - - username = NULL; - service_name = NULL; - - dbus_error_init (&error); - res = dbus_message_get_args (message, - &error, - DBUS_TYPE_STRING, &service_name, - DBUS_TYPE_STRING, &username, - DBUS_TYPE_INVALID); - if (res) { - g_debug ("GdmProductSlave: Relay SetupForUser"); - gdm_session_setup_for_user (GDM_SESSION (slave->priv->session), - service_name, - username); - } else { - g_warning ("Unable to get arguments: %s", error.message); - dbus_error_free (&error); - } -} - -static void -on_relay_authenticate (GdmProductSlave *slave, - DBusMessage *message) -{ - DBusError error; - char *service_name; - dbus_bool_t res; - - dbus_error_init (&error); - res = dbus_message_get_args (message, - &error, - DBUS_TYPE_STRING, &service_name, - DBUS_TYPE_INVALID); - if (res) { - g_debug ("GdmProductSlave: Relay Authenticate"); - gdm_session_authenticate (GDM_SESSION (slave->priv->session), service_name); - } else { - g_warning ("Unable to get arguments: %s", error.message); - dbus_error_free (&error); - } - dbus_error_free (&error); -} - -static void -on_relay_authorize (GdmProductSlave *slave, - DBusMessage *message) -{ - DBusError error; - char *service_name; - dbus_bool_t res; - - dbus_error_init (&error); - res = dbus_message_get_args (message, - &error, - DBUS_TYPE_STRING, &service_name, - DBUS_TYPE_INVALID); - if (res) { - g_debug ("GdmProductSlave: Relay Authorize"); - gdm_session_authorize (GDM_SESSION (slave->priv->session), service_name); - } else { - g_warning ("Unable to get arguments: %s", error.message); - dbus_error_free (&error); - } - dbus_error_free (&error); -} - -static void -on_relay_establish_credentials (GdmProductSlave *slave, - DBusMessage *message) -{ - DBusError error; - char *service_name; - dbus_bool_t res; - - dbus_error_init (&error); - res = dbus_message_get_args (message, - &error, - DBUS_TYPE_STRING, &service_name, - DBUS_TYPE_INVALID); - if (res) { - g_debug ("GdmProductSlave: Relay EstablishCredentials"); - gdm_session_accredit (GDM_SESSION (slave->priv->session), service_name, GDM_SESSION_CRED_ESTABLISH); - } else { - g_warning ("Unable to get arguments: %s", error.message); - dbus_error_free (&error); - } - dbus_error_free (&error); -} - -static void -on_relay_refresh_credentials (GdmProductSlave *slave, - DBusMessage *message) -{ - DBusError error; - char *service_name; - dbus_bool_t res; - - dbus_error_init (&error); - res = dbus_message_get_args (message, - &error, - DBUS_TYPE_STRING, &service_name, - DBUS_TYPE_INVALID); - if (res) { - g_debug ("GdmProductSlave: Relay RefreshCredentials"); - gdm_session_accredit (GDM_SESSION (slave->priv->session), service_name, GDM_SESSION_CRED_REFRESH); - } else { - g_warning ("Unable to get arguments: %s", error.message); - dbus_error_free (&error); - } - dbus_error_free (&error); -} - -static void -on_relay_answer_query (GdmProductSlave *slave, - DBusMessage *message) -{ - DBusError error; - const char *text; - const char *service_name; - dbus_bool_t res; - - dbus_error_init (&error); - res = dbus_message_get_args (message, - &error, - DBUS_TYPE_STRING, &service_name, - DBUS_TYPE_STRING, &text, - DBUS_TYPE_INVALID); - if (res) { - g_debug ("GdmProductSlave: Relay AnswerQuery"); - gdm_session_answer_query (GDM_SESSION (slave->priv->session), service_name, text); - } else { - g_warning ("Unable to get arguments: %s", error.message); - dbus_error_free (&error); - } -} - -static void -on_relay_session_selected (GdmProductSlave *slave, - DBusMessage *message) -{ - DBusError error; - const char *text; - dbus_bool_t res; - - dbus_error_init (&error); - res = dbus_message_get_args (message, - &error, - DBUS_TYPE_STRING, &text, - DBUS_TYPE_INVALID); - if (res) { - g_debug ("GdmProductSlave: Session selected %s", text); - gdm_session_select_session (GDM_SESSION (slave->priv->session), text); - } else { - g_warning ("Unable to get arguments: %s", error.message); - dbus_error_free (&error); - } -} - -static void -on_relay_language_selected (GdmProductSlave *slave, - DBusMessage *message) -{ - DBusError error; - const char *text; - dbus_bool_t res; - - dbus_error_init (&error); - res = dbus_message_get_args (message, - &error, - DBUS_TYPE_STRING, &text, - DBUS_TYPE_INVALID); - if (res) { - g_debug ("GdmProductSlave: Language selected %s", text); - gdm_session_select_language (GDM_SESSION (slave->priv->session), text); - } else { - g_warning ("Unable to get arguments: %s", error.message); - dbus_error_free (&error); - } -} - -static void -on_relay_user_selected (GdmProductSlave *slave, - DBusMessage *message) -{ - g_debug ("GdmProductSlave: Greeter user selected"); -} - -static void -on_relay_start_conversation (GdmProductSlave *slave, - DBusMessage *message) -{ - DBusError error; - char *service_name; - dbus_bool_t res; - - dbus_error_init (&error); - res = dbus_message_get_args (message, - &error, - DBUS_TYPE_STRING, &service_name, - DBUS_TYPE_INVALID); - if (res) { - g_debug ("GdmProductSlave: Started conversation with %s service", service_name); - gdm_session_start_conversation (GDM_SESSION (slave->priv->session), - service_name); - } else { - g_warning ("Unable to get arguments: %s", error.message); - } - - dbus_error_free (&error); -} - -static void -on_relay_open_session (GdmProductSlave *slave, - DBusMessage *message) -{ - DBusError error; - const char *text; - dbus_bool_t res; - - dbus_error_init (&error); - res = dbus_message_get_args (message, - &error, - DBUS_TYPE_STRING, &text, - DBUS_TYPE_INVALID); - if (res) { - g_debug ("GdmProductSlave: open session %s", text); - gdm_session_open_session (GDM_SESSION (slave->priv->session), - text); - } else { - g_warning ("Unable to get arguments: %s", error.message); - dbus_error_free (&error); - } -} - -static void -on_relay_start_session (GdmProductSlave *slave, - DBusMessage *message) -{ - DBusError error; - const char *service_name; - dbus_bool_t res; - - dbus_error_init (&error); - - res = dbus_message_get_args (message, - &error, - DBUS_TYPE_STRING, &service_name, - DBUS_TYPE_INVALID); - if (res) { - g_debug ("GdmProductSlave: Relay StartSession"); - g_free (slave->priv->start_session_service_name); - slave->priv->start_session_service_name = g_strdup (service_name); - gdm_product_slave_create_server (slave); - } else { - g_warning ("Unable to get arguments: %s", error.message); - dbus_error_free (&error); - } -} - -static void -create_new_session (GdmProductSlave *slave) -{ - gboolean display_is_local; - char *display_id; - char *display_name; - char *display_hostname; - char *display_device; - char *display_seat_id; - char *display_x11_authority_file; - - g_debug ("GdmProductSlave: Creating new session"); - - g_object_get (slave, - "display-id", &display_id, - "display-name", &display_name, - "display-hostname", &display_hostname, - "display-is-local", &display_is_local, - "display-x11-authority-file", &display_x11_authority_file, - "display-seat-id", &display_seat_id, - NULL); - - /* FIXME: we don't yet have a display device! */ - display_device = g_strdup (""); - - slave->priv->session = gdm_session_direct_new (display_id, - display_name, - display_hostname, - display_device, - display_seat_id, - display_x11_authority_file, - display_is_local); - g_free (display_id); - g_free (display_name); - g_free (display_hostname); - g_free (display_x11_authority_file); - g_free (display_device); - - g_signal_connect (slave->priv->session, - "conversation-started", - G_CALLBACK (on_session_conversation_started), - slave); - g_signal_connect (slave->priv->session, - "setup-complete", - G_CALLBACK (on_session_setup_complete), - slave); - g_signal_connect (slave->priv->session, - "setup-failed", - G_CALLBACK (on_session_setup_failed), - slave); - g_signal_connect (slave->priv->session, - "reset-complete", - G_CALLBACK (on_session_reset_complete), - slave); - g_signal_connect (slave->priv->session, - "reset-failed", - G_CALLBACK (on_session_reset_failed), - slave); - g_signal_connect (slave->priv->session, - "authenticated", - G_CALLBACK (on_session_authenticated), - slave); - g_signal_connect (slave->priv->session, - "authentication-failed", - G_CALLBACK (on_session_authentication_failed), - slave); - g_signal_connect (slave->priv->session, - "authorized", - G_CALLBACK (on_session_authorized), - slave); - g_signal_connect (slave->priv->session, - "authorization-failed", - G_CALLBACK (on_session_authorization_failed), - slave); - g_signal_connect (slave->priv->session, - "accredited", - G_CALLBACK (on_session_accredited), - slave); - g_signal_connect (slave->priv->session, - "accreditation-failed", - G_CALLBACK (on_session_accreditation_failed), - slave); - g_signal_connect (slave->priv->session, - "session-opened", - G_CALLBACK (on_session_opened), - slave); - g_signal_connect (slave->priv->session, - "session-open-failed", - G_CALLBACK (on_session_open_failed), - slave); - g_signal_connect (slave->priv->session, - "info", - G_CALLBACK (on_session_info), - slave); - g_signal_connect (slave->priv->session, - "problem", - G_CALLBACK (on_session_problem), - slave); - g_signal_connect (slave->priv->session, - "info-query", - G_CALLBACK (on_session_info_query), - slave); - g_signal_connect (slave->priv->session, - "secret-info-query", - G_CALLBACK (on_session_secret_info_query), - slave); - - g_signal_connect (slave->priv->session, - "session-started", - G_CALLBACK (on_session_started), - slave); - g_signal_connect (slave->priv->session, - "session-exited", - G_CALLBACK (on_session_exited), - slave); - g_signal_connect (slave->priv->session, - "session-died", - G_CALLBACK (on_session_died), - slave); -} - -static void -on_relay_cancelled (GdmProductSlave *slave, - DBusMessage *message) -{ - g_debug ("GdmProductSlave: Relay cancelled"); - - if (slave->priv->session != NULL) { - gdm_session_close (GDM_SESSION (slave->priv->session)); - g_object_unref (slave->priv->session); - } - - create_new_session (slave); -} - -static void -get_relay_address (GdmProductSlave *slave) -{ - GError *error; - char *text; - gboolean res; - - text = NULL; - error = NULL; - res = dbus_g_proxy_call (slave->priv->product_display_proxy, - "GetRelayAddress", - &error, - G_TYPE_INVALID, - G_TYPE_STRING, &text, - G_TYPE_INVALID); - if (! res) { - g_warning ("Unable to get relay address: %s", error->message); - g_error_free (error); - } else { - g_free (slave->priv->relay_address); - slave->priv->relay_address = g_strdup (text); - g_debug ("GdmProductSlave: Got relay address: %s", slave->priv->relay_address); - } - - g_free (text); -} - -static DBusHandlerResult -relay_dbus_handle_message (DBusConnection *connection, - DBusMessage *message, - void *user_data, - dbus_bool_t local_interface) -{ - GdmProductSlave *slave = GDM_PRODUCT_SLAVE (user_data); - -#if 0 - g_message ("obj_path=%s interface=%s method=%s destination=%s", - dbus_message_get_path (message), - dbus_message_get_interface (message), - dbus_message_get_member (message), - dbus_message_get_destination (message)); -#endif - - g_return_val_if_fail (connection != NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED); - g_return_val_if_fail (message != NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED); - - if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "Setup")) { - on_relay_setup (slave, message); - } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "SetupForUser")) { - on_relay_setup_for_user (slave, message); - } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "Authenticate")) { - on_relay_authenticate (slave, message); - } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "Authorize")) { - on_relay_authorize (slave, message); - } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "EstablishCredentials")) { - on_relay_establish_credentials (slave, message); - } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "RefreshCredentials")) { - on_relay_refresh_credentials (slave, message); - } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "AnswerQuery")) { - on_relay_answer_query (slave, message); - } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "SessionSelected")) { - on_relay_session_selected (slave, message); - } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "LanguageSelected")) { - on_relay_language_selected (slave, message); - } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "UserSelected")) { - on_relay_user_selected (slave, message); - } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "OpenSession")) { - on_relay_open_session (slave, message); - } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "StartSession")) { - on_relay_start_session (slave, message); - } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "StartConversation")) { - on_relay_start_conversation (slave, message); - } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "Cancelled")) { - on_relay_cancelled (slave, message); - } else { - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - } - - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult -relay_dbus_filter_function (DBusConnection *connection, - DBusMessage *message, - void *user_data) -{ - GdmProductSlave *slave = GDM_PRODUCT_SLAVE (user_data); - const char *path; - - path = dbus_message_get_path (message); - - g_debug ("GdmProductSlave: obj_path=%s interface=%s method=%s", - dbus_message_get_path (message), - dbus_message_get_interface (message), - dbus_message_get_member (message)); - - if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected") - && strcmp (path, DBUS_PATH_LOCAL) == 0) { - - g_debug ("GdmProductSlave: Got disconnected from the server"); - - dbus_connection_unref (connection); - slave->priv->connection = NULL; - - } else if (dbus_message_is_signal (message, - DBUS_INTERFACE_DBUS, - "NameOwnerChanged")) { - g_debug ("GdmProductSlave: Name owner changed?"); - } else { - return relay_dbus_handle_message (connection, message, user_data, FALSE); - } - - return DBUS_HANDLER_RESULT_HANDLED; -} - -static gboolean -connect_to_session_relay (GdmProductSlave *slave) -{ - DBusError error; - - get_relay_address (slave); - - g_debug ("GdmProductSlave: connecting to session relay address: %s", slave->priv->relay_address); - - dbus_error_init (&error); - slave->priv->session_relay_connection = dbus_connection_open_private (slave->priv->relay_address, &error); - if (slave->priv->session_relay_connection == NULL) { - if (dbus_error_is_set (&error)) { - g_warning ("error opening connection: %s", error.message); - dbus_error_free (&error); - } else { - g_warning ("Unable to open connection"); - } - exit (1); - } - - dbus_connection_setup_with_g_main (slave->priv->session_relay_connection, NULL); - dbus_connection_set_exit_on_disconnect (slave->priv->session_relay_connection, FALSE); - - dbus_connection_add_filter (slave->priv->session_relay_connection, - relay_dbus_filter_function, - slave, - NULL); - - return TRUE; -} - -static gboolean -gdm_product_slave_start (GdmSlave *slave) -{ - gboolean ret; - GError *error; - char *display_id; - - ret = FALSE; - - GDM_SLAVE_CLASS (gdm_product_slave_parent_class)->start (slave); - - g_object_get (slave, - "display-id", &display_id, - NULL); - - error = NULL; - GDM_PRODUCT_SLAVE (slave)->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); - if (GDM_PRODUCT_SLAVE (slave)->priv->connection == NULL) { - if (error != NULL) { - g_critical ("error getting system bus: %s", error->message); - g_error_free (error); - } - exit (1); - } - - error = NULL; - GDM_PRODUCT_SLAVE (slave)->priv->product_display_proxy = dbus_g_proxy_new_for_name_owner (GDM_PRODUCT_SLAVE (slave)->priv->connection, - GDM_DBUS_NAME, - display_id, - GDM_DBUS_PRODUCT_DISPLAY_INTERFACE, - &error); - if (GDM_PRODUCT_SLAVE (slave)->priv->product_display_proxy == NULL) { - if (error != NULL) { - g_warning ("Failed to create display proxy %s: %s", display_id, error->message); - g_error_free (error); - } else { - g_warning ("Unable to create display proxy"); - } - goto out; - } - - create_new_session (GDM_PRODUCT_SLAVE (slave)); - - connect_to_session_relay (GDM_PRODUCT_SLAVE (slave)); - - ret = TRUE; - - out: - g_free (display_id); - - return ret; -} - -static gboolean -gdm_product_slave_stop (GdmSlave *slave) -{ - g_debug ("GdmProductSlave: Stopping product_slave"); - - GDM_SLAVE_CLASS (gdm_product_slave_parent_class)->stop (slave); - - if (GDM_PRODUCT_SLAVE (slave)->priv->session != NULL) { - gdm_session_close (GDM_SESSION (GDM_PRODUCT_SLAVE (slave)->priv->session)); - g_object_unref (GDM_PRODUCT_SLAVE (slave)->priv->session); - GDM_PRODUCT_SLAVE (slave)->priv->session = NULL; - } - - if (GDM_PRODUCT_SLAVE (slave)->priv->server != NULL) { - gdm_server_stop (GDM_PRODUCT_SLAVE (slave)->priv->server); - g_object_unref (GDM_PRODUCT_SLAVE (slave)->priv->server); - GDM_PRODUCT_SLAVE (slave)->priv->server = NULL; - } - - if (GDM_PRODUCT_SLAVE (slave)->priv->product_display_proxy != NULL) { - g_object_unref (GDM_PRODUCT_SLAVE (slave)->priv->product_display_proxy); - } - - return TRUE; -} - -static void -gdm_product_slave_class_init (GdmProductSlaveClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GdmSlaveClass *slave_class = GDM_SLAVE_CLASS (klass); - - object_class->finalize = gdm_product_slave_finalize; - - slave_class->start = gdm_product_slave_start; - slave_class->stop = gdm_product_slave_stop; - - g_type_class_add_private (klass, sizeof (GdmProductSlavePrivate)); - - dbus_g_object_type_install_info (GDM_TYPE_PRODUCT_SLAVE, &dbus_glib_gdm_product_slave_object_info); -} - -static void -gdm_product_slave_init (GdmProductSlave *slave) -{ - slave->priv = GDM_PRODUCT_SLAVE_GET_PRIVATE (slave); -} - -static void -gdm_product_slave_finalize (GObject *object) -{ - GdmProductSlave *slave; - - g_return_if_fail (object != NULL); - g_return_if_fail (GDM_IS_PRODUCT_SLAVE (object)); - - slave = GDM_PRODUCT_SLAVE (object); - - g_return_if_fail (slave->priv != NULL); - - gdm_product_slave_stop (GDM_SLAVE (slave)); - - g_free (slave->priv->relay_address); - - G_OBJECT_CLASS (gdm_product_slave_parent_class)->finalize (object); -} - -GdmSlave * -gdm_product_slave_new (const char *id) -{ - GObject *object; - - object = g_object_new (GDM_TYPE_PRODUCT_SLAVE, - "display-id", id, - NULL); - - return GDM_SLAVE (object); -} diff --git a/daemon/gdm-product-slave.h b/daemon/gdm-product-slave.h deleted file mode 100644 index ce0d9489..00000000 --- a/daemon/gdm-product-slave.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- - * - * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ - - -#ifndef __GDM_PRODUCT_SLAVE_H -#define __GDM_PRODUCT_SLAVE_H - -#include <glib-object.h> -#include "gdm-slave.h" - -G_BEGIN_DECLS - -#define GDM_TYPE_PRODUCT_SLAVE (gdm_product_slave_get_type ()) -#define GDM_PRODUCT_SLAVE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_PRODUCT_SLAVE, GdmProductSlave)) -#define GDM_PRODUCT_SLAVE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_PRODUCT_SLAVE, GdmProductSlaveClass)) -#define GDM_IS_PRODUCT_SLAVE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_PRODUCT_SLAVE)) -#define GDM_IS_PRODUCT_SLAVE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_PRODUCT_SLAVE)) -#define GDM_PRODUCT_SLAVE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_PRODUCT_SLAVE, GdmProductSlaveClass)) - -typedef struct GdmProductSlavePrivate GdmProductSlavePrivate; - -typedef struct -{ - GdmSlave parent; - GdmProductSlavePrivate *priv; -} GdmProductSlave; - -typedef struct -{ - GdmSlaveClass parent_class; -} GdmProductSlaveClass; - -GType gdm_product_slave_get_type (void); -GdmSlave * gdm_product_slave_new (const char *id); - -G_END_DECLS - -#endif /* __GDM_PRODUCT_SLAVE_H */ diff --git a/daemon/gdm-product-slave.xml b/daemon/gdm-product-slave.xml deleted file mode 100644 index d2eb2cae..00000000 --- a/daemon/gdm-product-slave.xml +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> -<node> - <interface name="org.gnome.DisplayManager.ProductSlave"> - </interface> -</node> diff --git a/daemon/gdm-session-relay.h b/daemon/gdm-session-relay.h deleted file mode 100644 index 5efd2bd3..00000000 --- a/daemon/gdm-session-relay.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- - * - * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ - - -#ifndef __GDM_SESSION_RELAY_H -#define __GDM_SESSION_RELAY_H - -#include <glib-object.h> - -#include "gdm-session.h" - -G_BEGIN_DECLS - -#define GDM_TYPE_SESSION_RELAY (gdm_session_relay_get_type ()) -#define GDM_SESSION_RELAY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_SESSION_RELAY, GdmSessionRelay)) -#define GDM_SESSION_RELAY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_SESSION_RELAY, GdmSessionRelayClass)) -#define GDM_IS_SESSION_RELAY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_SESSION_RELAY)) -#define GDM_IS_SESSION_RELAY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_SESSION_RELAY)) -#define GDM_SESSION_RELAY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_SESSION_RELAY, GdmSessionRelayClass)) - -typedef struct GdmSessionRelayPrivate GdmSessionRelayPrivate; - -typedef struct -{ - GObject parent; - GdmSessionRelayPrivate *priv; -} GdmSessionRelay; - -typedef struct -{ - GObjectClass parent_class; - - /* Signals */ - void (* connected) (GdmSessionRelay *session_relay); - void (* disconnected) (GdmSessionRelay *session_relay); -} GdmSessionRelayClass; - -GType gdm_session_relay_get_type (void); -GdmSessionRelay * gdm_session_relay_new (void); - -gboolean gdm_session_relay_start (GdmSessionRelay *session_relay); -gboolean gdm_session_relay_stop (GdmSessionRelay *session_relay); -char * gdm_session_relay_get_address (GdmSessionRelay *session_relay); - -G_END_DECLS - -#endif /* __GDM_SESSION_RELAY_H */ diff --git a/daemon/product-slave-main.c b/daemon/product-slave-main.c deleted file mode 100644 index b8e47555..00000000 --- a/daemon/product-slave-main.c +++ /dev/null @@ -1,270 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- - * - * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ - -#include "config.h" - -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <errno.h> -#include <string.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <signal.h> -#include <locale.h> - -#include <glib.h> -#include <glib/gi18n.h> -#include <glib-object.h> - -#define DBUS_API_SUBJECT_TO_CHANGE -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-lowlevel.h> - -#include "gdm-xerrors.h" -#include "gdm-signal-handler.h" -#include "gdm-log.h" -#include "gdm-common.h" -#include "gdm-product-slave.h" - -#include "gdm-settings.h" -#include "gdm-settings-direct.h" -#include "gdm-settings-keys.h" - -static GdmSettings *settings = NULL; -static int gdm_return_code = 0; - -static DBusGConnection * -get_system_bus (void) -{ - GError *error; - DBusGConnection *bus; - DBusConnection *connection; - - error = NULL; - bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); - if (bus == NULL) { - g_warning ("Couldn't connect to system bus: %s", - error->message); - g_error_free (error); - goto out; - } - - connection = dbus_g_connection_get_connection (bus); - dbus_connection_set_exit_on_disconnect (connection, FALSE); - - out: - return bus; -} - -static gboolean -signal_cb (int signo, - gpointer data) -{ - int ret; - - g_debug ("Got callback for signal %d", signo); - - ret = TRUE; - - switch (signo) { - case SIGSEGV: - case SIGBUS: - case SIGILL: - case SIGABRT: - g_debug ("Caught signal %d.", signo); - - ret = FALSE; - break; - - case SIGFPE: - case SIGPIPE: - /* let the fatal signals interrupt us */ - g_debug ("Caught signal %d, shutting down abnormally.", signo); - ret = FALSE; - - break; - - case SIGINT: - case SIGTERM: - /* let the fatal signals interrupt us */ - g_debug ("Caught signal %d, shutting down normally.", signo); - ret = FALSE; - - break; - - case SIGHUP: - g_debug ("Got HUP signal"); - /* FIXME: - * Reread config stuff like system config files, VPN service files, etc - */ - ret = TRUE; - - break; - - case SIGUSR1: - g_debug ("Got USR1 signal"); - /* we get this from xorg - can't use for anything else */ - ret = TRUE; - - break; - - case SIGUSR2: - g_debug ("Got USR2 signal"); - ret = TRUE; - - gdm_log_toggle_debug (); - - break; - - default: - g_debug ("Caught unhandled signal %d", signo); - ret = TRUE; - - break; - } - - return ret; -} - -static void -on_slave_stopped (GdmSlave *slave, - GMainLoop *main_loop) -{ - g_debug ("slave finished"); - gdm_return_code = 0; - g_main_loop_quit (main_loop); -} - -static gboolean -is_debug_set (void) -{ - gboolean debug = FALSE; - - /* enable debugging for unstable builds */ - if (gdm_is_version_unstable ()) { - return TRUE; - } - - gdm_settings_direct_get_boolean (GDM_KEY_DEBUG, &debug); - return debug; -} - -int -main (int argc, - char **argv) -{ - GMainLoop *main_loop; - GOptionContext *context; - DBusGConnection *connection; - GdmSlave *slave; - static char *display_id = NULL; - GdmSignalHandler *signal_handler; - static GOptionEntry entries [] = { - { "display-id", 0, 0, G_OPTION_ARG_STRING, &display_id, N_("Display ID"), N_("ID") }, - { NULL } - }; - - bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); - textdomain (GETTEXT_PACKAGE); - setlocale (LC_ALL, ""); - - g_type_init (); - - context = g_option_context_new (_("GNOME Display Manager Slave")); - g_option_context_add_main_entries (context, entries, NULL); - - g_option_context_parse (context, &argc, &argv, NULL); - g_option_context_free (context); - - connection = get_system_bus (); - if (connection == NULL) { - goto out; - } - - gdm_xerrors_init (); - gdm_log_init (); - - settings = gdm_settings_new (); - if (settings == NULL) { - g_warning ("Unable to initialize settings"); - goto out; - } - - if (! gdm_settings_direct_init (settings, DATADIR "/gdm/gdm.schemas", "/")) { - g_warning ("Unable to initialize settings"); - goto out; - } - - gdm_log_set_debug (is_debug_set ()); - - if (display_id == NULL) { - g_critical ("No display ID set"); - exit (1); - } - - main_loop = g_main_loop_new (NULL, FALSE); - - signal_handler = gdm_signal_handler_new (); - gdm_signal_handler_set_fatal_func (signal_handler, - (GDestroyNotify)g_main_loop_quit, - main_loop); - gdm_signal_handler_add (signal_handler, SIGTERM, signal_cb, NULL); - gdm_signal_handler_add (signal_handler, SIGINT, signal_cb, NULL); - gdm_signal_handler_add (signal_handler, SIGILL, signal_cb, NULL); - gdm_signal_handler_add (signal_handler, SIGBUS, signal_cb, NULL); - gdm_signal_handler_add (signal_handler, SIGFPE, signal_cb, NULL); - gdm_signal_handler_add (signal_handler, SIGHUP, signal_cb, NULL); - gdm_signal_handler_add (signal_handler, SIGSEGV, signal_cb, NULL); - gdm_signal_handler_add (signal_handler, SIGABRT, signal_cb, NULL); - gdm_signal_handler_add (signal_handler, SIGUSR1, signal_cb, NULL); - gdm_signal_handler_add (signal_handler, SIGUSR2, signal_cb, NULL); - - slave = gdm_product_slave_new (display_id); - if (slave == NULL) { - goto out; - } - g_signal_connect (slave, - "stopped", - G_CALLBACK (on_slave_stopped), - main_loop); - gdm_slave_start (slave); - - g_main_loop_run (main_loop); - - if (slave != NULL) { - g_object_unref (slave); - } - - if (signal_handler != NULL) { - g_object_unref (signal_handler); - } - - if (main_loop != NULL) { - g_main_loop_unref (main_loop); - } - - out: - - g_debug ("Slave finished"); - - return gdm_return_code; -} |