diff options
-rw-r--r-- | daemon/Makefile.am | 6 | ||||
-rw-r--r-- | daemon/gdm-display.c | 4 | ||||
-rw-r--r-- | daemon/gdm-manager.c | 49 | ||||
-rw-r--r-- | daemon/gdm-manager.xml | 14 | ||||
-rw-r--r-- | daemon/main.c | 258 | ||||
-rw-r--r-- | data/gdm.conf.in | 7 |
6 files changed, 116 insertions, 222 deletions
diff --git a/daemon/Makefile.am b/daemon/Makefile.am index 0ad4ea24..495fcb37 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -31,7 +31,6 @@ AM_CPPFLAGS = \ BUILT_SOURCES = \ gdm-slave-glue.h \ gdm-xdmcp-chooser-slave-glue.h \ - gdm-manager-glue.h \ gdm-display-glue.h \ gdm-xdmcp-display-glue.h \ gdm-static-display-glue.h \ @@ -40,9 +39,6 @@ BUILT_SOURCES = \ gdm-greeter-glue.h \ $(NULL) -gdm-manager-glue.h: gdm-manager.xml Makefile.am - dbus-binding-tool --prefix=gdm_manager --mode=glib-server --output=gdm-manager-glue.h $(srcdir)/gdm-manager.xml - gdm-display-glue.c gdm-display-glue.h: gdm-display.xml Makefile.am $(AM_V_GEN)gdbus-codegen \ --c-namespace=GdmDBus \ @@ -367,8 +363,6 @@ EXTRA_DIST = \ gdm-slave.xml \ gdm-simple-slave.xml \ gdm-xdmcp-chooser-slave.xml \ - gdm-session.xml \ - gdm-manager.xml \ gdm-display.xml \ gdm-xdmcp-display.xml \ gdm-static-display.xml \ diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c index 1cadc767..cc8b433c 100644 --- a/daemon/gdm-display.c +++ b/daemon/gdm-display.c @@ -1211,7 +1211,7 @@ register_display (GdmDisplay *display) } /* - dbus-send --system --print-reply --dest=org.gnome.DisplayManager /org/gnome/DisplayManager/Display1 org.freedesktop.DBus.Introspectable.Introspect + dbus-send --system --print-reply --dest=org.gnome.DisplayManager /org/gnome/DisplayManager/Displays/1 org.freedesktop.DBus.Introspectable.Introspect */ static GObject * @@ -1227,7 +1227,7 @@ gdm_display_constructor (GType type, construct_properties)); g_free (display->priv->id); - display->priv->id = g_strdup_printf ("/org/gnome/DisplayManager/Display%u", get_next_display_serial ()); + display->priv->id = g_strdup_printf ("/org/gnome/DisplayManager/Displays/%u", get_next_display_serial ()); res = register_display (display); if (! res) { diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c index 6cc38e47..4f548477 100644 --- a/daemon/gdm-manager.c +++ b/daemon/gdm-manager.c @@ -33,14 +33,10 @@ #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 "gdm-common.h" #include "gdm-manager.h" -#include "gdm-manager-glue.h" #include "gdm-display-store.h" #include "gdm-display-factory.h" #include "gdm-local-display-factory.h" @@ -49,7 +45,7 @@ #define GDM_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_MANAGER, GdmManagerPrivate)) #define GDM_DBUS_PATH "/org/gnome/DisplayManager" -#define GDM_MANAGER_DBUS_PATH GDM_DBUS_PATH "/Manager" +#define GDM_MANAGER_DBUS_PATH GDM_DBUS_PATH "/Displays" #define GDM_MANAGER_DBUS_NAME "org.gnome.DisplayManager.Manager" struct GdmManagerPrivate @@ -65,7 +61,9 @@ struct GdmManagerPrivate gboolean wait_for_go; gboolean no_console; - DBusGConnection *connection; + GDBusProxy *bus_proxy; + GDBusConnection *connection; + GDBusObjectManagerServer *object_manager; }; enum { @@ -99,6 +97,8 @@ on_display_removed (GdmDisplayStore *display_store, display = gdm_display_store_lookup (display_store, id); if (display != NULL) { + g_dbus_object_manager_server_unexport (manager->priv->object_manager, id); + g_signal_emit (manager, signals[DISPLAY_REMOVED], 0, id); } } @@ -113,6 +113,8 @@ on_display_added (GdmDisplayStore *display_store, display = gdm_display_store_lookup (display_store, id); if (display != NULL) { + g_dbus_object_manager_server_export (manager->priv->object_manager, + gdm_display_get_object_skeleton (display)); g_signal_emit (manager, signals[DISPLAY_ADDED], 0, id); } } @@ -143,8 +145,8 @@ listify_display_ids (const char *id, Example: dbus-send --system --dest=org.gnome.DisplayManager \ --type=method_call --print-reply --reply-timeout=2000 \ - /org/gnome/DisplayManager/Manager \ - org.gnome.DisplayManager.Manager.GetDisplays + /org/gnome/DisplayManager/Displays \ + org.freedesktop.ObjectManager.GetAll */ gboolean gdm_manager_get_displays (GdmManager *manager, @@ -230,18 +232,19 @@ static gboolean register_manager (GdmManager *manager) { GError *error = NULL; + GDBusObjectManagerServer *object_server; error = NULL; - manager->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); + manager->priv->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (manager->priv->connection == NULL) { - if (error != NULL) { - g_critical ("error getting system bus: %s", error->message); - g_error_free (error); - } + g_critical ("error getting system bus: %s", error->message); + g_error_free (error); exit (1); } - dbus_g_connection_register_g_object (manager->priv->connection, GDM_MANAGER_DBUS_PATH, G_OBJECT (manager)); + object_server = g_dbus_object_manager_server_new (GDM_MANAGER_DBUS_PATH); + g_dbus_object_manager_server_set_connection (object_server, manager->priv->connection); + manager->priv->object_manager = object_server; return TRUE; } @@ -375,8 +378,6 @@ gdm_manager_class_init (GdmManagerClass *klass) G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); g_type_class_add_private (klass, sizeof (GdmManagerPrivate)); - - dbus_g_object_type_install_info (GDM_TYPE_MANAGER, &dbus_glib_gdm_manager_object_info); } static void @@ -414,9 +415,6 @@ gdm_manager_finalize (GObject *object) g_clear_object (&manager->priv->xdmcp_factory); #endif g_clear_object (&manager->priv->local_factory); - g_clear_object (&manager->priv->connection); - - gdm_display_store_clear (manager->priv->display_store); g_signal_handlers_disconnect_by_func (G_OBJECT (manager->priv->display_store), G_CALLBACK (on_display_added), @@ -424,6 +422,19 @@ gdm_manager_finalize (GObject *object) g_signal_handlers_disconnect_by_func (G_OBJECT (manager->priv->display_store), G_CALLBACK (on_display_removed), manager); + + gdm_display_store_foreach (manager->priv->display_store, + (GdmDisplayStoreFunc)unexport_display, + manager); + gdm_display_store_clear (manager->priv->display_store); + + g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (manager)); + + g_dbus_object_manager_server_set_connection (manager->priv->object_manager, NULL); + + g_clear_object (&manager->priv->connection); + g_clear_object (&manager->priv->object_manager); + g_object_unref (manager->priv->display_store); G_OBJECT_CLASS (gdm_manager_parent_class)->finalize (object); diff --git a/daemon/gdm-manager.xml b/daemon/gdm-manager.xml deleted file mode 100644 index c59834e7..00000000 --- a/daemon/gdm-manager.xml +++ /dev/null @@ -1,14 +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 name="/org/gnome/DisplayManager/Manager"> - <interface name="org.gnome.DisplayManager.Manager"> - <method name="GetDisplays"> - <arg name="displays" direction="out" type="ao"/> - </method> - <signal name="DisplayAdded"> - <arg name="id" type="o"/> - </signal> - <signal name="DisplayRemoved"> - <arg name="id" type="o"/> - </signal> - </interface> -</node> diff --git a/daemon/main.c b/daemon/main.c index ea345336..0255c53b 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -38,10 +38,7 @@ #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 <gio/gio.h> #include "gdm-manager.h" #include "gdm-log.h" @@ -54,12 +51,13 @@ #define GDM_DBUS_NAME "org.gnome.DisplayManager" -static void bus_proxy_destroyed_cb (DBusGProxy *bus_proxy, - GdmManager **managerp); +static GDBusConnection *get_system_bus (void); +static gboolean bus_reconnect (void); extern char **environ; static GdmManager *manager = NULL; +static int name_id = -1; static GdmSettings *settings = NULL; static uid_t gdm_uid = -1; static gid_t gdm_gid = -1; @@ -71,76 +69,29 @@ timed_exit_cb (GMainLoop *loop) return FALSE; } -static DBusGProxy * -get_bus_proxy (DBusGConnection *connection) -{ - DBusGProxy *bus_proxy; - - bus_proxy = dbus_g_proxy_new_for_name (connection, - DBUS_SERVICE_DBUS, - DBUS_PATH_DBUS, - DBUS_INTERFACE_DBUS); - return bus_proxy; -} - -static gboolean -acquire_name_on_proxy (DBusGProxy *bus_proxy) +static void +bus_connection_closed (void) { - GError *error; - guint result; - gboolean res; - gboolean ret; - - ret = FALSE; - - if (bus_proxy == NULL) { - goto out; - } - - error = NULL; - res = dbus_g_proxy_call (bus_proxy, - "RequestName", - &error, - G_TYPE_STRING, GDM_DBUS_NAME, - G_TYPE_UINT, 0, - G_TYPE_INVALID, - G_TYPE_UINT, &result, - G_TYPE_INVALID); - if (! res) { - if (error != NULL) { - g_warning ("Failed to acquire %s: %s", GDM_DBUS_NAME, error->message); - g_error_free (error); - } else { - g_warning ("Failed to acquire %s", GDM_DBUS_NAME); - } - goto out; - } + g_debug ("Disconnected from D-Bus"); - if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { - if (error != NULL) { - g_warning ("Failed to acquire %s: %s", GDM_DBUS_NAME, error->message); - g_error_free (error); - } else { - g_warning ("Failed to acquire %s", GDM_DBUS_NAME); - } - goto out; + if (manager == NULL) { + /* probably shutting down or something */ + return; } - ret = TRUE; + g_clear_object (&manager); - out: - return ret; + g_timeout_add_seconds (3, (GSourceFunc)bus_reconnect, NULL); } -static DBusGConnection * +static GDBusConnection * get_system_bus (void) { GError *error; - DBusGConnection *bus; - DBusConnection *connection; + GDBusConnection *bus; error = NULL; - bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); + bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (bus == NULL) { g_warning ("Couldn't connect to system bus: %s", error->message); @@ -148,76 +99,14 @@ get_system_bus (void) goto out; } - connection = dbus_g_connection_get_connection (bus); - dbus_connection_set_exit_on_disconnect (connection, FALSE); + g_signal_connect (bus, "closed", + G_CALLBACK (bus_connection_closed), NULL); + g_dbus_connection_set_exit_on_close (bus, FALSE); out: return bus; } -static gboolean -bus_reconnect (GdmManager *manager) -{ - DBusGConnection *bus; - DBusGProxy *bus_proxy; - gboolean ret; - - ret = TRUE; - - bus = get_system_bus (); - if (bus == NULL) { - goto out; - } - - bus_proxy = get_bus_proxy (bus); - if (bus_proxy == NULL) { - g_warning ("Could not construct bus_proxy object; will retry"); - goto out; - } - - if (! acquire_name_on_proxy (bus_proxy) ) { - g_warning ("Could not acquire name; will retry"); - goto out; - } - - manager = gdm_manager_new (); - if (manager == NULL) { - g_warning ("Could not construct manager object"); - exit (1); - } - - g_signal_connect (bus_proxy, - "destroy", - G_CALLBACK (bus_proxy_destroyed_cb), - &manager); - - g_debug ("Successfully reconnected to D-Bus"); - - gdm_manager_start (manager); - - ret = FALSE; - - out: - return ret; -} - -static void -bus_proxy_destroyed_cb (DBusGProxy *bus_proxy, - GdmManager **managerp) -{ - g_debug ("Disconnected from D-Bus"); - - if (managerp == NULL || *managerp == NULL) { - /* probably shutting down or something */ - return; - } - - g_object_unref (*managerp); - *managerp = NULL; - - g_timeout_add_seconds (3, (GSourceFunc)bus_reconnect, managerp); -} - static void delete_pid (void) { @@ -527,12 +416,9 @@ main (int argc, { GMainLoop *main_loop; GOptionContext *context; - DBusGProxy *bus_proxy; - DBusGConnection *connection; GError *error; int ret; gboolean res; - gboolean xdmcp_enabled; GdmSignalHandler *signal_handler; static gboolean do_timed_exit = FALSE; static gboolean print_version = FALSE; @@ -579,22 +465,6 @@ main (int argc, g_log_set_always_fatal (fatal_mask); } - connection = get_system_bus (); - if (connection == NULL) { - goto out; - } - - bus_proxy = get_bus_proxy (connection); - if (bus_proxy == NULL) { - g_warning ("Could not construct bus_proxy object; bailing out"); - goto out; - } - - if (! acquire_name_on_proxy (bus_proxy) ) { - g_warning ("Could not acquire name; bailing out"); - goto out; - } - gdm_log_init (); settings = gdm_settings_new (); @@ -623,27 +493,15 @@ main (int argc, exit (-1); } + /* Connect to the bus, own the name and start the manager */ + bus_reconnect (); + /* pid file */ delete_pid (); write_pid (); g_chdir (AUTHDIR); - manager = gdm_manager_new (); - - if (manager == NULL) { - goto out; - } - - xdmcp_enabled = FALSE; - gdm_settings_direct_get_boolean (GDM_KEY_XDMCP_ENABLE, &xdmcp_enabled); - gdm_manager_set_xdmcp_enabled (manager, xdmcp_enabled); - - g_signal_connect (bus_proxy, - "destroy", - G_CALLBACK (bus_proxy_destroyed_cb), - &manager); - main_loop = g_main_loop_new (NULL, FALSE); signal_handler = gdm_signal_handler_new (); @@ -661,23 +519,13 @@ main (int argc, g_timeout_add_seconds (30, (GSourceFunc) timed_exit_cb, main_loop); } - gdm_manager_start (manager); - g_main_loop_run (main_loop); g_debug ("GDM finished, cleaning up..."); - if (manager != NULL) { - g_object_unref (manager); - } - - if (settings != NULL) { - g_object_unref (settings); - } - - if (signal_handler != NULL) { - g_object_unref (signal_handler); - } + g_clear_object (&manager); + g_clear_object (&settings); + g_clear_object (&signal_handler); gdm_settings_direct_shutdown (); gdm_log_shutdown (); @@ -690,3 +538,61 @@ main (int argc, return ret; } + +static void +on_name_acquired (GDBusConnection *bus, + const char *name, + gpointer user_data) +{ + gboolean xdmcp_enabled; + + manager = gdm_manager_new (); + if (manager == NULL) { + g_warning ("Could not construct manager object"); + exit (1); + } + + g_debug ("Successfully connected to D-Bus"); + + gdm_manager_start (manager); + + xdmcp_enabled = FALSE; + gdm_settings_direct_get_boolean (GDM_KEY_XDMCP_ENABLE, &xdmcp_enabled); + gdm_manager_set_xdmcp_enabled (manager, xdmcp_enabled); +} + +static void +on_name_lost (GDBusConnection *bus, + const char *name, + gpointer user_data) +{ + g_debug ("Lost GDM name on bus"); + + bus_connection_closed (); +} + +static gboolean +bus_reconnect () +{ + GDBusConnection *bus; + gboolean ret; + + ret = TRUE; + + bus = get_system_bus (); + if (bus == NULL) { + goto out; + } + + name_id = g_bus_own_name_on_connection (bus, + GDM_DBUS_NAME, + G_BUS_NAME_OWNER_FLAGS_NONE, + on_name_acquired, + on_name_lost, + NULL, + NULL); + + ret = FALSE; + out: + return ret; +} diff --git a/data/gdm.conf.in b/data/gdm.conf.in index c3e28f50..0ee28d05 100644 --- a/data/gdm.conf.in +++ b/data/gdm.conf.in @@ -39,6 +39,8 @@ <allow send_destination="org.gnome.DisplayManager" send_interface="org.freedesktop.DBus.Introspectable"/> <allow send_destination="org.gnome.DisplayManager" + send_interface="org.freedesktop.DBus.ObjectManager"/> + <allow send_destination="org.gnome.DisplayManager" send_interface="org.gnome.DisplayManager.Display" send_member="GetId"/> <allow send_destination="org.gnome.DisplayManager" @@ -60,11 +62,6 @@ <allow send_destination="org.gnome.DisplayManager" send_interface="org.gnome.DisplayManager.LocalDisplayFactory" send_member="CreateTransientDisplay"/> - - <allow send_destination="org.gnome.DisplayManager" - send_interface="org.gnome.DisplayManager.Manager" - send_member="GetDisplays"/> - </policy> <policy user="@GDM_USERNAME@"> |