From 816e36cf5d34930e2e6cba24ad2828026547b2d7 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Thu, 30 Aug 2018 14:12:54 +1200 Subject: Use more modern *_get_instance_private() method for storing private data --- src/Makefile.am | 3 +- src/accounts.c | 38 ++-- src/accounts.h | 5 +- src/display-manager-service.c | 169 ++++++++------- src/display-manager-service.h | 5 +- src/display-manager.c | 50 +++-- src/display-manager.h | 5 +- src/display-server.c | 20 +- src/display-server.h | 5 +- src/greeter-session.c | 22 +- src/greeter-session.h | 5 +- src/greeter-socket.c | 76 ++++--- src/greeter-socket.h | 5 +- src/greeter.c | 331 ++++++++++++++++------------- src/greeter.h | 5 +- src/login1.c | 149 +++++++------ src/login1.h | 10 +- src/process.c | 161 ++++++++------ src/process.h | 5 +- src/seat-local.c | 118 ++++++----- src/seat-local.h | 5 +- src/seat-unity.c | 118 ++++++----- src/seat-unity.h | 5 +- src/seat-xdmcp-session.c | 26 ++- src/seat-xdmcp-session.h | 5 +- src/seat-xremote.h | 2 +- src/seat-xvnc.c | 25 ++- src/seat-xvnc.h | 5 +- src/seat.c | 301 ++++++++++++++++---------- src/seat.h | 5 +- src/session-config.c | 47 +++-- src/session-config.h | 5 +- src/session.c | 475 ++++++++++++++++++++++++------------------ src/session.h | 5 +- src/shared-data-manager.c | 37 ++-- src/shared-data-manager.h | 5 +- src/unity-system-compositor.c | 240 +++++++++++---------- src/unity-system-compositor.h | 5 +- src/vnc-server.c | 46 ++-- src/vnc-server.h | 5 +- src/wayland-session.c | 30 +-- src/wayland-session.h | 5 +- src/x-authority.c | 121 ++++++----- src/x-authority.h | 3 - src/x-server-local.c | 239 +++++++++++---------- src/x-server-local.h | 5 +- src/x-server-remote.c | 11 +- src/x-server-remote.h | 5 +- src/x-server-xmir.c | 63 +++--- src/x-server-xmir.h | 5 +- src/x-server-xvnc.c | 42 ++-- src/x-server-xvnc.h | 5 +- src/x-server.c | 70 ++++--- src/x-server.h | 5 +- src/xdmcp-server.c | 246 ++++++++++++---------- src/xdmcp-server.h | 5 +- src/xdmcp-session-private.h | 39 ---- src/xdmcp-session.c | 74 ++++--- src/xdmcp-session.h | 13 +- tests/src/x-authority.c | 91 ++++---- tests/src/x-authority.h | 6 - tests/src/x-server.c | 76 ++++--- tests/src/x-server.h | 13 +- tests/src/xdmcp-client.c | 52 +++-- tests/src/xdmcp-client.h | 10 +- 65 files changed, 2105 insertions(+), 1683 deletions(-) delete mode 100644 src/xdmcp-session-private.h diff --git a/src/Makefile.am b/src/Makefile.am index e4501975..98468e70 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -76,8 +76,7 @@ lightdm_SOURCES = \ xdmcp-server.c \ xdmcp-server.h \ xdmcp-session.c \ - xdmcp-session.h \ - xdmcp-session-private.h + xdmcp-session.h lightdm_CFLAGS = \ $(WARN_CFLAGS) \ diff --git a/src/accounts.c b/src/accounts.c index ee5ec8e0..2f2c263f 100644 --- a/src/accounts.c +++ b/src/accounts.c @@ -16,11 +16,11 @@ #include "accounts.h" #include "user-list.h" -struct UserPrivate +typedef struct { /* Internal user object */ CommonUser *common_user; -}; +} UserPrivate; G_DEFINE_TYPE_WITH_PRIVATE (User, user, G_TYPE_OBJECT) @@ -34,7 +34,8 @@ accounts_get_user_by_name (const gchar *username) return NULL; User *user = g_object_new (USER_TYPE, NULL); - user->priv->common_user = common_user; + UserPrivate *priv = user_get_instance_private (user); + priv->common_user = common_user; return user; } @@ -51,78 +52,87 @@ accounts_get_current_user () const gchar * user_get_name (User *user) { + UserPrivate *priv = user_get_instance_private (user); g_return_val_if_fail (user != NULL, NULL); - return common_user_get_name (user->priv->common_user); + return common_user_get_name (priv->common_user); } uid_t user_get_uid (User *user) { + UserPrivate *priv = user_get_instance_private (user); g_return_val_if_fail (user != NULL, 0); - return common_user_get_uid (user->priv->common_user); + return common_user_get_uid (priv->common_user); } gid_t user_get_gid (User *user) { + UserPrivate *priv = user_get_instance_private (user); g_return_val_if_fail (user != NULL, 0); - return common_user_get_gid (user->priv->common_user); + return common_user_get_gid (priv->common_user); } const gchar * user_get_home_directory (User *user) { + UserPrivate *priv = user_get_instance_private (user); g_return_val_if_fail (user != NULL, NULL); - return common_user_get_home_directory (user->priv->common_user); + return common_user_get_home_directory (priv->common_user); } const gchar * user_get_shell (User *user) { + UserPrivate *priv = user_get_instance_private (user); g_return_val_if_fail (user != NULL, NULL); - return common_user_get_shell (user->priv->common_user); + return common_user_get_shell (priv->common_user); } void user_set_language (User *user, const gchar *language) { + UserPrivate *priv = user_get_instance_private (user); g_return_if_fail (user != NULL); - common_user_set_language (user->priv->common_user, language); + common_user_set_language (priv->common_user, language); } const gchar * user_get_language (User *user) { + UserPrivate *priv = user_get_instance_private (user); g_return_val_if_fail (user != NULL, NULL); - return common_user_get_language (user->priv->common_user); + return common_user_get_language (priv->common_user); } void user_set_xsession (User *user, const gchar *xsession) { + UserPrivate *priv = user_get_instance_private (user); g_return_if_fail (user != NULL); - common_user_set_session (user->priv->common_user, xsession); + common_user_set_session (priv->common_user, xsession); } const gchar * user_get_xsession (User *user) { + UserPrivate *priv = user_get_instance_private (user); g_return_val_if_fail (user != NULL, NULL); - return common_user_get_session (user->priv->common_user); + return common_user_get_session (priv->common_user); } static void user_init (User *user) { - user->priv = G_TYPE_INSTANCE_GET_PRIVATE (user, USER_TYPE, UserPrivate); } static void user_finalize (GObject *object) { User *self = USER (object); + UserPrivate *priv = user_get_instance_private (self); - g_clear_object (&self->priv->common_user); + g_clear_object (&priv->common_user); G_OBJECT_CLASS (user_parent_class)->finalize (object); } diff --git a/src/accounts.h b/src/accounts.h index e6bf4e47..67142ca7 100644 --- a/src/accounts.h +++ b/src/accounts.h @@ -21,12 +21,9 @@ G_BEGIN_DECLS #define USER_TYPE (user_get_type()) #define USER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), USER_TYPE, User)); -typedef struct UserPrivate UserPrivate; - typedef struct { - GObject parent_instance; - UserPrivate *priv; + GObject parent_instance; } User; typedef struct diff --git a/src/display-manager-service.c b/src/display-manager-service.c index c3f14e99..f25392bc 100644 --- a/src/display-manager-service.c +++ b/src/display-manager-service.c @@ -20,7 +20,7 @@ enum { }; static guint signals[LAST_SIGNAL] = { 0 }; -struct DisplayManagerServicePrivate +typedef struct { /* Display manager being exposed on D-Bus */ DisplayManager *manager; @@ -45,7 +45,7 @@ struct DisplayManagerServicePrivate /* Bus entries for seats / session */ GHashTable *seat_bus_entries; GHashTable *session_bus_entries; -}; +} DisplayManagerServicePrivate; G_DEFINE_TYPE_WITH_PRIVATE (DisplayManagerService, display_manager_service, G_TYPE_OBJECT) @@ -71,7 +71,9 @@ DisplayManagerService * display_manager_service_new (DisplayManager *manager) { DisplayManagerService *service = g_object_new (DISPLAY_MANAGER_SERVICE_TYPE, NULL); - service->priv->manager = g_object_ref (manager); + DisplayManagerServicePrivate *priv = display_manager_service_get_instance_private (service); + + priv->manager = g_object_ref (manager); return service; } @@ -153,11 +155,13 @@ session_bus_entry_free (gpointer data) static GVariant * get_seat_list (DisplayManagerService *service) { + DisplayManagerServicePrivate *priv = display_manager_service_get_instance_private (service); + GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE ("ao")); GHashTableIter iter; - g_hash_table_iter_init (&iter, service->priv->seat_bus_entries); + g_hash_table_iter_init (&iter, priv->seat_bus_entries); gpointer value; while (g_hash_table_iter_next (&iter, NULL, &value)) { @@ -171,11 +175,13 @@ get_seat_list (DisplayManagerService *service) static GVariant * get_session_list (DisplayManagerService *service, const gchar *seat_path) { + DisplayManagerServicePrivate *priv = display_manager_service_get_instance_private (service); + GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE ("ao")); GHashTableIter iter; - g_hash_table_iter_init (&iter, service->priv->session_bus_entries); + g_hash_table_iter_init (&iter, priv->session_bus_entries); gpointer value; while (g_hash_table_iter_next (&iter, NULL, &value)) { @@ -217,6 +223,7 @@ handle_display_manager_call (GDBusConnection *connection, gpointer user_data) { DisplayManagerService *service = user_data; + DisplayManagerServicePrivate *priv = display_manager_service_get_instance_private (service); if (g_strcmp0 (method_name, "AddSeat") == 0) g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "AddSeat is deprecated"); @@ -239,7 +246,7 @@ handle_display_manager_call (GDBusConnection *connection, g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Unable to create local X seat"); return; } - SeatBusEntry *entry = g_hash_table_lookup (service->priv->seat_bus_entries, seat); + SeatBusEntry *entry = g_hash_table_lookup (priv->seat_bus_entries, seat); g_dbus_method_invocation_return_value (invocation, g_variant_new ("(o)", entry->path)); } else @@ -337,7 +344,9 @@ handle_seat_call (GDBusConnection *connection, static Seat * get_seat_for_session (DisplayManagerService *service, Session *session) { - for (GList *seat_link = display_manager_get_seats (service->priv->manager); seat_link; seat_link = seat_link->next) + DisplayManagerServicePrivate *priv = display_manager_service_get_instance_private (service); + + for (GList *seat_link = display_manager_get_seats (priv->manager); seat_link; seat_link = seat_link->next) { Seat *seat = seat_link->data; @@ -401,16 +410,18 @@ handle_session_call (GDBusConnection *connection, static void running_user_session_cb (Seat *seat, Session *session, DisplayManagerService *service) { + DisplayManagerServicePrivate *priv = display_manager_service_get_instance_private (service); + /* Set environment variables when session runs */ - SeatBusEntry *seat_entry = g_hash_table_lookup (service->priv->seat_bus_entries, seat); + SeatBusEntry *seat_entry = g_hash_table_lookup (priv->seat_bus_entries, seat); session_set_env (session, "XDG_SEAT_PATH", seat_entry->path); - g_autofree gchar *path = g_strdup_printf ("/org/freedesktop/DisplayManager/Session%d", service->priv->session_index); - service->priv->session_index++; + g_autofree gchar *path = g_strdup_printf ("/org/freedesktop/DisplayManager/Session%d", priv->session_index); + priv->session_index++; session_set_env (session, "XDG_SESSION_PATH", path); g_object_set_data_full (G_OBJECT (session), "XDG_SESSION_PATH", g_steal_pointer (&path), g_free); SessionBusEntry *session_entry = session_bus_entry_new (service, session, g_object_get_data (G_OBJECT (session), "XDG_SESSION_PATH"), seat_entry ? seat_entry->path : NULL); - g_hash_table_insert (service->priv->session_bus_entries, g_object_ref (session), session_entry); + g_hash_table_insert (priv->session_bus_entries, g_object_ref (session), session_entry); g_debug ("Registering session with bus path %s", session_entry->path); @@ -420,54 +431,58 @@ running_user_session_cb (Seat *seat, Session *session, DisplayManagerService *se handle_session_get_property }; g_autoptr(GError) error = NULL; - session_entry->bus_id = g_dbus_connection_register_object (service->priv->bus, + session_entry->bus_id = g_dbus_connection_register_object (priv->bus, session_entry->path, - service->priv->session_info->interfaces[0], + priv->session_info->interfaces[0], &session_vtable, session_entry, NULL, &error); if (session_entry->bus_id == 0) g_warning ("Failed to register user session: %s", error->message); - emit_object_value_changed (service->priv->bus, "/org/freedesktop/DisplayManager", "org.freedesktop.DisplayManager", "Sessions", get_session_list (service, NULL)); - emit_object_signal (service->priv->bus, "/org/freedesktop/DisplayManager", "SessionAdded", session_entry->path); + emit_object_value_changed (priv->bus, "/org/freedesktop/DisplayManager", "org.freedesktop.DisplayManager", "Sessions", get_session_list (service, NULL)); + emit_object_signal (priv->bus, "/org/freedesktop/DisplayManager", "SessionAdded", session_entry->path); - emit_object_value_changed (service->priv->bus, seat_entry->path, "org.freedesktop.DisplayManager.Seat", "Sessions", get_session_list (service, session_entry->seat_path)); - emit_object_signal (service->priv->bus, seat_entry->path, "SessionAdded", session_entry->path); + emit_object_value_changed (priv->bus, seat_entry->path, "org.freedesktop.DisplayManager.Seat", "Sessions", get_session_list (service, session_entry->seat_path)); + emit_object_signal (priv->bus, seat_entry->path, "SessionAdded", session_entry->path); } static void session_removed_cb (Seat *seat, Session *session, DisplayManagerService *service) { + DisplayManagerServicePrivate *priv = display_manager_service_get_instance_private (service); + g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); - SessionBusEntry *entry = g_hash_table_lookup (service->priv->session_bus_entries, session); + SessionBusEntry *entry = g_hash_table_lookup (priv->session_bus_entries, session); g_autofree gchar *seat_path = NULL; if (entry) { - g_dbus_connection_unregister_object (service->priv->bus, entry->bus_id); - emit_object_signal (service->priv->bus, "/org/freedesktop/DisplayManager", "SessionRemoved", entry->path); - emit_object_signal (service->priv->bus, entry->seat_path, "SessionRemoved", entry->path); + g_dbus_connection_unregister_object (priv->bus, entry->bus_id); + emit_object_signal (priv->bus, "/org/freedesktop/DisplayManager", "SessionRemoved", entry->path); + emit_object_signal (priv->bus, entry->seat_path, "SessionRemoved", entry->path); seat_path = g_strdup (entry->seat_path); } - g_hash_table_remove (service->priv->session_bus_entries, session); + g_hash_table_remove (priv->session_bus_entries, session); if (seat_path) { - emit_object_value_changed (service->priv->bus, "/org/freedesktop/DisplayManager", "org.freedesktop.DisplayManager", "Sessions", get_session_list (service, NULL)); - emit_object_value_changed (service->priv->bus, seat_path, "org.freedesktop.DisplayManager.Seat", "Sessions", get_session_list (service, seat_path)); + emit_object_value_changed (priv->bus, "/org/freedesktop/DisplayManager", "org.freedesktop.DisplayManager", "Sessions", get_session_list (service, NULL)); + emit_object_value_changed (priv->bus, seat_path, "org.freedesktop.DisplayManager.Seat", "Sessions", get_session_list (service, seat_path)); } } static void seat_added_cb (DisplayManager *display_manager, Seat *seat, DisplayManagerService *service) { - g_autofree gchar *path = g_strdup_printf ("/org/freedesktop/DisplayManager/Seat%d", service->priv->seat_index); - service->priv->seat_index++; + DisplayManagerServicePrivate *priv = display_manager_service_get_instance_private (service); + + g_autofree gchar *path = g_strdup_printf ("/org/freedesktop/DisplayManager/Seat%d", priv->seat_index); + priv->seat_index++; SeatBusEntry *entry = seat_bus_entry_new (service, seat, path); - g_hash_table_insert (service->priv->seat_bus_entries, g_object_ref (seat), entry); + g_hash_table_insert (priv->seat_bus_entries, g_object_ref (seat), entry); g_debug ("Registering seat with bus path %s", entry->path); @@ -477,17 +492,17 @@ seat_added_cb (DisplayManager *display_manager, Seat *seat, DisplayManagerServic handle_seat_get_property }; g_autoptr(GError) error = NULL; - entry->bus_id = g_dbus_connection_register_object (service->priv->bus, + entry->bus_id = g_dbus_connection_register_object (priv->bus, entry->path, - service->priv->seat_info->interfaces[0], + priv->seat_info->interfaces[0], &seat_vtable, entry, NULL, &error); if (entry->bus_id == 0) g_warning ("Failed to register seat: %s", error->message); - emit_object_value_changed (service->priv->bus, "/org/freedesktop/DisplayManager", "org.freedesktop.DisplayManager", "Seats", get_seat_list (service)); - emit_object_signal (service->priv->bus, "/org/freedesktop/DisplayManager", "SeatAdded", entry->path); + emit_object_value_changed (priv->bus, "/org/freedesktop/DisplayManager", "org.freedesktop.DisplayManager", "Seats", get_seat_list (service)); + emit_object_signal (priv->bus, "/org/freedesktop/DisplayManager", "SeatAdded", entry->path); g_signal_connect (seat, SEAT_SIGNAL_RUNNING_USER_SESSION, G_CALLBACK (running_user_session_cb), service); g_signal_connect (seat, SEAT_SIGNAL_SESSION_REMOVED, G_CALLBACK (session_removed_cb), service); @@ -496,16 +511,18 @@ seat_added_cb (DisplayManager *display_manager, Seat *seat, DisplayManagerServic static void seat_removed_cb (DisplayManager *display_manager, Seat *seat, DisplayManagerService *service) { - SeatBusEntry *entry = g_hash_table_lookup (service->priv->seat_bus_entries, seat); + DisplayManagerServicePrivate *priv = display_manager_service_get_instance_private (service); + + SeatBusEntry *entry = g_hash_table_lookup (priv->seat_bus_entries, seat); if (entry) { - g_dbus_connection_unregister_object (service->priv->bus, entry->bus_id); - emit_object_signal (service->priv->bus, "/org/freedesktop/DisplayManager", "SeatRemoved", entry->path); + g_dbus_connection_unregister_object (priv->bus, entry->bus_id); + emit_object_signal (priv->bus, "/org/freedesktop/DisplayManager", "SeatRemoved", entry->path); } - g_hash_table_remove (service->priv->seat_bus_entries, seat); + g_hash_table_remove (priv->seat_bus_entries, seat); - emit_object_value_changed (service->priv->bus, "/org/freedesktop/DisplayManager", "org.freedesktop.DisplayManager", "Seats", get_seat_list (service)); + emit_object_value_changed (priv->bus, "/org/freedesktop/DisplayManager", "org.freedesktop.DisplayManager", "Seats", get_seat_list (service)); } static void @@ -514,10 +531,11 @@ bus_acquired_cb (GDBusConnection *connection, gpointer user_data) { DisplayManagerService *service = user_data; + DisplayManagerServicePrivate *priv = display_manager_service_get_instance_private (service); g_debug ("Acquired bus name %s", name); - service->priv->bus = g_object_ref (connection); + priv->bus = g_object_ref (connection); const gchar *display_manager_interface = "" @@ -573,8 +591,8 @@ bus_acquired_cb (GDBusConnection *connection, " " " " ""; - service->priv->seat_info = g_dbus_node_info_new_for_xml (seat_interface, NULL); - g_assert (service->priv->seat_info != NULL); + priv->seat_info = g_dbus_node_info_new_for_xml (seat_interface, NULL); + g_assert (priv->seat_info != NULL); const gchar *session_interface = "" @@ -584,8 +602,8 @@ bus_acquired_cb (GDBusConnection *connection, " " " " ""; - service->priv->session_info = g_dbus_node_info_new_for_xml (session_interface, NULL); - g_assert (service->priv->session_info != NULL); + priv->session_info = g_dbus_node_info_new_for_xml (session_interface, NULL); + g_assert (priv->session_info != NULL); static const GDBusInterfaceVTable display_manager_vtable = { @@ -593,21 +611,21 @@ bus_acquired_cb (GDBusConnection *connection, handle_display_manager_get_property }; g_autoptr(GError) error = NULL; - service->priv->reg_id = g_dbus_connection_register_object (connection, - "/org/freedesktop/DisplayManager", - display_manager_info->interfaces[0], - &display_manager_vtable, - service, NULL, - &error); - if (service->priv->reg_id == 0) + priv->reg_id = g_dbus_connection_register_object (connection, + "/org/freedesktop/DisplayManager", + display_manager_info->interfaces[0], + &display_manager_vtable, + service, NULL, + &error); + if (priv->reg_id == 0) g_warning ("Failed to register display manager: %s", error->message); g_dbus_node_info_unref (display_manager_info); /* Add objects for existing seats and listen to new ones */ - g_signal_connect (service->priv->manager, DISPLAY_MANAGER_SIGNAL_SEAT_ADDED, G_CALLBACK (seat_added_cb), service); - g_signal_connect (service->priv->manager, DISPLAY_MANAGER_SIGNAL_SEAT_REMOVED, G_CALLBACK (seat_removed_cb), service); - for (GList *link = display_manager_get_seats (service->priv->manager); link; link = link->next) - seat_added_cb (service->priv->manager, (Seat *) link->data, service); + g_signal_connect (priv->manager, DISPLAY_MANAGER_SIGNAL_SEAT_ADDED, G_CALLBACK (seat_added_cb), service); + g_signal_connect (priv->manager, DISPLAY_MANAGER_SIGNAL_SEAT_REMOVED, G_CALLBACK (seat_removed_cb), service); + for (GList *link = display_manager_get_seats (priv->manager); link; link = link->next) + seat_added_cb (priv->manager, (Seat *) link->data, service); g_signal_emit (service, signals[READY], 0); } @@ -630,42 +648,45 @@ name_lost_cb (GDBusConnection *connection, void display_manager_service_start (DisplayManagerService *service) { + DisplayManagerServicePrivate *priv = display_manager_service_get_instance_private (service); + g_return_if_fail (service != NULL); g_debug ("Using D-Bus name %s", LIGHTDM_BUS_NAME); - service->priv->bus_id = g_bus_own_name (getuid () == 0 ? G_BUS_TYPE_SYSTEM : G_BUS_TYPE_SESSION, - LIGHTDM_BUS_NAME, - G_BUS_NAME_OWNER_FLAGS_NONE, - bus_acquired_cb, - NULL, - name_lost_cb, - service, - NULL); + priv->bus_id = g_bus_own_name (getuid () == 0 ? G_BUS_TYPE_SYSTEM : G_BUS_TYPE_SESSION, + LIGHTDM_BUS_NAME, + G_BUS_NAME_OWNER_FLAGS_NONE, + bus_acquired_cb, + NULL, + name_lost_cb, + service, + NULL); } static void display_manager_service_init (DisplayManagerService *service) { - service->priv = G_TYPE_INSTANCE_GET_PRIVATE (service, DISPLAY_MANAGER_SERVICE_TYPE, DisplayManagerServicePrivate); - service->priv->seat_bus_entries = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, seat_bus_entry_free); - service->priv->session_bus_entries = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, session_bus_entry_free); + DisplayManagerServicePrivate *priv = display_manager_service_get_instance_private (service); + priv->seat_bus_entries = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, seat_bus_entry_free); + priv->session_bus_entries = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, session_bus_entry_free); } static void display_manager_service_finalize (GObject *object) { DisplayManagerService *self = DISPLAY_MANAGER_SERVICE (object); - - g_dbus_connection_unregister_object (self->priv->bus, self->priv->reg_id); - g_bus_unown_name (self->priv->bus_id); - if (self->priv->seat_info) - g_dbus_node_info_unref (self->priv->seat_info); - if (self->priv->session_info) - g_dbus_node_info_unref (self->priv->session_info); - g_hash_table_unref (self->priv->seat_bus_entries); - g_hash_table_unref (self->priv->session_bus_entries); - g_object_unref (self->priv->bus); - g_clear_object (&self->priv->manager); + DisplayManagerServicePrivate *priv = display_manager_service_get_instance_private (self); + + g_dbus_connection_unregister_object (priv->bus, priv->reg_id); + g_bus_unown_name (priv->bus_id); + if (priv->seat_info) + g_dbus_node_info_unref (priv->seat_info); + if (priv->session_info) + g_dbus_node_info_unref (priv->session_info); + g_hash_table_unref (priv->seat_bus_entries); + g_hash_table_unref (priv->session_bus_entries); + g_object_unref (priv->bus); + g_clear_object (&priv->manager); G_OBJECT_CLASS (display_manager_service_parent_class)->finalize (object); } diff --git a/src/display-manager-service.h b/src/display-manager-service.h index 65dba65a..e7559ad0 100644 --- a/src/display-manager-service.h +++ b/src/display-manager-service.h @@ -24,12 +24,9 @@ G_BEGIN_DECLS #define DISPLAY_MANAGER_SERVICE_SIGNAL_ADD_XLOCAL_SEAT "add-xlocal-seat" #define DISPLAY_MANAGER_SERVICE_SIGNAL_NAME_LOST "name-lost" -typedef struct DisplayManagerServicePrivate DisplayManagerServicePrivate; - typedef struct { - GObject parent_instance; - DisplayManagerServicePrivate *priv; + GObject parent_instance; } DisplayManagerService; typedef struct diff --git a/src/display-manager.c b/src/display-manager.c index 7cc64af9..f5cc0afa 100644 --- a/src/display-manager.c +++ b/src/display-manager.c @@ -30,7 +30,7 @@ enum { }; static guint signals[LAST_SIGNAL] = { 0 }; -struct DisplayManagerPrivate +typedef struct { /* The seats available */ GList *seats; @@ -40,7 +40,7 @@ struct DisplayManagerPrivate /* TRUE if stopped */ gboolean stopped; -}; +} DisplayManagerPrivate; G_DEFINE_TYPE_WITH_PRIVATE (DisplayManager, display_manager, G_TYPE_OBJECT) @@ -53,13 +53,16 @@ display_manager_new (void) GList * display_manager_get_seats (DisplayManager *manager) { - return manager->priv->seats; + DisplayManagerPrivate *priv = display_manager_get_instance_private (manager); + return priv->seats; } Seat * display_manager_get_seat (DisplayManager *manager, const gchar *name) { - for (GList *link = manager->priv->seats; link; link = link->next) + DisplayManagerPrivate *priv = display_manager_get_instance_private (manager); + + for (GList *link = priv->seats; link; link = link->next) { Seat *seat = link->data; @@ -73,11 +76,13 @@ display_manager_get_seat (DisplayManager *manager, const gchar *name) static void check_stopped (DisplayManager *manager) { - if (manager->priv->stopping && - !manager->priv->stopped && - g_list_length (manager->priv->seats) == 0) + DisplayManagerPrivate *priv = display_manager_get_instance_private (manager); + + if (priv->stopping && + !priv->stopped && + g_list_length (priv->seats) == 0) { - manager->priv->stopped = TRUE; + priv->stopped = TRUE; g_debug ("Display manager stopped"); g_signal_emit (manager, signals[STOPPED], 0); } @@ -86,10 +91,12 @@ check_stopped (DisplayManager *manager) static void seat_stopped_cb (Seat *seat, DisplayManager *manager) { - manager->priv->seats = g_list_remove (manager->priv->seats, seat); + DisplayManagerPrivate *priv = display_manager_get_instance_private (manager); + + priv->seats = g_list_remove (priv->seats, seat); g_signal_handlers_disconnect_matched (seat, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, manager); - if (!manager->priv->stopping) + if (!priv->stopping) g_signal_emit (manager, signals[SEAT_REMOVED], 0, seat); g_object_unref (seat); @@ -100,15 +107,15 @@ seat_stopped_cb (Seat *seat, DisplayManager *manager) gboolean display_manager_add_seat (DisplayManager *manager, Seat *seat) { - gboolean result; + DisplayManagerPrivate *priv = display_manager_get_instance_private (manager); - g_return_val_if_fail (!manager->priv->stopping, FALSE); + g_return_val_if_fail (!priv->stopping, FALSE); - result = seat_start (SEAT (seat)); + gboolean result = seat_start (SEAT (seat)); if (!result) return FALSE; - manager->priv->seats = g_list_append (manager->priv->seats, g_object_ref (seat)); + priv->seats = g_list_append (priv->seats, g_object_ref (seat)); g_signal_connect (seat, SEAT_SIGNAL_STOPPED, G_CALLBACK (seat_stopped_cb), manager); g_signal_emit (manager, signals[SEAT_ADDED], 0, seat); @@ -131,17 +138,19 @@ display_manager_start (DisplayManager *manager) void display_manager_stop (DisplayManager *manager) { + DisplayManagerPrivate *priv = display_manager_get_instance_private (manager); + g_return_if_fail (manager != NULL); - if (manager->priv->stopping) + if (priv->stopping) return; g_debug ("Stopping display manager"); - manager->priv->stopping = TRUE; + priv->stopping = TRUE; /* Stop all the seats. Copy the list as it might be modified if a seat stops during this loop */ - GList *seats = g_list_copy (manager->priv->seats); + GList *seats = g_list_copy (priv->seats); for (GList *link = seats; link; link = link->next) { Seat *seat = link->data; @@ -155,8 +164,6 @@ display_manager_stop (DisplayManager *manager) static void display_manager_init (DisplayManager *manager) { - manager->priv = G_TYPE_INSTANCE_GET_PRIVATE (manager, DISPLAY_MANAGER_TYPE, DisplayManagerPrivate); - /* Load the seat modules */ seat_register_module ("local", SEAT_LOCAL_TYPE); seat_register_module ("xremote", SEAT_XREMOTE_TYPE); @@ -167,13 +174,14 @@ static void display_manager_finalize (GObject *object) { DisplayManager *self = DISPLAY_MANAGER (object); + DisplayManagerPrivate *priv = display_manager_get_instance_private (self); - for (GList *link = self->priv->seats; link; link = link->next) + for (GList *link = priv->seats; link; link = link->next) { Seat *seat = link->data; g_signal_handlers_disconnect_matched (seat, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); } - g_list_free_full (self->priv->seats, g_object_unref); + g_list_free_full (priv->seats, g_object_unref); G_OBJECT_CLASS (display_manager_parent_class)->finalize (object); } diff --git a/src/display-manager.h b/src/display-manager.h index bc3ec517..1877645f 100644 --- a/src/display-manager.h +++ b/src/display-manager.h @@ -25,12 +25,9 @@ G_BEGIN_DECLS #define DISPLAY_MANAGER_SIGNAL_SEAT_REMOVED "seat-removed" #define DISPLAY_MANAGER_SIGNAL_STOPPED "stopped" -typedef struct DisplayManagerPrivate DisplayManagerPrivate; - typedef struct { - GObject parent_instance; - DisplayManagerPrivate *priv; + GObject parent_instance; } DisplayManager; typedef struct diff --git a/src/display-server.c b/src/display-server.c index b746affc..3d56c9d9 100644 --- a/src/display-server.c +++ b/src/display-server.c @@ -20,7 +20,7 @@ enum { }; static guint signals[LAST_SIGNAL] = { 0 }; -struct DisplayServerPrivate +typedef struct { /* TRUE when started */ gboolean is_ready; @@ -30,7 +30,7 @@ struct DisplayServerPrivate /* TRUE when the display server has stopped */ gboolean stopped; -}; +} DisplayServerPrivate; static void display_server_logger_iface_init (LoggerInterface *iface); @@ -93,14 +93,16 @@ display_server_start (DisplayServer *server) gboolean display_server_get_is_ready (DisplayServer *server) { + DisplayServerPrivate *priv = display_server_get_instance_private (server); g_return_val_if_fail (server != NULL, FALSE); - return server->priv->is_ready; + return priv->is_ready; } static gboolean display_server_real_start (DisplayServer *server) { - server->priv->is_ready = TRUE; + DisplayServerPrivate *priv = display_server_get_instance_private (server); + priv->is_ready = TRUE; g_signal_emit (server, signals[READY], 0); return TRUE; } @@ -130,11 +132,13 @@ display_server_real_disconnect_session (DisplayServer *server, Session *session) void display_server_stop (DisplayServer *server) { + DisplayServerPrivate *priv = display_server_get_instance_private (server); + g_return_if_fail (server != NULL); - if (server->priv->stopping) + if (priv->stopping) return; - server->priv->stopping = TRUE; + priv->stopping = TRUE; DISPLAY_SERVER_GET_CLASS (server)->stop (server); } @@ -142,8 +146,9 @@ display_server_stop (DisplayServer *server) gboolean display_server_get_is_stopping (DisplayServer *server) { + DisplayServerPrivate *priv = display_server_get_instance_private (server); g_return_val_if_fail (server != NULL, FALSE); - return server->priv->stopping; + return priv->stopping; } static void @@ -155,7 +160,6 @@ display_server_real_stop (DisplayServer *server) static void display_server_init (DisplayServer *server) { - server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, DISPLAY_SERVER_TYPE, DisplayServerPrivate); } static void diff --git a/src/display-server.h b/src/display-server.h index 08eb7b4e..34c43713 100644 --- a/src/display-server.h +++ b/src/display-server.h @@ -29,12 +29,9 @@ G_BEGIN_DECLS #define DISPLAY_SERVER_SIGNAL_READY "ready" #define DISPLAY_SERVER_SIGNAL_STOPPED "stopped" -typedef struct DisplayServerPrivate DisplayServerPrivate; - struct DisplayServer { - GObject parent_instance; - DisplayServerPrivate *priv; + GObject parent_instance; }; typedef struct diff --git a/src/greeter-session.c b/src/greeter-session.c index 93552f51..845cfa05 100644 --- a/src/greeter-session.c +++ b/src/greeter-session.c @@ -17,11 +17,11 @@ #include "greeter-session.h" -struct GreeterSessionPrivate +typedef struct { /* Greeter running inside this session */ Greeter *greeter; -}; +} GreeterSessionPrivate; G_DEFINE_TYPE_WITH_PRIVATE (GreeterSession, greeter_session, SESSION_TYPE) @@ -34,14 +34,15 @@ greeter_session_new (void) Greeter * greeter_session_get_greeter (GreeterSession *session) { + GreeterSessionPrivate *priv = greeter_session_get_instance_private (session); g_return_val_if_fail (session != NULL, NULL); - return session->priv->greeter; + return priv->greeter; } static gboolean greeter_session_start (Session *session) { - GreeterSession *s = GREETER_SESSION (session); + GreeterSessionPrivate *priv = greeter_session_get_instance_private (GREETER_SESSION (session)); /* Create a pipe to talk with the greeter */ int to_greeter_pipe[2], from_greeter_pipe[2]; @@ -55,7 +56,7 @@ greeter_session_start (Session *session) int to_greeter_output = to_greeter_pipe[0]; int from_greeter_input = from_greeter_pipe[1]; int from_greeter_output = from_greeter_pipe[0]; - greeter_set_file_descriptors (s->priv->greeter, to_greeter_input, from_greeter_output); + greeter_set_file_descriptors (priv->greeter, to_greeter_input, from_greeter_output); /* Don't allow the daemon end of the pipes to be accessed in child processes */ fcntl (to_greeter_input, F_SETFD, FD_CLOEXEC); @@ -79,9 +80,9 @@ greeter_session_start (Session *session) static void greeter_session_stop (Session *session) { - GreeterSession *s = GREETER_SESSION (session); + GreeterSessionPrivate *priv = greeter_session_get_instance_private (GREETER_SESSION (session)); - greeter_stop (s->priv->greeter); + greeter_stop (priv->greeter); SESSION_CLASS (greeter_session_parent_class)->stop (session); } @@ -89,16 +90,17 @@ greeter_session_stop (Session *session) static void greeter_session_init (GreeterSession *session) { - session->priv = G_TYPE_INSTANCE_GET_PRIVATE (session, GREETER_SESSION_TYPE, GreeterSessionPrivate); - session->priv->greeter = greeter_new (); + GreeterSessionPrivate *priv = greeter_session_get_instance_private (session); + priv->greeter = greeter_new (); } static void greeter_session_finalize (GObject *object) { GreeterSession *self = GREETER_SESSION (object); + GreeterSessionPrivate *priv = greeter_session_get_instance_private (self); - g_clear_object (&self->priv->greeter); + g_clear_object (&priv->greeter); G_OBJECT_CLASS (greeter_session_parent_class)->finalize (object); } diff --git a/src/greeter-session.h b/src/greeter-session.h index ea43da2d..a5cccf62 100644 --- a/src/greeter-session.h +++ b/src/greeter-session.h @@ -23,12 +23,9 @@ G_BEGIN_DECLS #define GREETER_SESSION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GREETER_SESSION_TYPE, GreeterSessionClass)) #define IS_GREETER_SESSION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GREETER_SESSION_TYPE)) -typedef struct GreeterSessionPrivate GreeterSessionPrivate; - typedef struct { - Session parent_instance; - GreeterSessionPrivate *priv; + Session parent_instance; } GreeterSession; typedef struct diff --git a/src/greeter-socket.c b/src/greeter-socket.c index 94ba1d19..7400b932 100644 --- a/src/greeter-socket.c +++ b/src/greeter-socket.c @@ -23,7 +23,7 @@ enum { }; static guint signals[LAST_SIGNAL] = { 0 }; -struct GreeterSocketPrivate +typedef struct { /* Path of socket to use */ gchar *path; @@ -39,7 +39,7 @@ struct GreeterSocketPrivate /* Greeter connected on this socket */ Greeter *greeter; -}; +} GreeterSocketPrivate; G_DEFINE_TYPE_WITH_PRIVATE (GreeterSocket, greeter_socket, G_TYPE_OBJECT) @@ -47,7 +47,9 @@ GreeterSocket * greeter_socket_new (const gchar *path) { GreeterSocket *socket = g_object_new (GREETER_SOCKET_TYPE, NULL); - socket->priv->path = g_strdup (path); + GreeterSocketPrivate *priv = greeter_socket_get_instance_private (socket); + + priv->path = g_strdup (path); return socket; } @@ -55,34 +57,38 @@ greeter_socket_new (const gchar *path) static void greeter_disconnected_cb (Greeter *greeter, GreeterSocket *socket) { - if (greeter == socket->priv->greeter) + GreeterSocketPrivate *priv = greeter_socket_get_instance_private (socket); + + if (greeter == priv->greeter) { - g_clear_object (&socket->priv->greeter); - g_clear_object (&socket->priv->greeter_socket); + g_clear_object (&priv->greeter); + g_clear_object (&priv->greeter_socket); } } static gboolean greeter_connect_cb (GSocket *s, GIOCondition condition, GreeterSocket *socket) { + GreeterSocketPrivate *priv = greeter_socket_get_instance_private (socket); + g_autoptr(GError) error = NULL; - g_autoptr(GSocket) new_socket = g_socket_accept (socket->priv->socket, NULL, &error); + g_autoptr(GSocket) new_socket = g_socket_accept (priv->socket, NULL, &error); if (error) g_warning ("Failed to accept greeter connection: %s", error->message); if (!new_socket) return G_SOURCE_CONTINUE; /* Greeter already connected */ - if (socket->priv->greeter) + if (priv->greeter) { g_socket_close (new_socket, NULL); return G_SOURCE_CONTINUE; } - socket->priv->greeter_socket = g_steal_pointer (&new_socket); - g_signal_emit (socket, signals[CREATE_GREETER], 0, &socket->priv->greeter); - g_signal_connect (socket->priv->greeter, GREETER_SIGNAL_DISCONNECTED, G_CALLBACK (greeter_disconnected_cb), socket); - greeter_set_file_descriptors (socket->priv->greeter, g_socket_get_fd (socket->priv->greeter_socket), g_socket_get_fd (socket->priv->greeter_socket)); + priv->greeter_socket = g_steal_pointer (&new_socket); + g_signal_emit (socket, signals[CREATE_GREETER], 0, &priv->greeter); + g_signal_connect (priv->greeter, GREETER_SIGNAL_DISCONNECTED, G_CALLBACK (greeter_disconnected_cb), socket); + greeter_set_file_descriptors (priv->greeter, g_socket_get_fd (priv->greeter_socket), g_socket_get_fd (priv->greeter_socket)); return G_SOURCE_CONTINUE; } @@ -90,34 +96,36 @@ greeter_connect_cb (GSocket *s, GIOCondition condition, GreeterSocket *socket) gboolean greeter_socket_start (GreeterSocket *socket, GError **error) { + GreeterSocketPrivate *priv = greeter_socket_get_instance_private (socket); + g_return_val_if_fail (socket != NULL, FALSE); - g_return_val_if_fail (socket->priv->socket == NULL, FALSE); + g_return_val_if_fail (priv->socket == NULL, FALSE); - socket->priv->socket = g_socket_new (G_SOCKET_FAMILY_UNIX, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_DEFAULT, error); - if (!socket->priv->socket) + priv->socket = g_socket_new (G_SOCKET_FAMILY_UNIX, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_DEFAULT, error); + if (!priv->socket) return FALSE; - unlink (socket->priv->path); - g_autoptr(GSocketAddress) address = g_unix_socket_address_new (socket->priv->path); - gboolean result = g_socket_bind (socket->priv->socket, address, FALSE, error); + unlink (priv->path); + g_autoptr(GSocketAddress) address = g_unix_socket_address_new (priv->path); + gboolean result = g_socket_bind (priv->socket, address, FALSE, error); if (!result) return FALSE; - if (!g_socket_listen (socket->priv->socket, error)) + if (!g_socket_listen (priv->socket, error)) return FALSE; - socket->priv->source = g_socket_create_source (socket->priv->socket, G_IO_IN, NULL); - g_source_set_callback (socket->priv->source, (GSourceFunc) greeter_connect_cb, socket, NULL); - g_source_attach (socket->priv->source, NULL); + priv->source = g_socket_create_source (priv->socket, G_IO_IN, NULL); + g_source_set_callback (priv->source, (GSourceFunc) greeter_connect_cb, socket, NULL); + g_source_attach (priv->source, NULL); /* Allow to be written to */ - if (chmod (socket->priv->path, S_IRWXU | S_IRWXG | S_IRWXO) < 0) + if (chmod (priv->path, S_IRWXU | S_IRWXG | S_IRWXO) < 0) { g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (errno), "Failed to set permissions on greeter socket %s: %s", - socket->priv->path, - g_strerror (errno)); + priv->path, + g_strerror (errno)); return FALSE; } @@ -127,21 +135,21 @@ greeter_socket_start (GreeterSocket *socket, GError **error) static void greeter_socket_init (GreeterSocket *socket) { - socket->priv = G_TYPE_INSTANCE_GET_PRIVATE (socket, GREETER_SOCKET_TYPE, GreeterSocketPrivate); } static void greeter_socket_finalize (GObject *object) { GreeterSocket *self = GREETER_SOCKET (object); - - if (self->priv->path) - unlink (self->priv->path); - g_clear_pointer (&self->priv->path, g_free); - g_clear_object (&self->priv->socket); - g_clear_object (&self->priv->source); - g_clear_object (&self->priv->greeter_socket); - g_clear_object (&self->priv->greeter); + GreeterSocketPrivate *priv = greeter_socket_get_instance_private (self); + + if (priv->path) + unlink (priv->path); + g_clear_pointer (&priv->path, g_free); + g_clear_object (&priv->socket); + g_clear_object (&priv->source); + g_clear_object (&priv->greeter_socket); + g_clear_object (&priv->greeter); G_OBJECT_CLASS (greeter_socket_parent_class)->finalize (object); } diff --git a/src/greeter-socket.h b/src/greeter-socket.h index da490bad..de1c508d 100644 --- a/src/greeter-socket.h +++ b/src/greeter-socket.h @@ -25,12 +25,9 @@ G_BEGIN_DECLS #define GREETER_SOCKET_SIGNAL_CREATE_GREETER "create-greeter" -typedef struct GreeterSocketPrivate GreeterSocketPrivate; - typedef struct { - GObject parent_instance; - GreeterSocketPrivate *priv; + GObject parent_instance; } GreeterSocket; typedef struct diff --git a/src/greeter.c b/src/greeter.c index c3423967..383e1f89 100644 --- a/src/greeter.c +++ b/src/greeter.c @@ -31,7 +31,7 @@ enum { }; static guint signals[LAST_SIGNAL] = { 0 }; -struct GreeterPrivate +typedef struct { /* PAM service to authenticate with */ gchar *pam_service; @@ -81,7 +81,7 @@ struct GreeterPrivate GIOChannel *to_greeter_channel; GIOChannel *from_greeter_channel; guint from_greeter_watch; -}; +} GreeterPrivate; G_DEFINE_TYPE_WITH_PRIVATE (Greeter, greeter, G_TYPE_OBJECT) @@ -125,71 +125,80 @@ greeter_new (void) void greeter_set_file_descriptors (Greeter *greeter, int to_greeter_fd, int from_greeter_fd) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); + g_return_if_fail (greeter != NULL); - g_return_if_fail (greeter->priv->to_greeter_input < 0); - g_return_if_fail (greeter->priv->from_greeter_output < 0); + g_return_if_fail (priv->to_greeter_input < 0); + g_return_if_fail (priv->from_greeter_output < 0); - greeter->priv->to_greeter_input = to_greeter_fd; - greeter->priv->to_greeter_channel = g_io_channel_unix_new (greeter->priv->to_greeter_input); + priv->to_greeter_input = to_greeter_fd; + priv->to_greeter_channel = g_io_channel_unix_new (priv->to_greeter_input); g_autoptr(GError) to_error = NULL; - g_io_channel_set_encoding (greeter->priv->to_greeter_channel, NULL, &to_error); + g_io_channel_set_encoding (priv->to_greeter_channel, NULL, &to_error); if (to_error) g_warning ("Failed to set encoding on to greeter channel to binary: %s\n", to_error->message); - greeter->priv->from_greeter_output = from_greeter_fd; - greeter->priv->from_greeter_channel = g_io_channel_unix_new (greeter->priv->from_greeter_output); + priv->from_greeter_output = from_greeter_fd; + priv->from_greeter_channel = g_io_channel_unix_new (priv->from_greeter_output); g_autoptr(GError) from_error = NULL; - g_io_channel_set_encoding (greeter->priv->from_greeter_channel, NULL, &from_error); + g_io_channel_set_encoding (priv->from_greeter_channel, NULL, &from_error); if (from_error) g_warning ("Failed to set encoding on from greeter channel to binary: %s\n", from_error->message); - g_io_channel_set_buffered (greeter->priv->from_greeter_channel, FALSE); + g_io_channel_set_buffered (priv->from_greeter_channel, FALSE); - greeter->priv->from_greeter_watch = g_io_add_watch (greeter->priv->from_greeter_channel, G_IO_IN | G_IO_HUP, read_cb, greeter); + priv->from_greeter_watch = g_io_add_watch (priv->from_greeter_channel, G_IO_IN | G_IO_HUP, read_cb, greeter); } void greeter_stop (Greeter *greeter) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); + /* Stop any events occurring after we've stopped */ - if (greeter->priv->authentication_session) - g_signal_handlers_disconnect_matched (greeter->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter); + if (priv->authentication_session) + g_signal_handlers_disconnect_matched (priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter); } void greeter_set_pam_services (Greeter *greeter, const gchar *pam_service, const gchar *autologin_pam_service) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); g_return_if_fail (greeter != NULL); - g_free (greeter->priv->pam_service); - greeter->priv->pam_service = g_strdup (pam_service); - g_free (greeter->priv->autologin_pam_service); - greeter->priv->autologin_pam_service = g_strdup (autologin_pam_service); + g_free (priv->pam_service); + priv->pam_service = g_strdup (pam_service); + g_free (priv->autologin_pam_service); + priv->autologin_pam_service = g_strdup (autologin_pam_service); } void greeter_set_allow_guest (Greeter *greeter, gboolean allow_guest) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); g_return_if_fail (greeter != NULL); - greeter->priv->allow_guest = allow_guest; + priv->allow_guest = allow_guest; } void greeter_clear_hints (Greeter *greeter) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); g_return_if_fail (greeter != NULL); - g_hash_table_remove_all (greeter->priv->hints); + g_hash_table_remove_all (priv->hints); } void greeter_set_hint (Greeter *greeter, const gchar *name, const gchar *value) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); g_return_if_fail (greeter != NULL); - g_hash_table_insert (greeter->priv->hints, g_strdup (name), g_strdup (value)); + g_hash_table_insert (priv->hints, g_strdup (name), g_strdup (value)); } static void * secure_malloc (Greeter *greeter, size_t n) { - if (greeter->priv->use_secure_memory) + GreeterPrivate *priv = greeter_get_instance_private (greeter); + if (priv->use_secure_memory) return gcry_malloc_secure (n); else return g_malloc (n); @@ -198,7 +207,8 @@ secure_malloc (Greeter *greeter, size_t n) static void * secure_realloc (Greeter *greeter, void *ptr, size_t n) { - if (greeter->priv->use_secure_memory) + GreeterPrivate *priv = greeter_get_instance_private (greeter); + if (priv->use_secure_memory) return gcry_realloc (ptr, n); else return g_realloc (ptr, n); @@ -207,7 +217,8 @@ secure_realloc (Greeter *greeter, void *ptr, size_t n) static void secure_free (Greeter *greeter, void *ptr) { - if (greeter->priv->use_secure_memory) + GreeterPrivate *priv = greeter_get_instance_private (greeter); + if (priv->use_secure_memory) return gcry_free (ptr); else return g_free (ptr); @@ -233,6 +244,8 @@ int_length (void) static void write_message (Greeter *greeter, guint8 *message, gsize message_length) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); + gchar *data = (gchar *) message; gsize data_length = message_length; while (data_length > 0) @@ -241,7 +254,7 @@ write_message (Greeter *greeter, guint8 *message, gsize message_length) gsize n_written; g_autoptr(GError) error = NULL; - status = g_io_channel_write_chars (greeter->priv->to_greeter_channel, data, data_length, &n_written, &error); + status = g_io_channel_write_chars (priv->to_greeter_channel, data, data_length, &n_written, &error); if (error) g_warning ("Error writing to greeter: %s", error->message); if (status != G_IO_STATUS_NORMAL) @@ -251,7 +264,7 @@ write_message (Greeter *greeter, guint8 *message, gsize message_length) } g_autoptr(GError) error = NULL; - g_io_channel_flush (greeter->priv->to_greeter_channel, &error); + g_io_channel_flush (priv->to_greeter_channel, &error); if (error) g_warning ("Failed to flush data to greeter: %s", error->message); } @@ -305,14 +318,16 @@ string_length (const gchar *value) static void handle_connect (Greeter *greeter, const gchar *version, gboolean resettable, guint32 api_version) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); + g_debug ("Greeter connected version=%s api=%u resettable=%s", version, api_version, resettable ? "true" : "false"); - greeter->priv->api_version = api_version; - greeter->priv->resettable = resettable; + priv->api_version = api_version; + priv->resettable = resettable; guint32 env_length = 0; GHashTableIter iter; - g_hash_table_iter_init (&iter, greeter->priv->hints); + g_hash_table_iter_init (&iter, priv->hints); gpointer key, value; while (g_hash_table_iter_next (&iter, &key, &value)) env_length += string_length (key) + string_length (value); @@ -323,7 +338,7 @@ handle_connect (Greeter *greeter, const gchar *version, gboolean resettable, gui { write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_CONNECTED, string_length (VERSION) + env_length, &offset); write_string (message, MAX_MESSAGE_LENGTH, VERSION, &offset); - g_hash_table_iter_init (&iter, greeter->priv->hints); + g_hash_table_iter_init (&iter, priv->hints); while (g_hash_table_iter_next (&iter, &key, &value)) { write_string (message, MAX_MESSAGE_LENGTH, key, &offset); @@ -335,8 +350,8 @@ handle_connect (Greeter *greeter, const gchar *version, gboolean resettable, gui write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_CONNECTED_V2, string_length (VERSION) + int_length () * 2 + env_length, &offset); write_int (message, MAX_MESSAGE_LENGTH, api_version <= API_VERSION ? api_version : API_VERSION, &offset); write_string (message, MAX_MESSAGE_LENGTH, VERSION, &offset); - write_int (message, MAX_MESSAGE_LENGTH, g_hash_table_size (greeter->priv->hints), &offset); - g_hash_table_iter_init (&iter, greeter->priv->hints); + write_int (message, MAX_MESSAGE_LENGTH, g_hash_table_size (priv->hints), &offset); + g_hash_table_iter_init (&iter, priv->hints); while (g_hash_table_iter_next (&iter, &key, &value)) { write_string (message, MAX_MESSAGE_LENGTH, key, &offset); @@ -351,6 +366,8 @@ handle_connect (Greeter *greeter, const gchar *version, gboolean resettable, gui static void pam_messages_cb (Session *session, Greeter *greeter) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); + const struct pam_message *messages = session_get_messages (session); int messages_length = session_get_messages_length (session); @@ -363,7 +380,7 @@ pam_messages_cb (Session *session, Greeter *greeter) guint8 message[MAX_MESSAGE_LENGTH]; gsize offset = 0; write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_PROMPT_AUTHENTICATION, size, &offset); - write_int (message, MAX_MESSAGE_LENGTH, greeter->priv->authentication_sequence_number, &offset); + write_int (message, MAX_MESSAGE_LENGTH, priv->authentication_sequence_number, &offset); write_string (message, MAX_MESSAGE_LENGTH, session_get_username (session), &offset); write_int (message, MAX_MESSAGE_LENGTH, messages_length, &offset); int n_prompts = 0; @@ -383,7 +400,7 @@ pam_messages_cb (Session *session, Greeter *greeter) { struct pam_response *response; response = calloc (messages_length, sizeof (struct pam_response)); - session_respond (greeter->priv->authentication_session, response); + session_respond (priv->authentication_session, response); free (response); } } @@ -412,10 +429,12 @@ greeter_idle (Greeter *greeter) void greeter_reset (Greeter *greeter) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); + g_return_if_fail (greeter != NULL); GHashTableIter iter; - g_hash_table_iter_init (&iter, greeter->priv->hints); + g_hash_table_iter_init (&iter, priv->hints); gpointer key, value; guint32 length = 0; while (g_hash_table_iter_next (&iter, &key, &value)) @@ -424,7 +443,7 @@ greeter_reset (Greeter *greeter) guint8 message[MAX_MESSAGE_LENGTH]; gsize offset = 0; write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_RESET, length, &offset); - g_hash_table_iter_init (&iter, greeter->priv->hints); + g_hash_table_iter_init (&iter, priv->hints); while (g_hash_table_iter_next (&iter, &key, &value)) { write_string (message, MAX_MESSAGE_LENGTH, key, &offset); @@ -436,6 +455,8 @@ greeter_reset (Greeter *greeter) static void authentication_complete_cb (Session *session, Greeter *greeter) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); + g_debug ("Authenticate result for user %s: %s", session_get_username (session), session_get_authentication_result_string (session)); int result = session_get_authentication_result (session); @@ -450,27 +471,31 @@ authentication_complete_cb (Session *session, Greeter *greeter) } } - send_end_authentication (greeter, greeter->priv->authentication_sequence_number, session_get_username (session), result); + send_end_authentication (greeter, priv->authentication_sequence_number, session_get_username (session), result); } static void reset_session (Greeter *greeter) { - g_free (greeter->priv->remote_session); - greeter->priv->remote_session = NULL; - if (greeter->priv->authentication_session) + GreeterPrivate *priv = greeter_get_instance_private (greeter); + + g_free (priv->remote_session); + priv->remote_session = NULL; + if (priv->authentication_session) { - g_signal_handlers_disconnect_matched (greeter->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter); - session_stop (greeter->priv->authentication_session); - g_clear_object (&greeter->priv->authentication_session); + g_signal_handlers_disconnect_matched (priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter); + session_stop (priv->authentication_session); + g_clear_object (&priv->authentication_session); } - greeter->priv->guest_account_authenticated = FALSE; + priv->guest_account_authenticated = FALSE; } static void handle_authenticate (Greeter *greeter, guint32 sequence_number, const gchar *username) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); + if (username[0] == '\0') { g_debug ("Greeter start authentication"); @@ -481,60 +506,62 @@ handle_authenticate (Greeter *greeter, guint32 sequence_number, const gchar *use reset_session (greeter); - if (greeter->priv->active_username) - g_free (greeter->priv->active_username); - greeter->priv->active_username = g_strdup (username); + if (priv->active_username) + g_free (priv->active_username); + priv->active_username = g_strdup (username); g_object_notify (G_OBJECT (greeter), GREETER_PROPERTY_ACTIVE_USERNAME); - greeter->priv->authentication_sequence_number = sequence_number; - g_signal_emit (greeter, signals[CREATE_SESSION], 0, &greeter->priv->authentication_session); - if (!greeter->priv->authentication_session) + priv->authentication_sequence_number = sequence_number; + g_signal_emit (greeter, signals[CREATE_SESSION], 0, &priv->authentication_session); + if (!priv->authentication_session) { send_end_authentication (greeter, sequence_number, "", PAM_USER_UNKNOWN); return; } - g_signal_connect (G_OBJECT (greeter->priv->authentication_session), SESSION_SIGNAL_GOT_MESSAGES, G_CALLBACK (pam_messages_cb), greeter); - g_signal_connect (G_OBJECT (greeter->priv->authentication_session), SESSION_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (authentication_complete_cb), greeter); + g_signal_connect (G_OBJECT (priv->authentication_session), SESSION_SIGNAL_GOT_MESSAGES, G_CALLBACK (pam_messages_cb), greeter); + g_signal_connect (G_OBJECT (priv->authentication_session), SESSION_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (authentication_complete_cb), greeter); /* Use non-interactive service for autologin user */ - const gchar *autologin_username = g_hash_table_lookup (greeter->priv->hints, "autologin-user"); + const gchar *autologin_username = g_hash_table_lookup (priv->hints, "autologin-user"); const gchar *service; gboolean is_interactive; if (autologin_username != NULL && g_strcmp0 (username, autologin_username) == 0) { - service = greeter->priv->autologin_pam_service; + service = priv->autologin_pam_service; is_interactive = FALSE; } else { - service = greeter->priv->pam_service; + service = priv->pam_service; is_interactive = TRUE; } /* Run the session process */ - session_set_pam_service (greeter->priv->authentication_session, service); - session_set_username (greeter->priv->authentication_session, username); - session_set_do_authenticate (greeter->priv->authentication_session, TRUE); - session_set_is_interactive (greeter->priv->authentication_session, is_interactive); - session_start (greeter->priv->authentication_session); + session_set_pam_service (priv->authentication_session, service); + session_set_username (priv->authentication_session, username); + session_set_do_authenticate (priv->authentication_session, TRUE); + session_set_is_interactive (priv->authentication_session, is_interactive); + session_start (priv->authentication_session); } static void handle_authenticate_as_guest (Greeter *greeter, guint32 sequence_number) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); + g_debug ("Greeter start authentication for guest account"); reset_session (greeter); - if (!greeter->priv->allow_guest) + if (!priv->allow_guest) { g_debug ("Guest account is disabled"); send_end_authentication (greeter, sequence_number, "", PAM_USER_UNKNOWN); return; } - greeter->priv->guest_account_authenticated = TRUE; + priv->guest_account_authenticated = TRUE; send_end_authentication (greeter, sequence_number, "", PAM_SUCCESS); } @@ -566,6 +593,8 @@ get_remote_session_service (const gchar *session_name) static void handle_authenticate_remote (Greeter *greeter, const gchar *session_name, const gchar *username, guint32 sequence_number) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); + if (username[0] == '\0') { g_debug ("Greeter start authentication for remote session %s", session_name); @@ -583,24 +612,24 @@ handle_authenticate_remote (Greeter *greeter, const gchar *session_name, const g return; } - greeter->priv->authentication_sequence_number = sequence_number; - greeter->priv->remote_session = g_strdup (session_name); - g_signal_emit (greeter, signals[CREATE_SESSION], 0, &greeter->priv->authentication_session); - if (greeter->priv->authentication_session) + priv->authentication_sequence_number = sequence_number; + priv->remote_session = g_strdup (session_name); + g_signal_emit (greeter, signals[CREATE_SESSION], 0, &priv->authentication_session); + if (priv->authentication_session) { - g_signal_connect (G_OBJECT (greeter->priv->authentication_session), SESSION_SIGNAL_GOT_MESSAGES, G_CALLBACK (pam_messages_cb), greeter); - g_signal_connect (G_OBJECT (greeter->priv->authentication_session), SESSION_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (authentication_complete_cb), greeter); + g_signal_connect (G_OBJECT (priv->authentication_session), SESSION_SIGNAL_GOT_MESSAGES, G_CALLBACK (pam_messages_cb), greeter); + g_signal_connect (G_OBJECT (priv->authentication_session), SESSION_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (authentication_complete_cb), greeter); /* Run the session process */ - session_set_pam_service (greeter->priv->authentication_session, service); - session_set_username (greeter->priv->authentication_session, username); - session_set_do_authenticate (greeter->priv->authentication_session, TRUE); - session_set_is_interactive (greeter->priv->authentication_session, TRUE); - session_set_is_guest (greeter->priv->authentication_session, TRUE); - session_start (greeter->priv->authentication_session); + session_set_pam_service (priv->authentication_session, service); + session_set_username (priv->authentication_session, username); + session_set_do_authenticate (priv->authentication_session, TRUE); + session_set_is_interactive (priv->authentication_session, TRUE); + session_set_is_guest (priv->authentication_session, TRUE); + session_start (priv->authentication_session); } - if (!greeter->priv->authentication_session) + if (!priv->authentication_session) { send_end_authentication (greeter, sequence_number, "", PAM_USER_UNKNOWN); return; @@ -610,12 +639,14 @@ handle_authenticate_remote (Greeter *greeter, const gchar *session_name, const g static void handle_continue_authentication (Greeter *greeter, gchar **secrets) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); + /* Not in authentication */ - if (greeter->priv->authentication_session == NULL) + if (priv->authentication_session == NULL) return; - int messages_length = session_get_messages_length (greeter->priv->authentication_session); - const struct pam_message *messages = session_get_messages (greeter->priv->authentication_session); + int messages_length = session_get_messages_length (priv->authentication_session); + const struct pam_message *messages = session_get_messages (priv->authentication_session); /* Check correct number of responses */ int n_prompts = 0; @@ -627,7 +658,7 @@ handle_continue_authentication (Greeter *greeter, gchar **secrets) } if (g_strv_length (secrets) != n_prompts) { - session_respond_error (greeter->priv->authentication_session, PAM_CONV_ERR); + session_respond_error (priv->authentication_session, PAM_CONV_ERR); return; } @@ -647,7 +678,7 @@ handle_continue_authentication (Greeter *greeter, gchar **secrets) } } - session_respond (greeter->priv->authentication_session, response); + session_respond (priv->authentication_session, response); for (int i = 0; i < messages_length; i++) secure_free (greeter, response[i].resp); @@ -657,8 +688,10 @@ handle_continue_authentication (Greeter *greeter, gchar **secrets) static void handle_cancel_authentication (Greeter *greeter) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); + /* Not in authentication */ - if (greeter->priv->authentication_session == NULL) + if (priv->authentication_session == NULL) return; g_debug ("Cancel authentication"); @@ -668,25 +701,27 @@ handle_cancel_authentication (Greeter *greeter) static void handle_start_session (Greeter *greeter, const gchar *session) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); + if (strcmp (session, "") == 0) session = NULL; /* Use session type chosen in remote session */ SessionType session_type = SESSION_TYPE_LOCAL; - if (greeter->priv->remote_session) + if (priv->remote_session) { session_type = SESSION_TYPE_REMOTE; - session = greeter->priv->remote_session; + session = priv->remote_session; } gboolean result; - if (greeter->priv->guest_account_authenticated || session_get_is_authenticated (greeter->priv->authentication_session)) + if (priv->guest_account_authenticated || session_get_is_authenticated (priv->authentication_session)) { if (session) g_debug ("Greeter requests session %s", session); else g_debug ("Greeter requests default session"); - greeter->priv->start_session = TRUE; + priv->start_session = TRUE; g_signal_emit (greeter, signals[START_SESSION], 0, session_type, session, &result); } else @@ -705,21 +740,23 @@ handle_start_session (Greeter *greeter, const gchar *session) static void handle_set_language (Greeter *greeter, const gchar *language) { - if (!greeter->priv->guest_account_authenticated && !session_get_is_authenticated (greeter->priv->authentication_session)) + GreeterPrivate *priv = greeter_get_instance_private (greeter); + + if (!priv->guest_account_authenticated && !session_get_is_authenticated (priv->authentication_session)) { g_debug ("Ignoring set language request, user is not authorized"); return; } // FIXME: Could use this - if (greeter->priv->guest_account_authenticated) + if (priv->guest_account_authenticated) { g_debug ("Ignoring set language request for guest user"); return; } g_debug ("Greeter sets language %s", language); - User *user = session_get_user (greeter->priv->authentication_session); + User *user = session_get_user (priv->authentication_session); user_set_language (user, language); } @@ -740,12 +777,14 @@ handle_ensure_shared_dir (Greeter *greeter, const gchar *username) static guint32 read_int (Greeter *greeter, gsize *offset) { - if (greeter->priv->n_read - *offset < sizeof (guint32)) + GreeterPrivate *priv = greeter_get_instance_private (greeter); + + if (priv->n_read - *offset < sizeof (guint32)) { - g_warning ("Not enough space for int, need %zu, got %zu", sizeof (guint32), greeter->priv->n_read - *offset); + g_warning ("Not enough space for int, need %zu, got %zu", sizeof (guint32), priv->n_read - *offset); return 0; } - guint8 *buffer = greeter->priv->read_buffer + *offset; + guint8 *buffer = priv->read_buffer + *offset; guint32 value = buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3]; *offset += int_length (); return value; @@ -772,15 +811,17 @@ get_message_length (Greeter *greeter) static gchar * read_string_full (Greeter *greeter, gsize *offset, void* (*alloc_fn)(size_t n)) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); + guint32 length = read_int (greeter, offset); - if (greeter->priv->n_read - *offset < length) + if (priv->n_read - *offset < length) { - g_warning ("Not enough space for string, need %u, got %zu", length, greeter->priv->n_read - *offset); + g_warning ("Not enough space for string, need %u, got %zu", length, priv->n_read - *offset); return g_strdup (""); } gchar *value = (*alloc_fn) (sizeof (gchar) * (length + 1)); - memcpy (value, greeter->priv->read_buffer + *offset, length); + memcpy (value, priv->read_buffer + *offset, length); value[length] = '\0'; *offset += length; @@ -796,7 +837,8 @@ read_string (Greeter *greeter, gsize *offset) static gchar * read_secret (Greeter *greeter, gsize *offset) { - if (greeter->priv->use_secure_memory) + GreeterPrivate *priv = greeter_get_instance_private (greeter); + if (priv->use_secure_memory) return read_string_full (greeter, offset, gcry_malloc_secure); else return read_string_full (greeter, offset, g_malloc); @@ -806,31 +848,32 @@ static gboolean read_cb (GIOChannel *source, GIOCondition condition, gpointer data) { Greeter *greeter = data; + GreeterPrivate *priv = greeter_get_instance_private (greeter); if (condition == G_IO_HUP) { g_debug ("Greeter closed communication channel"); - greeter->priv->from_greeter_watch = 0; + priv->from_greeter_watch = 0; g_signal_emit (greeter, signals[DISCONNECTED], 0); return FALSE; } gsize n_to_read = HEADER_SIZE; - if (greeter->priv->n_read >= HEADER_SIZE) + if (priv->n_read >= HEADER_SIZE) { n_to_read = get_message_length (greeter); if (n_to_read <= HEADER_SIZE) { - greeter->priv->from_greeter_watch = 0; + priv->from_greeter_watch = 0; return FALSE; } } gsize n_read; g_autoptr(GError) error = NULL; - GIOStatus status = g_io_channel_read_chars (greeter->priv->from_greeter_channel, - (gchar *) greeter->priv->read_buffer + greeter->priv->n_read, - n_to_read - greeter->priv->n_read, + GIOStatus status = g_io_channel_read_chars (priv->from_greeter_channel, + (gchar *) priv->read_buffer + priv->n_read, + n_to_read - priv->n_read, &n_read, &error); if (error) @@ -838,24 +881,24 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) if (status == G_IO_STATUS_EOF) { g_debug ("Greeter closed communication channel"); - greeter->priv->from_greeter_watch = 0; + priv->from_greeter_watch = 0; g_signal_emit (greeter, signals[DISCONNECTED], 0); return FALSE; } else if (status != G_IO_STATUS_NORMAL) return TRUE; - greeter->priv->n_read += n_read; - if (greeter->priv->n_read != n_to_read) + priv->n_read += n_read; + if (priv->n_read != n_to_read) return TRUE; /* If have header, rerun for content */ - if (greeter->priv->n_read == HEADER_SIZE) + if (priv->n_read == HEADER_SIZE) { n_to_read = get_message_length (greeter); if (n_to_read > HEADER_SIZE) { - greeter->priv->read_buffer = secure_realloc (greeter, greeter->priv->read_buffer, n_to_read); + priv->read_buffer = secure_realloc (greeter, priv->read_buffer, n_to_read); read_cb (source, condition, greeter); return TRUE; } @@ -906,7 +949,7 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) if (n_secrets > max_secrets) { g_warning ("Array length of %u elements too long", n_secrets); - greeter->priv->from_greeter_watch = 0; + priv->from_greeter_watch = 0; return FALSE; } gchar **secrets = g_malloc (sizeof (gchar *) * (n_secrets + 1)); @@ -944,7 +987,7 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) break; } - greeter->priv->n_read = 0; + priv->n_read = 0; return TRUE; } @@ -952,19 +995,22 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) gboolean greeter_get_guest_authenticated (Greeter *greeter) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); g_return_val_if_fail (greeter != NULL, FALSE); - return greeter->priv->guest_account_authenticated; + return priv->guest_account_authenticated; } Session * greeter_take_authentication_session (Greeter *greeter) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); + g_return_val_if_fail (greeter != NULL, NULL); - Session *session = greeter->priv->authentication_session; - if (greeter->priv->authentication_session) - g_signal_handlers_disconnect_matched (greeter->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter); - greeter->priv->authentication_session = NULL; + Session *session = priv->authentication_session; + if (priv->authentication_session) + g_signal_handlers_disconnect_matched (priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter); + priv->authentication_session = NULL; return session; } @@ -972,22 +1018,25 @@ greeter_take_authentication_session (Greeter *greeter) gboolean greeter_get_resettable (Greeter *greeter) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); g_return_val_if_fail (greeter != NULL, FALSE); - return greeter->priv->resettable; + return priv->resettable; } gboolean greeter_get_start_session (Greeter *greeter) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); g_return_val_if_fail (greeter != NULL, FALSE); - return greeter->priv->start_session; + return priv->start_session; } const gchar * greeter_get_active_username (Greeter *greeter) { + GreeterPrivate *priv = greeter_get_instance_private (greeter); g_return_val_if_fail (greeter != NULL, NULL); - return greeter->priv->active_username; + return priv->active_username; } static Session * @@ -1005,38 +1054,40 @@ greeter_real_start_session (Greeter *greeter, SessionType type, const gchar *ses static void greeter_init (Greeter *greeter) { - greeter->priv = G_TYPE_INSTANCE_GET_PRIVATE (greeter, GREETER_TYPE, GreeterPrivate); - greeter->priv->read_buffer = secure_malloc (greeter, HEADER_SIZE); - greeter->priv->hints = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - greeter->priv->use_secure_memory = config_get_boolean (config_get_instance (), "LightDM", "lock-memory"); - greeter->priv->to_greeter_input = -1; - greeter->priv->from_greeter_output = -1; + GreeterPrivate *priv = greeter_get_instance_private (greeter); + + priv->read_buffer = secure_malloc (greeter, HEADER_SIZE); + priv->hints = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + priv->use_secure_memory = config_get_boolean (config_get_instance (), "LightDM", "lock-memory"); + priv->to_greeter_input = -1; + priv->from_greeter_output = -1; } static void greeter_finalize (GObject *object) { Greeter *self = GREETER (object); - - g_clear_pointer (&self->priv->pam_service, g_free); - g_clear_pointer (&self->priv->autologin_pam_service, g_free); - secure_free (self, self->priv->read_buffer); - g_hash_table_unref (self->priv->hints); - g_clear_pointer (&self->priv->remote_session, g_free); - g_clear_pointer (&self->priv->active_username, g_free); - if (self->priv->authentication_session) + GreeterPrivate *priv = greeter_get_instance_private (self); + + g_clear_pointer (&priv->pam_service, g_free); + g_clear_pointer (&priv->autologin_pam_service, g_free); + secure_free (self, priv->read_buffer); + g_hash_table_unref (priv->hints); + g_clear_pointer (&priv->remote_session, g_free); + g_clear_pointer (&priv->active_username, g_free); + if (priv->authentication_session) { - g_signal_handlers_disconnect_matched (self->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); - g_object_unref (self->priv->authentication_session); + g_signal_handlers_disconnect_matched (priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); + g_object_unref (priv->authentication_session); } - close (self->priv->to_greeter_input); - close (self->priv->from_greeter_output); - if (self->priv->to_greeter_channel) - g_io_channel_unref (self->priv->to_greeter_channel); - if (self->priv->from_greeter_channel) - g_io_channel_unref (self->priv->from_greeter_channel); - if (self->priv->from_greeter_watch) - g_source_remove (self->priv->from_greeter_watch); + close (priv->to_greeter_input); + close (priv->from_greeter_output); + if (priv->to_greeter_channel) + g_io_channel_unref (priv->to_greeter_channel); + if (priv->from_greeter_channel) + g_io_channel_unref (priv->from_greeter_channel); + if (priv->from_greeter_watch) + g_source_remove (priv->from_greeter_watch); G_OBJECT_CLASS (greeter_parent_class)->finalize (object); } diff --git a/src/greeter.h b/src/greeter.h index 5cba26ef..4038e694 100644 --- a/src/greeter.h +++ b/src/greeter.h @@ -32,12 +32,9 @@ G_BEGIN_DECLS #define GREETER_SIGNAL_ACTIVE_USERNAME_CHANGED "notify::" GREETER_PROPERTY_ACTIVE_USERNAME -typedef struct GreeterPrivate GreeterPrivate; - struct Greeter { - GObject parent_instance; - GreeterPrivate *priv; + GObject parent_instance; }; typedef struct diff --git a/src/login1.c b/src/login1.c index 4eefb889..a6e9b9dc 100644 --- a/src/login1.c +++ b/src/login1.c @@ -26,7 +26,7 @@ enum { }; static guint service_signals[LAST_SERVICE_SIGNAL] = { 0 }; -struct Login1ServicePrivate +typedef struct { /* Connection to bus service is running on */ GDBusConnection *connection; @@ -39,7 +39,7 @@ struct Login1ServicePrivate /* Handle to signal subscription */ guint signal_id; -}; +} Login1ServicePrivate; enum { CAN_GRAPHICAL_CHANGED, @@ -48,7 +48,7 @@ enum { }; static guint seat_signals[LAST_SEAT_SIGNAL] = { 0 }; -struct Login1SeatPrivate +typedef struct { /* Connection to bus seat is running on */ GDBusConnection *connection; @@ -67,7 +67,7 @@ struct Login1SeatPrivate /* TRUE if can do session switching */ gboolean can_multi_session; -}; +} Login1SeatPrivate; G_DEFINE_TYPE_WITH_PRIVATE (Login1Service, login1_service, G_TYPE_OBJECT) G_DEFINE_TYPE_WITH_PRIVATE (Login1Seat, login1_seat, G_TYPE_OBJECT) @@ -87,9 +87,11 @@ login1_service_get_instance (void) static void update_property (Login1Seat *seat, const gchar *name, GVariant *value) { + Login1SeatPrivate *priv = login1_seat_get_instance_private (seat); + if (strcmp (name, "CanGraphical") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN)) { - seat->priv->can_graphical = g_variant_get_boolean (value); + priv->can_graphical = g_variant_get_boolean (value); g_signal_emit (seat, seat_signals[CAN_GRAPHICAL_CHANGED], 0); } else if (strcmp (name, "ActiveSession") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE ("(so)"))) @@ -110,6 +112,7 @@ seat_properties_changed_cb (GDBusConnection *connection, gpointer user_data) { Login1Seat *seat = user_data; + Login1SeatPrivate *priv = login1_seat_get_instance_private (seat); GVariantIter *iter; GVariantIter *invalidated_properties; @@ -126,7 +129,7 @@ seat_properties_changed_cb (GDBusConnection *connection, g_autoptr(GError) error = NULL; g_autoptr(GVariant) result = g_dbus_connection_call_sync (connection, LOGIN1_SERVICE_NAME, - seat->priv->path, + priv->path, "org.freedesktop.DBus.Properties", "Get", g_variant_new ("(ss)", "org.freedesktop.login1.Seat", name), @@ -150,25 +153,29 @@ seat_properties_changed_cb (GDBusConnection *connection, static Login1Seat * add_seat (Login1Service *service, const gchar *id, const gchar *path) { + Login1ServicePrivate *priv = login1_service_get_instance_private (service); + Login1Seat *seat = g_object_new (LOGIN1_SEAT_TYPE, NULL); - seat->priv->connection = g_object_ref (service->priv->connection); - seat->priv->id = g_strdup (id); - seat->priv->path = g_strdup (path); - - seat->priv->signal_id = g_dbus_connection_signal_subscribe (seat->priv->connection, - LOGIN1_SERVICE_NAME, - "org.freedesktop.DBus.Properties", - "PropertiesChanged", - path, - "org.freedesktop.login1.Seat", - G_DBUS_SIGNAL_FLAGS_NONE, - seat_properties_changed_cb, - g_object_ref (seat), - g_object_unref); + Login1SeatPrivate *s_priv = login1_seat_get_instance_private (seat); + + s_priv->connection = g_object_ref (priv->connection); + s_priv->id = g_strdup (id); + s_priv->path = g_strdup (path); + + s_priv->signal_id = g_dbus_connection_signal_subscribe (s_priv->connection, + LOGIN1_SERVICE_NAME, + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + path, + "org.freedesktop.login1.Seat", + G_DBUS_SIGNAL_FLAGS_NONE, + seat_properties_changed_cb, + g_object_ref (seat), + g_object_unref); /* Get properties for this seat */ g_autoptr(GError) error = NULL; - g_autoptr(GVariant) result = g_dbus_connection_call_sync (seat->priv->connection, + g_autoptr(GVariant) result = g_dbus_connection_call_sync (s_priv->connection, LOGIN1_SERVICE_NAME, path, "org.freedesktop.DBus.Properties", @@ -191,14 +198,14 @@ add_seat (Login1Service *service, const gchar *id, const gchar *path) while (g_variant_iter_loop (properties, "{&sv}", &name, &value)) { if (strcmp (name, "CanGraphical") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN)) - seat->priv->can_graphical = g_variant_get_boolean (value); + s_priv->can_graphical = g_variant_get_boolean (value); else if (strcmp (name, "CanMultiSession") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN)) - seat->priv->can_multi_session = g_variant_get_boolean (value); + s_priv->can_multi_session = g_variant_get_boolean (value); } g_variant_iter_free (properties); } - service->priv->seats = g_list_append (service->priv->seats, seat); + priv->seats = g_list_append (priv->seats, seat); return seat; } @@ -213,6 +220,7 @@ signal_cb (GDBusConnection *connection, gpointer user_data) { Login1Service *service = user_data; + Login1ServicePrivate *priv = login1_service_get_instance_private (service); if (strcmp (signal_name, "SeatNew") == 0) { @@ -234,7 +242,7 @@ signal_cb (GDBusConnection *connection, g_autoptr(Login1Seat) seat = login1_service_get_seat (service, id); if (seat) { - service->priv->seats = g_list_remove (service->priv->seats, seat); + priv->seats = g_list_remove (priv->seats, seat); g_signal_emit (service, service_signals[SEAT_REMOVED], 0, seat); } } @@ -243,30 +251,32 @@ signal_cb (GDBusConnection *connection, gboolean login1_service_connect (Login1Service *service) { + Login1ServicePrivate *priv = login1_service_get_instance_private (service); + g_return_val_if_fail (service != NULL, FALSE); - if (service->priv->connected) + if (priv->connected) return TRUE; g_autoptr(GError) error = NULL; - service->priv->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); + priv->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (error) g_warning ("Failed to get system bus: %s", error->message); - if (!service->priv->connection) + if (!priv->connection) return FALSE; - service->priv->signal_id = g_dbus_connection_signal_subscribe (service->priv->connection, - LOGIN1_SERVICE_NAME, - LOGIN1_MANAGER_INTERFACE_NAME, - NULL, - LOGIN1_OBJECT_NAME, - NULL, - G_DBUS_SIGNAL_FLAGS_NONE, - signal_cb, - g_object_ref (service), - g_object_unref); - - g_autoptr(GVariant) result = g_dbus_connection_call_sync (service->priv->connection, + priv->signal_id = g_dbus_connection_signal_subscribe (priv->connection, + LOGIN1_SERVICE_NAME, + LOGIN1_MANAGER_INTERFACE_NAME, + NULL, + LOGIN1_OBJECT_NAME, + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + signal_cb, + g_object_ref (service), + g_object_unref); + + g_autoptr(GVariant) result = g_dbus_connection_call_sync (priv->connection, LOGIN1_SERVICE_NAME, LOGIN1_OBJECT_NAME, LOGIN1_MANAGER_INTERFACE_NAME, @@ -290,7 +300,7 @@ login1_service_connect (Login1Service *service) add_seat (service, id, path); g_variant_iter_free (seat_iter); - service->priv->connected = TRUE; + priv->connected = TRUE; return TRUE; } @@ -298,26 +308,32 @@ login1_service_connect (Login1Service *service) gboolean login1_service_get_is_connected (Login1Service *service) { + Login1ServicePrivate *priv = login1_service_get_instance_private (service); g_return_val_if_fail (service != NULL, FALSE); - return service->priv->connected; + return priv->connected; } GList * login1_service_get_seats (Login1Service *service) { + Login1ServicePrivate *priv = login1_service_get_instance_private (service); g_return_val_if_fail (service != NULL, NULL); - return service->priv->seats; + return priv->seats; } Login1Seat * login1_service_get_seat (Login1Service *service, const gchar *id) { + Login1ServicePrivate *priv = login1_service_get_instance_private (service); + g_return_val_if_fail (service != NULL, NULL); - for (GList *link = service->priv->seats; link; link = link->next) + for (GList *link = priv->seats; link; link = link->next) { Login1Seat *seat = link->data; - if (strcmp (seat->priv->id, id) == 0) + Login1SeatPrivate *s_priv = login1_seat_get_instance_private (seat); + + if (strcmp (s_priv->id, id) == 0) return seat; } @@ -327,6 +343,8 @@ login1_service_get_seat (Login1Service *service, const gchar *id) void login1_service_lock_session (Login1Service *service, const gchar *session_id) { + Login1ServicePrivate *priv = login1_service_get_instance_private (service); + g_return_if_fail (service != NULL); g_return_if_fail (session_id != NULL); @@ -336,7 +354,7 @@ login1_service_lock_session (Login1Service *service, const gchar *session_id) return; g_autoptr(GError) error = NULL; - g_autoptr(GVariant) result = g_dbus_connection_call_sync (service->priv->connection, + g_autoptr(GVariant) result = g_dbus_connection_call_sync (priv->connection, LOGIN1_SERVICE_NAME, LOGIN1_OBJECT_NAME, LOGIN1_MANAGER_INTERFACE_NAME, @@ -354,6 +372,8 @@ login1_service_lock_session (Login1Service *service, const gchar *session_id) void login1_service_unlock_session (Login1Service *service, const gchar *session_id) { + Login1ServicePrivate *priv = login1_service_get_instance_private (service); + g_return_if_fail (service != NULL); g_return_if_fail (session_id != NULL); @@ -363,7 +383,7 @@ login1_service_unlock_session (Login1Service *service, const gchar *session_id) return; g_autoptr(GError) error = NULL; - g_autoptr(GVariant) result = g_dbus_connection_call_sync (service->priv->connection, + g_autoptr(GVariant) result = g_dbus_connection_call_sync (priv->connection, LOGIN1_SERVICE_NAME, LOGIN1_OBJECT_NAME, LOGIN1_MANAGER_INTERFACE_NAME, @@ -381,6 +401,8 @@ login1_service_unlock_session (Login1Service *service, const gchar *session_id) void login1_service_activate_session (Login1Service *service, const gchar *session_id) { + Login1ServicePrivate *priv = login1_service_get_instance_private (service); + g_return_if_fail (service != NULL); g_return_if_fail (session_id != NULL); @@ -390,7 +412,7 @@ login1_service_activate_session (Login1Service *service, const gchar *session_id return; g_autoptr(GError) error = NULL; - g_autoptr(GVariant) result = g_dbus_connection_call_sync (service->priv->connection, + g_autoptr(GVariant) result = g_dbus_connection_call_sync (priv->connection, LOGIN1_SERVICE_NAME, LOGIN1_OBJECT_NAME, LOGIN1_MANAGER_INTERFACE_NAME, @@ -408,6 +430,8 @@ login1_service_activate_session (Login1Service *service, const gchar *session_id void login1_service_terminate_session (Login1Service *service, const gchar *session_id) { + Login1ServicePrivate *priv = login1_service_get_instance_private (service); + g_return_if_fail (service != NULL); g_return_if_fail (session_id != NULL); @@ -417,7 +441,7 @@ login1_service_terminate_session (Login1Service *service, const gchar *session_i return; g_autoptr(GError) error = NULL; - g_autoptr(GVariant) result = g_dbus_connection_call_sync (service->priv->connection, + g_autoptr(GVariant) result = g_dbus_connection_call_sync (priv->connection, LOGIN1_SERVICE_NAME, LOGIN1_OBJECT_NAME, LOGIN1_MANAGER_INTERFACE_NAME, @@ -435,17 +459,17 @@ login1_service_terminate_session (Login1Service *service, const gchar *session_i static void login1_service_init (Login1Service *service) { - service->priv = G_TYPE_INSTANCE_GET_PRIVATE (service, LOGIN1_SERVICE_TYPE, Login1ServicePrivate); } static void login1_service_finalize (GObject *object) { Login1Service *self = LOGIN1_SERVICE (object); + Login1ServicePrivate *priv = login1_service_get_instance_private (self); - g_list_free_full (self->priv->seats, g_object_unref); - g_dbus_connection_signal_unsubscribe (self->priv->connection, self->priv->signal_id); - g_clear_object (&self->priv->connection); + g_list_free_full (priv->seats, g_object_unref); + g_dbus_connection_signal_unsubscribe (priv->connection, priv->signal_id); + g_clear_object (&priv->connection); G_OBJECT_CLASS (login1_service_parent_class)->finalize (object); } @@ -478,39 +502,42 @@ login1_service_class_init (Login1ServiceClass *klass) const gchar * login1_seat_get_id (Login1Seat *seat) { + Login1SeatPrivate *priv = login1_seat_get_instance_private (seat); g_return_val_if_fail (seat != NULL, NULL); - return seat->priv->id; + return priv->id; } gboolean login1_seat_get_can_graphical (Login1Seat *seat) { + Login1SeatPrivate *priv = login1_seat_get_instance_private (seat); g_return_val_if_fail (seat != NULL, FALSE); - return seat->priv->can_graphical; + return priv->can_graphical; } gboolean login1_seat_get_can_multi_session (Login1Seat *seat) { + Login1SeatPrivate *priv = login1_seat_get_instance_private (seat); g_return_val_if_fail (seat != NULL, FALSE); - return seat->priv->can_multi_session; + return priv->can_multi_session; } static void login1_seat_init (Login1Seat *seat) { - seat->priv = G_TYPE_INSTANCE_GET_PRIVATE (seat, LOGIN1_SEAT_TYPE, Login1SeatPrivate); } static void login1_seat_finalize (GObject *object) { Login1Seat *self = LOGIN1_SEAT (object); + Login1SeatPrivate *priv = login1_seat_get_instance_private (self); - g_clear_pointer (&self->priv->id, g_free); - g_clear_pointer (&self->priv->path, g_free); - g_dbus_connection_signal_unsubscribe (self->priv->connection, self->priv->signal_id); - g_clear_object (&self->priv->connection); + g_clear_pointer (&priv->id, g_free); + g_clear_pointer (&priv->path, g_free); + g_dbus_connection_signal_unsubscribe (priv->connection, priv->signal_id); + g_clear_object (&priv->connection); G_OBJECT_CLASS (login1_seat_parent_class)->finalize (object); } diff --git a/src/login1.h b/src/login1.h index 9377dba8..b2885521 100644 --- a/src/login1.h +++ b/src/login1.h @@ -28,12 +28,9 @@ G_BEGIN_DECLS #define LOGIN1_SEAT_SIGNAL_CAN_GRAPHICAL_CHANGED "can-graphical-changed" #define LOGIN1_SIGNAL_ACTIVE_SESION_CHANGED "active-session-changed" -typedef struct Login1SeatPrivate Login1SeatPrivate; - typedef struct { - GObject parent_instance; - Login1SeatPrivate *priv; + GObject parent_instance; } Login1Seat; typedef struct @@ -43,12 +40,9 @@ typedef struct void (*active_session_changed)(Login1Seat *seat, const gchar *login1_session_id); } Login1SeatClass; -typedef struct Login1ServicePrivate Login1ServicePrivate; - typedef struct { - GObject parent_instance; - Login1ServicePrivate *priv; + GObject parent_instance; } Login1Service; typedef struct diff --git a/src/process.c b/src/process.c index 24416671..fc1652f1 100644 --- a/src/process.c +++ b/src/process.c @@ -30,7 +30,7 @@ enum { }; static guint signals[LAST_SIGNAL] = { 0 }; -struct ProcessPrivate +typedef struct { /* Function to run inside subprocess before exec */ ProcessRunFunc run_func; @@ -64,7 +64,7 @@ struct ProcessPrivate /* Watch on process */ guint watch; -}; +} ProcessPrivate; G_DEFINE_TYPE_WITH_PRIVATE (Process, process, G_TYPE_OBJECT) @@ -80,7 +80,8 @@ process_get_current (void) return current_process; current_process = process_new (NULL, NULL); - current_process->priv->pid = getpid (); + ProcessPrivate *priv = process_get_instance_private (current_process); + priv->pid = getpid (); return current_process; } @@ -89,85 +90,96 @@ Process * process_new (ProcessRunFunc run_func, gpointer run_func_data) { Process *process = g_object_new (PROCESS_TYPE, NULL); - process->priv->run_func = run_func; - process->priv->run_func_data = run_func_data; - process->priv->log_mode = LOG_MODE_INVALID; + ProcessPrivate *priv = process_get_instance_private (process); + + priv->run_func = run_func; + priv->run_func_data = run_func_data; + priv->log_mode = LOG_MODE_INVALID; return process; } void process_set_log_file (Process *process, const gchar *path, gboolean log_stdout, LogMode log_mode) { + ProcessPrivate *priv = process_get_instance_private (process); + g_return_if_fail (process != NULL); - g_free (process->priv->log_file); - process->priv->log_file = g_strdup (path); - process->priv->log_stdout = log_stdout; - process->priv->log_mode = log_mode; + + g_free (priv->log_file); + priv->log_file = g_strdup (path); + priv->log_stdout = log_stdout; + priv->log_mode = log_mode; } void process_set_clear_environment (Process *process, gboolean clear_environment) { + ProcessPrivate *priv = process_get_instance_private (process); g_return_if_fail (process != NULL); - process->priv->clear_environment = clear_environment; + priv->clear_environment = clear_environment; } gboolean process_get_clear_environment (Process *process) { + ProcessPrivate *priv = process_get_instance_private (process); g_return_val_if_fail (process != NULL, FALSE); - return process->priv->clear_environment; + return priv->clear_environment; } void process_set_env (Process *process, const gchar *name, const gchar *value) { + ProcessPrivate *priv = process_get_instance_private (process); g_return_if_fail (process != NULL); g_return_if_fail (name != NULL); - g_hash_table_insert (process->priv->env, g_strdup (name), g_strdup (value)); + g_hash_table_insert (priv->env, g_strdup (name), g_strdup (value)); } const gchar * process_get_env (Process *process, const gchar *name) { + ProcessPrivate *priv = process_get_instance_private (process); g_return_val_if_fail (process != NULL, NULL); g_return_val_if_fail (name != NULL, NULL); - return g_hash_table_lookup (process->priv->env, name); + return g_hash_table_lookup (priv->env, name); } void process_set_command (Process *process, const gchar *command) { + ProcessPrivate *priv = process_get_instance_private (process); g_return_if_fail (process != NULL); - - g_free (process->priv->command); - process->priv->command = g_strdup (command); + g_free (priv->command); + priv->command = g_strdup (command); } const gchar * process_get_command (Process *process) { + ProcessPrivate *priv = process_get_instance_private (process); g_return_val_if_fail (process != NULL, NULL); - return process->priv->command; + return priv->command; } static void process_watch_cb (GPid pid, gint status, gpointer data) { Process *process = data; + ProcessPrivate *priv = process_get_instance_private (process); - process->priv->watch = 0; - process->priv->exit_status = status; + priv->watch = 0; + priv->exit_status = status; if (WIFEXITED (status)) g_debug ("Process %d exited with return value %d", pid, WEXITSTATUS (status)); else if (WIFSIGNALED (status)) g_debug ("Process %d terminated with signal %d", pid, WTERMSIG (status)); - if (process->priv->quit_timeout) - g_source_remove (process->priv->quit_timeout); - process->priv->quit_timeout = 0; - process->priv->pid = 0; + if (priv->quit_timeout) + g_source_remove (priv->quit_timeout); + priv->quit_timeout = 0; + priv->pid = 0; g_hash_table_remove (processes, GINT_TO_POINTER (pid)); g_signal_emit (process, signals[STOPPED], 0); @@ -176,33 +188,35 @@ process_watch_cb (GPid pid, gint status, gpointer data) gboolean process_start (Process *process, gboolean block) { + ProcessPrivate *priv = process_get_instance_private (process); + g_return_val_if_fail (process != NULL, FALSE); - g_return_val_if_fail (process->priv->command != NULL, FALSE); - g_return_val_if_fail (process->priv->pid == 0, FALSE); + g_return_val_if_fail (priv->command != NULL, FALSE); + g_return_val_if_fail (priv->pid == 0, FALSE); gint argc; g_auto(GStrv) argv = NULL; g_autoptr(GError) error = NULL; - if (!g_shell_parse_argv (process->priv->command, &argc, &argv, &error)) + if (!g_shell_parse_argv (priv->command, &argc, &argv, &error)) { - g_warning ("Error parsing command %s: %s", process->priv->command, error->message); + g_warning ("Error parsing command %s: %s", priv->command, error->message); return FALSE; } int log_fd = -1; - if (process->priv->log_file) - log_fd = log_file_open (process->priv->log_file, process->priv->log_mode); + if (priv->log_file) + log_fd = log_file_open (priv->log_file, priv->log_mode); /* Work out variables to set */ - guint env_length = g_hash_table_size (process->priv->env); + guint env_length = g_hash_table_size (priv->env); g_autofree gchar **env_keys = g_malloc (sizeof (gchar *) * env_length); g_autofree gchar **env_values = g_malloc (sizeof (gchar *) * env_length); - GList *keys = g_hash_table_get_keys (process->priv->env); + GList *keys = g_hash_table_get_keys (priv->env); guint i = 0; for (GList *link = keys; i < env_length; i++, link = link->next) { env_keys[i] = link->data; - env_values[i] = g_hash_table_lookup (process->priv->env, env_keys[i]); + env_values[i] = g_hash_table_lookup (priv->env, env_keys[i]); } g_list_free (keys); @@ -210,20 +224,20 @@ process_start (Process *process, gboolean block) if (pid == 0) { /* Do custom setup */ - if (process->priv->run_func) - process->priv->run_func (process, process->priv->run_func_data); + if (priv->run_func) + priv->run_func (process, priv->run_func_data); /* Redirect output to logfile */ if (log_fd >= 0) { - if (process->priv->log_stdout) + if (priv->log_stdout) dup2 (log_fd, STDOUT_FILENO); dup2 (log_fd, STDERR_FILENO); close (log_fd); } /* Set environment */ - if (process->priv->clear_environment) + if (priv->clear_environment) #ifdef HAVE_CLEARENV clearenv (); #else @@ -247,20 +261,20 @@ process_start (Process *process, gboolean block) return FALSE; } - g_debug ("Launching process %d: %s", pid, process->priv->command); + g_debug ("Launching process %d: %s", pid, priv->command); - process->priv->pid = pid; + priv->pid = pid; if (block) { int exit_status; - waitpid (process->priv->pid, &exit_status, 0); - process_watch_cb (process->priv->pid, exit_status, process); + waitpid (priv->pid, &exit_status, 0); + process_watch_cb (priv->pid, exit_status, process); } else { - g_hash_table_insert (processes, GINT_TO_POINTER (process->priv->pid), g_object_ref (process)); - process->priv->watch = g_child_watch_add (process->priv->pid, process_watch_cb, process); + g_hash_table_insert (processes, GINT_TO_POINTER (priv->pid), g_object_ref (process)); + priv->watch = g_child_watch_add (priv->pid, process_watch_cb, process); } return TRUE; @@ -269,73 +283,83 @@ process_start (Process *process, gboolean block) gboolean process_get_is_running (Process *process) { + ProcessPrivate *priv = process_get_instance_private (process); g_return_val_if_fail (process != NULL, FALSE); - return process->priv->pid != 0; + return priv->pid != 0; } GPid process_get_pid (Process *process) { + ProcessPrivate *priv = process_get_instance_private (process); g_return_val_if_fail (process != NULL, 0); - return process->priv->pid; + return priv->pid; } void process_signal (Process *process, int signum) { + ProcessPrivate *priv = process_get_instance_private (process); + g_return_if_fail (process != NULL); - if (process->priv->pid == 0) + if (priv->pid == 0) return; - g_debug ("Sending signal %d to process %d", signum, process->priv->pid); + g_debug ("Sending signal %d to process %d", signum, priv->pid); - if (kill (process->priv->pid, signum) < 0) + if (kill (priv->pid, signum) < 0) { /* Ignore ESRCH, we will pick that up in our wait */ if (errno != ESRCH) - g_warning ("Error sending signal %d to process %d: %s", signum, process->priv->pid, strerror (errno)); + g_warning ("Error sending signal %d to process %d: %s", signum, priv->pid, strerror (errno)); } } static gboolean quit_timeout_cb (Process *process) { - process->priv->quit_timeout = 0; + ProcessPrivate *priv = process_get_instance_private (process); + + priv->quit_timeout = 0; process_signal (process, SIGKILL); + return FALSE; } void process_stop (Process *process) { + ProcessPrivate *priv = process_get_instance_private (process); + g_return_if_fail (process != NULL); - if (process->priv->stopping) + if (priv->stopping) return; - process->priv->stopping = TRUE; + priv->stopping = TRUE; /* If already stopped then we're done! */ - if (process->priv->pid == 0) + if (priv->pid == 0) return; /* Send SIGTERM, and then SIGKILL if no response */ - process->priv->quit_timeout = g_timeout_add (5000, (GSourceFunc) quit_timeout_cb, process); + priv->quit_timeout = g_timeout_add (5000, (GSourceFunc) quit_timeout_cb, process); process_signal (process, SIGTERM); } int process_get_exit_status (Process *process) { + ProcessPrivate *priv = process_get_instance_private (process); g_return_val_if_fail (process != NULL, -1); - return process->priv->exit_status; + return priv->exit_status; } static void process_init (Process *process) { - process->priv = G_TYPE_INSTANCE_GET_PRIVATE (process, PROCESS_TYPE, ProcessPrivate); - process->priv->env = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + ProcessPrivate *priv = process_get_instance_private (process); + priv->env = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); } static void @@ -347,20 +371,21 @@ static void process_finalize (GObject *object) { Process *self = PROCESS (object); + ProcessPrivate *priv = process_get_instance_private (self); - if (self->priv->pid > 0) - g_hash_table_remove (processes, GINT_TO_POINTER (self->priv->pid)); + if (priv->pid > 0) + g_hash_table_remove (processes, GINT_TO_POINTER (priv->pid)); - g_clear_pointer (&self->priv->log_file, g_free); - g_clear_pointer (&self->priv->command, g_free); - g_hash_table_unref (self->priv->env); - if (self->priv->quit_timeout) - g_source_remove (self->priv->quit_timeout); - if (self->priv->watch) - g_source_remove (self->priv->watch); + g_clear_pointer (&priv->log_file, g_free); + g_clear_pointer (&priv->command, g_free); + g_hash_table_unref (priv->env); + if (priv->quit_timeout) + g_source_remove (priv->quit_timeout); + if (priv->watch) + g_source_remove (priv->watch); - if (self->priv->pid) - kill (self->priv->pid, SIGTERM); + if (priv->pid) + kill (priv->pid, SIGTERM); G_OBJECT_CLASS (process_parent_class)->finalize (object); } diff --git a/src/process.h b/src/process.h index 395762fe..fc45e5a0 100644 --- a/src/process.h +++ b/src/process.h @@ -27,12 +27,9 @@ G_BEGIN_DECLS #define PROCESS_SIGNAL_GOT_SIGNAL "got-signal" #define PROCESS_SIGNAL_STOPPED "stopped" -typedef struct ProcessPrivate ProcessPrivate; - typedef struct { - GObject parent_instance; - ProcessPrivate *priv; + GObject parent_instance; } Process; typedef struct diff --git a/src/seat-local.c b/src/seat-local.c index a83da26e..69a71f8f 100644 --- a/src/seat-local.c +++ b/src/seat-local.c @@ -20,7 +20,7 @@ #include "plymouth.h" #include "vt.h" -struct SeatLocalPrivate +typedef struct { /* System compositor being used for Mir sessions */ UnitySystemCompositor *compositor; @@ -33,7 +33,7 @@ struct SeatLocalPrivate /* X server being used for XDMCP */ XServerLocal *xdmcp_x_server; -}; +} SeatLocalPrivate; G_DEFINE_TYPE_WITH_PRIVATE (SeatLocal, seat_local, SEAT_TYPE) @@ -50,17 +50,20 @@ seat_local_setup (Seat *seat) static void check_stopped (SeatLocal *seat) { - if (!seat->priv->compositor && !seat->priv->xdmcp_x_server) + SeatLocalPrivate *priv = seat_local_get_instance_private (seat); + if (!priv->compositor && !priv->xdmcp_x_server) SEAT_CLASS (seat_local_parent_class)->stop (SEAT (seat)); } static void xdmcp_x_server_stopped_cb (DisplayServer *display_server, SeatLocal *seat) { + SeatLocalPrivate *priv = seat_local_get_instance_private (seat); + l_debug (seat, "XDMCP X server stopped"); - g_signal_handlers_disconnect_matched (seat->priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); - g_clear_object (&seat->priv->xdmcp_x_server); + g_signal_handlers_disconnect_matched (priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); + g_clear_object (&priv->xdmcp_x_server); if (seat_get_is_stopping (SEAT (seat))) check_stopped (seat); @@ -71,9 +74,11 @@ xdmcp_x_server_stopped_cb (DisplayServer *display_server, SeatLocal *seat) static void compositor_stopped_cb (UnitySystemCompositor *compositor, SeatLocal *seat) { + SeatLocalPrivate *priv = seat_local_get_instance_private (seat); + l_debug (seat, "Compositor stopped"); - g_clear_object (&seat->priv->compositor); + g_clear_object (&priv->compositor); if (seat_get_is_stopping (SEAT (seat))) check_stopped (seat); @@ -82,17 +87,17 @@ compositor_stopped_cb (UnitySystemCompositor *compositor, SeatLocal *seat) static gboolean seat_local_start (Seat *seat) { + SeatLocalPrivate *priv = seat_local_get_instance_private (SEAT_LOCAL (seat)); + /* If running as an XDMCP client then just start an X server */ const gchar *xdmcp_manager = seat_get_string_property (seat, "xdmcp-manager"); if (xdmcp_manager) { - SeatLocal *s = SEAT_LOCAL (seat); - - s->priv->xdmcp_x_server = create_x_server (s); - x_server_local_set_xdmcp_server (s->priv->xdmcp_x_server, xdmcp_manager); + priv->xdmcp_x_server = create_x_server (SEAT_LOCAL (seat)); + x_server_local_set_xdmcp_server (priv->xdmcp_x_server, xdmcp_manager); gint port = seat_get_integer_property (seat, "xdmcp-port"); if (port > 0) - x_server_local_set_xdmcp_port (s->priv->xdmcp_x_server, port); + x_server_local_set_xdmcp_port (priv->xdmcp_x_server, port); const gchar *key_name = seat_get_string_property (seat, "xdmcp-key"); if (key_name) { @@ -113,12 +118,12 @@ seat_local_start (Seat *seat) l_debug (seat, "Key %s not defined", key_name); if (key) - x_server_local_set_xdmcp_key (s->priv->xdmcp_x_server, key); + x_server_local_set_xdmcp_key (priv->xdmcp_x_server, key); } } - g_signal_connect (s->priv->xdmcp_x_server, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (xdmcp_x_server_stopped_cb), seat); - return display_server_start (DISPLAY_SERVER (s->priv->xdmcp_x_server)); + g_signal_connect (priv->xdmcp_x_server, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (xdmcp_x_server_stopped_cb), seat); + return display_server_start (DISPLAY_SERVER (priv->xdmcp_x_server)); } return SEAT_CLASS (seat_local_parent_class)->start (seat); @@ -173,33 +178,36 @@ get_vt (SeatLocal *seat, DisplayServer *display_server) static UnitySystemCompositor * get_unity_system_compositor (SeatLocal *seat) { - if (seat->priv->compositor) - return seat->priv->compositor; + SeatLocalPrivate *priv = seat_local_get_instance_private (seat); + + if (priv->compositor) + return priv->compositor; - seat->priv->compositor = unity_system_compositor_new (); + priv->compositor = unity_system_compositor_new (); const gchar *command = seat_get_string_property (SEAT (seat), "unity-compositor-command"); if (command) - unity_system_compositor_set_command (seat->priv->compositor, command); + unity_system_compositor_set_command (priv->compositor, command); gint timeout = seat_get_integer_property (SEAT (seat), "unity-compositor-timeout"); if (timeout <= 0) timeout = 60; - unity_system_compositor_set_timeout (seat->priv->compositor, timeout); + unity_system_compositor_set_timeout (priv->compositor, timeout); - gint vt = get_vt (seat, DISPLAY_SERVER (seat->priv->compositor)); + gint vt = get_vt (seat, DISPLAY_SERVER (priv->compositor)); if (vt >= 0) - unity_system_compositor_set_vt (seat->priv->compositor, vt); + unity_system_compositor_set_vt (priv->compositor, vt); - seat->priv->next_xmir_id = 0; - g_signal_connect (seat->priv->compositor, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (compositor_stopped_cb), seat); + priv->next_xmir_id = 0; + g_signal_connect (priv->compositor, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (compositor_stopped_cb), seat); - return seat->priv->compositor; + return priv->compositor; } static XServerLocal * create_x_server (SeatLocal *seat) { + SeatLocalPrivate *priv = seat_local_get_instance_private (seat); g_autoptr(XServerLocal) x_server = NULL; const gchar *x_server_backend = seat_get_string_property (SEAT (seat), "xserver-backend"); @@ -212,8 +220,8 @@ create_x_server (SeatLocal *seat) if (command) x_server_local_set_command (x_server, command); - g_autofree gchar *id = g_strdup_printf ("x-%d", seat->priv->next_xmir_id); - seat->priv->next_xmir_id++; + g_autofree gchar *id = g_strdup_printf ("x-%d", priv->next_xmir_id); + priv->next_xmir_id++; x_server_xmir_set_mir_id (X_SERVER_XMIR (x_server), id); x_server_xmir_set_mir_socket (X_SERVER_XMIR (x_server), unity_system_compositor_get_socket (compositor)); } @@ -294,7 +302,9 @@ seat_local_create_display_server (Seat *s, Session *session) static gboolean seat_local_display_server_is_used (Seat *seat, DisplayServer *display_server) { - if (display_server == DISPLAY_SERVER (SEAT_LOCAL (seat)->priv->compositor)) + SeatLocalPrivate *priv = seat_local_get_instance_private (SEAT_LOCAL (seat)); + + if (display_server == DISPLAY_SERVER (priv->compositor)) return TRUE; return SEAT_CLASS (seat_local_parent_class)->display_server_is_used (seat, display_server); @@ -319,9 +329,9 @@ seat_local_create_session (Seat *seat) } static void -seat_local_set_active_session (Seat *s, Session *session) +seat_local_set_active_session (Seat *seat, Session *session) { - SeatLocal *seat = SEAT_LOCAL (s); + SeatLocalPrivate *priv = seat_local_get_instance_private (SEAT_LOCAL (seat)); DisplayServer *display_server = session_get_display_server (session); @@ -329,36 +339,36 @@ seat_local_set_active_session (Seat *s, Session *session) if (vt >= 0) vt_set_active (vt); - g_clear_object (&seat->priv->active_compositor_session); + g_clear_object (&priv->active_compositor_session); if (IS_UNITY_SYSTEM_COMPOSITOR (display_server)) { unity_system_compositor_set_active_session (UNITY_SYSTEM_COMPOSITOR (display_server), session_get_env (session, "MIR_SERVER_NAME")); - seat->priv->active_compositor_session = g_object_ref (session); + priv->active_compositor_session = g_object_ref (session); } if (IS_X_SERVER_XMIR (display_server)) { - unity_system_compositor_set_active_session (seat->priv->compositor, x_server_xmir_get_mir_id (X_SERVER_XMIR (display_server))); - seat->priv->active_compositor_session = g_object_ref (session); + unity_system_compositor_set_active_session (priv->compositor, x_server_xmir_get_mir_id (X_SERVER_XMIR (display_server))); + priv->active_compositor_session = g_object_ref (session); } - SEAT_CLASS (seat_local_parent_class)->set_active_session (s, session); + SEAT_CLASS (seat_local_parent_class)->set_active_session (seat, session); } static Session * -seat_local_get_active_session (Seat *s) +seat_local_get_active_session (Seat *seat) { - SeatLocal *seat = SEAT_LOCAL (s); + SeatLocalPrivate *priv = seat_local_get_instance_private (SEAT_LOCAL (seat)); gint vt = vt_get_active (); if (vt < 0) return NULL; /* If the compositor is active return the session it is displaying */ - if (seat->priv->compositor && display_server_get_vt (DISPLAY_SERVER (seat->priv->compositor)) == vt) - return seat->priv->active_compositor_session; + if (priv->compositor && display_server_get_vt (DISPLAY_SERVER (priv->compositor)) == vt) + return priv->active_compositor_session; /* Otherwise find out which session is on this VT */ - for (GList *link = seat_get_sessions (s); link; link = link->next) + for (GList *link = seat_get_sessions (seat); link; link = link->next) { Session *session = link->data; DisplayServer *display_server; @@ -374,6 +384,8 @@ seat_local_get_active_session (Seat *s) static void seat_local_set_next_session (Seat *seat, Session *session) { + SeatLocalPrivate *priv = seat_local_get_instance_private (SEAT_LOCAL (seat)); + if (!session) return; @@ -388,7 +400,7 @@ seat_local_set_next_session (Seat *seat, Session *session) if (id) { l_debug (seat, "Marking Mir session %s as the next session", id); - unity_system_compositor_set_next_session (SEAT_LOCAL (seat)->priv->compositor, id); + unity_system_compositor_set_next_session (priv->compositor, id); } SEAT_CLASS (seat_local_parent_class)->set_next_session (seat, session); @@ -408,37 +420,37 @@ seat_local_run_script (Seat *seat, DisplayServer *display_server, Process *scrip } static void -seat_local_stop (Seat *s) +seat_local_stop (Seat *seat) { - SeatLocal *seat = SEAT_LOCAL (s); + SeatLocalPrivate *priv = seat_local_get_instance_private (SEAT_LOCAL (seat)); /* Stop the compositor */ - if (seat->priv->compositor) - display_server_stop (DISPLAY_SERVER (seat->priv->compositor)); + if (priv->compositor) + display_server_stop (DISPLAY_SERVER (priv->compositor)); /* Stop the XDMCP X server */ - if (seat->priv->xdmcp_x_server) - display_server_stop (DISPLAY_SERVER (seat->priv->xdmcp_x_server)); + if (priv->xdmcp_x_server) + display_server_stop (DISPLAY_SERVER (priv->xdmcp_x_server)); - check_stopped (seat); + check_stopped (SEAT_LOCAL (seat)); } static void seat_local_init (SeatLocal *seat) { - seat->priv = G_TYPE_INSTANCE_GET_PRIVATE (seat, SEAT_LOCAL_TYPE, SeatLocalPrivate); } static void seat_local_finalize (GObject *object) { SeatLocal *seat = SEAT_LOCAL (object); + SeatLocalPrivate *priv = seat_local_get_instance_private (seat); - g_clear_object (&seat->priv->compositor); - g_clear_object (&seat->priv->active_compositor_session); - if (seat->priv->xdmcp_x_server) - g_signal_handlers_disconnect_matched (seat->priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); - g_clear_object (&seat->priv->xdmcp_x_server); + g_clear_object (&priv->compositor); + g_clear_object (&priv->active_compositor_session); + if (priv->xdmcp_x_server) + g_signal_handlers_disconnect_matched (priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); + g_clear_object (&priv->xdmcp_x_server); G_OBJECT_CLASS (seat_local_parent_class)->finalize (object); } diff --git a/src/seat-local.h b/src/seat-local.h index 6e9679a4..f83039f8 100644 --- a/src/seat-local.h +++ b/src/seat-local.h @@ -20,12 +20,9 @@ G_BEGIN_DECLS #define SEAT_LOCAL_TYPE (seat_local_get_type()) #define SEAT_LOCAL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SEAT_LOCAL_TYPE, SeatLocal)) -typedef struct SeatLocalPrivate SeatLocalPrivate; - typedef struct { - Seat parent_instance; - SeatLocalPrivate *priv; + Seat parent_instance; } SeatLocal; typedef struct diff --git a/src/seat-unity.c b/src/seat-unity.c index 5d6d4ce1..649c94d1 100644 --- a/src/seat-unity.c +++ b/src/seat-unity.c @@ -21,7 +21,7 @@ #include "vt.h" #include "plymouth.h" -struct SeatUnityPrivate +typedef struct { /* System compositor */ UnitySystemCompositor *compositor; @@ -35,7 +35,7 @@ struct SeatUnityPrivate /* The currently visible session */ Session *active_session; DisplayServer *active_display_server; -}; +} SeatUnityPrivate; G_DEFINE_TYPE_WITH_PRIVATE (SeatUnity, seat_unity, SEAT_TYPE) @@ -51,17 +51,20 @@ seat_unity_setup (Seat *seat) static void check_stopped (SeatUnity *seat) { - if (!seat->priv->compositor && !seat->priv->xdmcp_x_server) + SeatUnityPrivate *priv = seat_unity_get_instance_private (seat); + if (!priv->compositor && !priv->xdmcp_x_server) SEAT_CLASS (seat_unity_parent_class)->stop (SEAT (seat)); } static void xdmcp_x_server_stopped_cb (DisplayServer *display_server, Seat *seat) { + SeatUnityPrivate *priv = seat_unity_get_instance_private (SEAT_UNITY (seat)); + l_debug (seat, "XDMCP X server stopped"); - g_signal_handlers_disconnect_matched (SEAT_UNITY (seat)->priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); - SEAT_UNITY (seat)->priv->xdmcp_x_server = NULL; + g_signal_handlers_disconnect_matched (priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); + priv->xdmcp_x_server = NULL; g_object_unref (display_server); @@ -74,17 +77,19 @@ xdmcp_x_server_stopped_cb (DisplayServer *display_server, Seat *seat) static void compositor_ready_cb (UnitySystemCompositor *compositor, SeatUnity *seat) { + SeatUnityPrivate *priv = seat_unity_get_instance_private (seat); + l_debug (seat, "Compositor ready"); /* If running as an XDMCP client then just start an X server */ const gchar *xdmcp_manager = seat_get_string_property (SEAT (seat), "xdmcp-manager"); if (xdmcp_manager) { - seat->priv->xdmcp_x_server = create_x_server (SEAT (seat)); - x_server_local_set_xdmcp_server (X_SERVER_LOCAL (seat->priv->xdmcp_x_server), xdmcp_manager); + priv->xdmcp_x_server = create_x_server (SEAT (seat)); + x_server_local_set_xdmcp_server (X_SERVER_LOCAL (priv->xdmcp_x_server), xdmcp_manager); gint port = seat_get_integer_property (SEAT (seat), "xdmcp-port"); if (port > 0) - x_server_local_set_xdmcp_port (X_SERVER_LOCAL (seat->priv->xdmcp_x_server), port); + x_server_local_set_xdmcp_port (X_SERVER_LOCAL (priv->xdmcp_x_server), port); const gchar *key_name = seat_get_string_property (SEAT (seat), "xdmcp-key"); if (key_name) { @@ -102,15 +107,15 @@ compositor_ready_cb (UnitySystemCompositor *compositor, SeatUnity *seat) { g_autofree gchar *key = g_key_file_get_string (keys, "keyring", key_name, NULL); if (key) - x_server_local_set_xdmcp_key (X_SERVER_LOCAL (seat->priv->xdmcp_x_server), key); + x_server_local_set_xdmcp_key (X_SERVER_LOCAL (priv->xdmcp_x_server), key); } else l_debug (seat, "Key %s not defined", key_name); } } - g_signal_connect (seat->priv->xdmcp_x_server, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (xdmcp_x_server_stopped_cb), seat); - if (!display_server_start (DISPLAY_SERVER (seat->priv->xdmcp_x_server))) + g_signal_connect (priv->xdmcp_x_server, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (xdmcp_x_server_stopped_cb), seat); + if (!display_server_start (DISPLAY_SERVER (priv->xdmcp_x_server))) seat_stop (SEAT (seat)); } @@ -120,9 +125,11 @@ compositor_ready_cb (UnitySystemCompositor *compositor, SeatUnity *seat) static void compositor_stopped_cb (UnitySystemCompositor *compositor, SeatUnity *seat) { + SeatUnityPrivate *priv = seat_unity_get_instance_private (seat); + l_debug (seat, "Compositor stopped"); - g_clear_object (&seat->priv->compositor); + g_clear_object (&priv->compositor); if (seat_get_is_stopping (SEAT (seat))) check_stopped (seat); @@ -133,6 +140,8 @@ compositor_stopped_cb (UnitySystemCompositor *compositor, SeatUnity *seat) static gboolean seat_unity_start (Seat *seat) { + SeatUnityPrivate *priv = seat_unity_get_instance_private (SEAT_UNITY (seat)); + /* Replace Plymouth if it is running */ gint vt = -1; if (plymouth_get_is_active () && plymouth_has_active_vt ()) @@ -160,30 +169,32 @@ seat_unity_start (Seat *seat) if (timeout <= 0) timeout = 60; - SEAT_UNITY (seat)->priv->compositor = unity_system_compositor_new (); - g_signal_connect (SEAT_UNITY (seat)->priv->compositor, DISPLAY_SERVER_SIGNAL_READY, G_CALLBACK (compositor_ready_cb), seat); - g_signal_connect (SEAT_UNITY (seat)->priv->compositor, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (compositor_stopped_cb), seat); - unity_system_compositor_set_command (SEAT_UNITY (seat)->priv->compositor, seat_get_string_property (SEAT (seat), "unity-compositor-command")); - unity_system_compositor_set_vt (SEAT_UNITY (seat)->priv->compositor, vt); - unity_system_compositor_set_timeout (SEAT_UNITY (seat)->priv->compositor, timeout); + priv->compositor = unity_system_compositor_new (); + g_signal_connect (priv->compositor, DISPLAY_SERVER_SIGNAL_READY, G_CALLBACK (compositor_ready_cb), seat); + g_signal_connect (priv->compositor, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (compositor_stopped_cb), seat); + unity_system_compositor_set_command (priv->compositor, seat_get_string_property (SEAT (seat), "unity-compositor-command")); + unity_system_compositor_set_vt (priv->compositor, vt); + unity_system_compositor_set_timeout (priv->compositor, timeout); - return display_server_start (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor)); + return display_server_start (DISPLAY_SERVER (priv->compositor)); } static XServerXmir * create_x_server (Seat *seat) { + SeatUnityPrivate *priv = seat_unity_get_instance_private (SEAT_UNITY (seat)); + l_debug (seat, "Starting X server on Unity compositor"); - g_autoptr(XServerXmir) x_server = x_server_xmir_new (SEAT_UNITY (seat)->priv->compositor); + g_autoptr(XServerXmir) x_server = x_server_xmir_new (priv->compositor); const gchar *command = seat_get_string_property (seat, "xmir-command"); x_server_local_set_command (X_SERVER_LOCAL (x_server), command); - g_autofree gchar *id = g_strdup_printf ("x-%d", SEAT_UNITY (seat)->priv->next_x_server_id); - SEAT_UNITY (seat)->priv->next_x_server_id++; + g_autofree gchar *id = g_strdup_printf ("x-%d", priv->next_x_server_id); + priv->next_x_server_id++; x_server_xmir_set_mir_id (x_server, id); - x_server_xmir_set_mir_socket (x_server, unity_system_compositor_get_socket (SEAT_UNITY (seat)->priv->compositor)); + x_server_xmir_set_mir_socket (x_server, unity_system_compositor_get_socket (priv->compositor)); g_autofree gchar *number = g_strdup_printf ("%d", x_server_get_display_number (X_SERVER (x_server))); g_autoptr(XAuthority) cookie = x_authority_new_local_cookie (number); @@ -208,11 +219,13 @@ create_x_server (Seat *seat) static DisplayServer * seat_unity_create_display_server (Seat *seat, Session *session) { + SeatUnityPrivate *priv = seat_unity_get_instance_private (SEAT_UNITY (seat)); + const gchar *session_type = session_get_session_type (session); if (strcmp (session_type, "x") == 0) return DISPLAY_SERVER (create_x_server (seat)); else if (strcmp (session_type, "mir") == 0) - return g_object_ref (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor)); + return g_object_ref (DISPLAY_SERVER (priv->compositor)); else { l_warning (seat, "Can't create unsupported display server '%s'", session_type); @@ -223,7 +236,9 @@ seat_unity_create_display_server (Seat *seat, Session *session) static gboolean seat_unity_display_server_is_used (Seat *seat, DisplayServer *display_server) { - if (display_server == DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor)) + SeatUnityPrivate *priv = seat_unity_get_instance_private (SEAT_UNITY (seat)); + + if (display_server == DISPLAY_SERVER (priv->compositor)) return TRUE; return SEAT_CLASS (seat_unity_parent_class)->display_server_is_used (seat, display_server); @@ -232,10 +247,12 @@ seat_unity_display_server_is_used (Seat *seat, DisplayServer *display_server) static GreeterSession * seat_unity_create_greeter_session (Seat *seat) { + SeatUnityPrivate *priv = seat_unity_get_instance_private (SEAT_UNITY (seat)); + GreeterSession *greeter_session = SEAT_CLASS (seat_unity_parent_class)->create_greeter_session (seat); session_set_env (SESSION (greeter_session), "XDG_SEAT", seat_get_name (seat)); - gint vt = display_server_get_vt (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor)); + gint vt = display_server_get_vt (DISPLAY_SERVER (priv->compositor)); if (vt >= 0) { g_autofree gchar *value = g_strdup_printf ("%d", vt); @@ -248,10 +265,12 @@ seat_unity_create_greeter_session (Seat *seat) static Session * seat_unity_create_session (Seat *seat) { + SeatUnityPrivate *priv = seat_unity_get_instance_private (SEAT_UNITY (seat)); + Session *session = SEAT_CLASS (seat_unity_parent_class)->create_session (seat); session_set_env (session, "XDG_SEAT", seat_get_name (seat)); - gint vt = display_server_get_vt (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor)); + gint vt = display_server_get_vt (DISPLAY_SERVER (priv->compositor)); if (vt >= 0) { g_autofree gchar *value = g_strdup_printf ("%d", vt); @@ -277,31 +296,34 @@ get_mir_id (Session *session) } static void -seat_unity_set_active_session (Seat *s, Session *session) +seat_unity_set_active_session (Seat *seat, Session *session) { - SeatUnity *seat = SEAT_UNITY (s); + SeatUnityPrivate *priv = seat_unity_get_instance_private (SEAT_UNITY (seat)); - const gchar *old_id = get_mir_id (seat->priv->active_session); + const gchar *old_id = get_mir_id (priv->active_session); const gchar *new_id = get_mir_id (session); - g_clear_object (&seat->priv->active_session); - seat->priv->active_session = g_object_ref (session); + g_clear_object (&priv->active_session); + priv->active_session = g_object_ref (session); if (g_strcmp0 (old_id, new_id) != 0) - unity_system_compositor_set_active_session (seat->priv->compositor, new_id); + unity_system_compositor_set_active_session (priv->compositor, new_id); - SEAT_CLASS (seat_unity_parent_class)->set_active_session (s, session); + SEAT_CLASS (seat_unity_parent_class)->set_active_session (seat, session); } static Session * seat_unity_get_active_session (Seat *seat) { - return SEAT_UNITY (seat)->priv->active_session; + SeatUnityPrivate *priv = seat_unity_get_instance_private (SEAT_UNITY (seat)); + return priv->active_session; } static void seat_unity_set_next_session (Seat *seat, Session *session) { + SeatUnityPrivate *priv = seat_unity_get_instance_private (SEAT_UNITY (seat)); + if (!session) return; @@ -316,7 +338,7 @@ seat_unity_set_next_session (Seat *seat, Session *session) if (id) { l_debug (seat, "Marking Mir session %s as the next session", id); - unity_system_compositor_set_next_session (SEAT_UNITY (seat)->priv->compositor, id); + unity_system_compositor_set_next_session (priv->compositor, id); } else { @@ -343,13 +365,15 @@ seat_unity_run_script (Seat *seat, DisplayServer *display_server, Process *scrip static void seat_unity_stop (Seat *seat) { + SeatUnityPrivate *priv = seat_unity_get_instance_private (SEAT_UNITY (seat)); + /* Stop the compositor first */ - if (SEAT_UNITY (seat)->priv->compositor) - display_server_stop (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor)); + if (priv->compositor) + display_server_stop (DISPLAY_SERVER (priv->compositor)); /* Stop the XDMCP X server first */ - if (SEAT_UNITY (seat)->priv->xdmcp_x_server) - display_server_stop (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->xdmcp_x_server)); + if (priv->xdmcp_x_server) + display_server_stop (DISPLAY_SERVER (priv->xdmcp_x_server)); check_stopped (SEAT_UNITY (seat)); } @@ -357,22 +381,22 @@ seat_unity_stop (Seat *seat) static void seat_unity_init (SeatUnity *seat) { - seat->priv = G_TYPE_INSTANCE_GET_PRIVATE (seat, SEAT_UNITY_TYPE, SeatUnityPrivate); } static void seat_unity_finalize (GObject *object) { SeatUnity *seat = SEAT_UNITY (object); + SeatUnityPrivate *priv = seat_unity_get_instance_private (seat); - g_clear_object (&seat->priv->compositor); - if (seat->priv->xdmcp_x_server) + g_clear_object (&priv->compositor); + if (priv->xdmcp_x_server) { - g_signal_handlers_disconnect_matched (seat->priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); - g_object_unref (seat->priv->xdmcp_x_server); + g_signal_handlers_disconnect_matched (priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); + g_object_unref (priv->xdmcp_x_server); } - g_clear_object (&seat->priv->active_session); - g_clear_object (&seat->priv->active_display_server); + g_clear_object (&priv->active_session); + g_clear_object (&priv->active_display_server); G_OBJECT_CLASS (seat_unity_parent_class)->finalize (object); } diff --git a/src/seat-unity.h b/src/seat-unity.h index 7a446cde..e97ba3a9 100644 --- a/src/seat-unity.h +++ b/src/seat-unity.h @@ -20,12 +20,9 @@ G_BEGIN_DECLS #define SEAT_UNITY_TYPE (seat_unity_get_type()) #define SEAT_UNITY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SEAT_UNITY_TYPE, SeatUnity)) -typedef struct SeatUnityPrivate SeatUnityPrivate; - typedef struct { - Seat parent_instance; - SeatUnityPrivate *priv; + Seat parent_instance; } SeatUnity; typedef struct diff --git a/src/seat-xdmcp-session.c b/src/seat-xdmcp-session.c index 38431083..a180d67c 100644 --- a/src/seat-xdmcp-session.c +++ b/src/seat-xdmcp-session.c @@ -14,14 +14,14 @@ #include "seat-xdmcp-session.h" #include "x-server-remote.h" -struct SeatXDMCPSessionPrivate +typedef struct { /* Session being serviced */ XDMCPSession *session; /* X server using XDMCP connection */ XServerRemote *x_server; -}; +} SeatXDMCPSessionPrivate; G_DEFINE_TYPE_WITH_PRIVATE (SeatXDMCPSession, seat_xdmcp_session, SEAT_TYPE) @@ -29,7 +29,9 @@ SeatXDMCPSession * seat_xdmcp_session_new (XDMCPSession *session) { SeatXDMCPSession *seat = g_object_new (SEAT_XDMCP_SESSION_TYPE, NULL); - seat->priv->session = g_object_ref (session); + SeatXDMCPSessionPrivate *priv = seat_xdmcp_session_get_instance_private (seat); + + priv->session = g_object_ref (session); return seat; } @@ -37,34 +39,36 @@ seat_xdmcp_session_new (XDMCPSession *session) static DisplayServer * seat_xdmcp_session_create_display_server (Seat *seat, Session *session) { + SeatXDMCPSessionPrivate *priv = seat_xdmcp_session_get_instance_private (SEAT_XDMCP_SESSION (seat)); + if (strcmp (session_get_session_type (session), "x") != 0) return NULL; /* Only create one server for the lifetime of this seat (XDMCP clients reconnect on logout) */ - if (SEAT_XDMCP_SESSION (seat)->priv->x_server) + if (priv->x_server) return NULL; - XAuthority *authority = xdmcp_session_get_authority (SEAT_XDMCP_SESSION (seat)->priv->session); - g_autofree gchar *host = g_inet_address_to_string (xdmcp_session_get_address (SEAT_XDMCP_SESSION (seat)->priv->session)); + XAuthority *authority = xdmcp_session_get_authority (priv->session); + g_autofree gchar *host = g_inet_address_to_string (xdmcp_session_get_address (priv->session)); - SEAT_XDMCP_SESSION (seat)->priv->x_server = x_server_remote_new (host, xdmcp_session_get_display_number (SEAT_XDMCP_SESSION (seat)->priv->session), authority); + priv->x_server = x_server_remote_new (host, xdmcp_session_get_display_number (priv->session), authority); - return g_object_ref (DISPLAY_SERVER (SEAT_XDMCP_SESSION (seat)->priv->x_server)); + return g_object_ref (DISPLAY_SERVER (priv->x_server)); } static void seat_xdmcp_session_init (SeatXDMCPSession *seat) { - seat->priv = G_TYPE_INSTANCE_GET_PRIVATE (seat, SEAT_XDMCP_SESSION_TYPE, SeatXDMCPSessionPrivate); } static void seat_xdmcp_session_finalize (GObject *object) { SeatXDMCPSession *self = SEAT_XDMCP_SESSION (object); + SeatXDMCPSessionPrivate *priv = seat_xdmcp_session_get_instance_private (self); - g_clear_object (&self->priv->session); - g_clear_object (&self->priv->x_server); + g_clear_object (&priv->session); + g_clear_object (&priv->x_server); G_OBJECT_CLASS (seat_xdmcp_session_parent_class)->finalize (object); } diff --git a/src/seat-xdmcp-session.h b/src/seat-xdmcp-session.h index a8a3621e..eee5b1f2 100644 --- a/src/seat-xdmcp-session.h +++ b/src/seat-xdmcp-session.h @@ -20,12 +20,9 @@ G_BEGIN_DECLS #define SEAT_XDMCP_SESSION_TYPE (seat_xdmcp_session_get_type()) #define SEAT_XDMCP_SESSION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SEAT_XDMCP_SESSION_TYPE, SeatXDMCPSession)) -typedef struct SeatXDMCPSessionPrivate SeatXDMCPSessionPrivate; - typedef struct { - Seat parent_instance; - SeatXDMCPSessionPrivate *priv; + Seat parent_instance; } SeatXDMCPSession; typedef struct diff --git a/src/seat-xremote.h b/src/seat-xremote.h index 2e14d36c..1e996706 100644 --- a/src/seat-xremote.h +++ b/src/seat-xremote.h @@ -22,7 +22,7 @@ G_BEGIN_DECLS typedef struct { - Seat parent_instance; + Seat parent_instance; } SeatXRemote; typedef struct diff --git a/src/seat-xvnc.c b/src/seat-xvnc.c index 17e50448..a726a9d6 100644 --- a/src/seat-xvnc.c +++ b/src/seat-xvnc.c @@ -15,21 +15,23 @@ #include "x-server-xvnc.h" #include "configuration.h" -struct SeatXVNCPrivate +typedef struct { /* VNC connection */ GSocket *connection; /* X server using VNC connection */ XServerXVNC *x_server; -}; +} SeatXVNCPrivate; G_DEFINE_TYPE_WITH_PRIVATE (SeatXVNC, seat_xvnc, SEAT_TYPE) SeatXVNC *seat_xvnc_new (GSocket *connection) { SeatXVNC *seat = g_object_new (SEAT_XVNC_TYPE, NULL); - seat->priv->connection = g_object_ref (connection); + SeatXVNCPrivate *priv = seat_xvnc_get_instance_private (seat); + + priv->connection = g_object_ref (connection); return seat; } @@ -44,19 +46,21 @@ seat_xvnc_setup (Seat *seat) static DisplayServer * seat_xvnc_create_display_server (Seat *seat, Session *session) { + SeatXVNCPrivate *priv = seat_xvnc_get_instance_private (SEAT_XVNC (seat)); + if (strcmp (session_get_session_type (session), "x") != 0) return NULL; /* Can only create one server for the lifetime of this seat (can't re-use VNC connection) */ - if (SEAT_XVNC (seat)->priv->x_server) + if (priv->x_server) return NULL; g_autoptr(XServerXVNC) x_server = x_server_xvnc_new (); - SEAT_XVNC (seat)->priv->x_server = g_object_ref (x_server); + priv->x_server = g_object_ref (x_server); g_autofree gchar *number = g_strdup_printf ("%d", x_server_get_display_number (X_SERVER (x_server))); g_autoptr(XAuthority) cookie = x_authority_new_local_cookie (number); x_server_set_authority (X_SERVER (x_server), cookie); - x_server_xvnc_set_socket (x_server, g_socket_get_fd (SEAT_XVNC (seat)->priv->connection)); + x_server_xvnc_set_socket (x_server, g_socket_get_fd (priv->connection)); const gchar *command = config_get_string (config_get_instance (), "VNCServer", "command"); if (command) @@ -85,9 +89,10 @@ seat_xvnc_create_display_server (Seat *seat, Session *session) static void seat_xvnc_run_script (Seat *seat, DisplayServer *display_server, Process *script) { + SeatXVNCPrivate *priv = seat_xvnc_get_instance_private (SEAT_XVNC (seat)); XServerXVNC *x_server = X_SERVER_XVNC (display_server); - GInetSocketAddress *address = G_INET_SOCKET_ADDRESS (g_socket_get_remote_address (SEAT_XVNC (seat)->priv->connection, NULL)); + GInetSocketAddress *address = G_INET_SOCKET_ADDRESS (g_socket_get_remote_address (priv->connection, NULL)); g_autofree gchar *hostname = g_inet_address_to_string (g_inet_socket_address_get_address (address)); const gchar *path = x_server_local_get_authority_file_path (X_SERVER_LOCAL (x_server)); @@ -101,16 +106,16 @@ seat_xvnc_run_script (Seat *seat, DisplayServer *display_server, Process *script static void seat_xvnc_init (SeatXVNC *seat) { - seat->priv = G_TYPE_INSTANCE_GET_PRIVATE (seat, SEAT_XVNC_TYPE, SeatXVNCPrivate); } static void seat_xvnc_session_finalize (GObject *object) { SeatXVNC *self = SEAT_XVNC (object); + SeatXVNCPrivate *priv = seat_xvnc_get_instance_private (self); - g_clear_object (&self->priv->connection); - g_clear_object (&self->priv->x_server); + g_clear_object (&priv->connection); + g_clear_object (&priv->x_server); G_OBJECT_CLASS (seat_xvnc_parent_class)->finalize (object); } diff --git a/src/seat-xvnc.h b/src/seat-xvnc.h index f167e236..2348a31f 100644 --- a/src/seat-xvnc.h +++ b/src/seat-xvnc.h @@ -20,12 +20,9 @@ G_BEGIN_DECLS #define SEAT_XVNC_TYPE (seat_xvnc_get_type()) #define SEAT_XVNC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SEAT_XVNC_TYPE, SeatXVNC)) -typedef struct SeatXVNCPrivate SeatXVNCPrivate; - typedef struct { - Seat parent_instance; - SeatXVNCPrivate *priv; + Seat parent_instance; } SeatXVNC; typedef struct diff --git a/src/seat.c b/src/seat.c index 7e6c4462..85134180 100644 --- a/src/seat.c +++ b/src/seat.c @@ -28,7 +28,7 @@ enum { }; static guint signals[LAST_SIGNAL] = { 0 }; -struct SeatPrivate +typedef struct { /* XDG name for this seat */ gchar *name; @@ -68,7 +68,7 @@ struct SeatPrivate /* The greeter to be started to replace the current one */ GreeterSession *replacement_greeter; -}; +} SeatPrivate; static void seat_logger_iface_init (LoggerInterface *iface); @@ -129,30 +129,35 @@ seat_new (const gchar *module_name) void seat_set_name (Seat *seat, const gchar *name) { + SeatPrivate *priv = seat_get_instance_private (seat); + g_return_if_fail (seat != NULL); - g_free (seat->priv->name); - seat->priv->name = g_strdup (name); + g_free (priv->name); + priv->name = g_strdup (name); } void seat_set_property (Seat *seat, const gchar *name, const gchar *value) { + SeatPrivate *priv = seat_get_instance_private (seat); g_return_if_fail (seat != NULL); - g_hash_table_insert (seat->priv->properties, g_strdup (name), g_strdup (value)); + g_hash_table_insert (priv->properties, g_strdup (name), g_strdup (value)); } const gchar * seat_get_string_property (Seat *seat, const gchar *name) { + SeatPrivate *priv = seat_get_instance_private (seat); g_return_val_if_fail (seat != NULL, NULL); - return g_hash_table_lookup (seat->priv->properties, name); + return g_hash_table_lookup (priv->properties, name); } gchar ** seat_get_string_list_property (Seat *seat, const gchar *name) { + SeatPrivate *priv = seat_get_instance_private (seat); g_return_val_if_fail (seat != NULL, NULL); - return g_strsplit (g_hash_table_lookup (seat->priv->properties, name), ";", 0); + return g_strsplit (g_hash_table_lookup (priv->properties, name), ";", 0); } gboolean @@ -181,41 +186,48 @@ seat_get_integer_property (Seat *seat, const gchar *name) const gchar * seat_get_name (Seat *seat) { - return seat->priv->name; + SeatPrivate *priv = seat_get_instance_private (seat); + g_return_val_if_fail (seat != NULL, NULL); + return priv->name; } void seat_set_supports_multi_session (Seat *seat, gboolean supports_multi_session) { + SeatPrivate *priv = seat_get_instance_private (seat); g_return_if_fail (seat != NULL); - seat->priv->supports_multi_session = supports_multi_session; + priv->supports_multi_session = supports_multi_session; } void seat_set_share_display_server (Seat *seat, gboolean share_display_server) { + SeatPrivate *priv = seat_get_instance_private (seat); g_return_if_fail (seat != NULL); - seat->priv->share_display_server = share_display_server; + priv->share_display_server = share_display_server; } gboolean seat_start (Seat *seat) { + SeatPrivate *priv = seat_get_instance_private (seat); + g_return_val_if_fail (seat != NULL, FALSE); l_debug (seat, "Starting"); SEAT_GET_CLASS (seat)->setup (seat); - seat->priv->started = SEAT_GET_CLASS (seat)->start (seat); + priv->started = SEAT_GET_CLASS (seat)->start (seat); - return seat->priv->started; + return priv->started; } GList * seat_get_sessions (Seat *seat) { + SeatPrivate *priv = seat_get_instance_private (seat); g_return_val_if_fail (seat != NULL, NULL); - return seat->priv->sessions; + return priv->sessions; } static gboolean @@ -228,12 +240,14 @@ set_greeter_idle (gpointer greeter) void seat_set_active_session (Seat *seat, Session *session) { + SeatPrivate *priv = seat_get_instance_private (seat); + g_return_if_fail (seat != NULL); SEAT_GET_CLASS (seat)->set_active_session (seat, session); /* Stop any greeters */ - for (GList *link = seat->priv->sessions; link; link = link->next) + for (GList *link = priv->sessions; link; link = link->next) { Session *s = link->data; @@ -245,7 +259,7 @@ seat_set_active_session (Seat *seat, Session *session) Greeter *greeter = greeter_session_get_greeter (GREETER_SESSION (s)); if (greeter_get_resettable (greeter)) { - if (seat->priv->active_session == s) + if (priv->active_session == s) { l_debug (seat, "Idling greeter"); /* Do this in an idle callback, because we might very well @@ -264,12 +278,12 @@ seat_set_active_session (Seat *seat, Session *session) } /* Lock previous sessions */ - if (seat->priv->active_session && session != seat->priv->active_session && !IS_GREETER_SESSION (seat->priv->active_session)) - session_lock (seat->priv->active_session); + if (priv->active_session && session != priv->active_session && !IS_GREETER_SESSION (priv->active_session)) + session_lock (priv->active_session); session_activate (session); - g_clear_object (&seat->priv->active_session); - seat->priv->active_session = g_object_ref (session); + g_clear_object (&priv->active_session); + priv->active_session = g_object_ref (session); } Session * @@ -282,8 +296,9 @@ seat_get_active_session (Seat *seat) Session * seat_get_next_session (Seat *seat) { + SeatPrivate *priv = seat_get_instance_private (seat); g_return_val_if_fail (seat != NULL, NULL); - return seat->priv->next_session; + return priv->next_session; } /** @@ -298,8 +313,9 @@ seat_get_next_session (Seat *seat) Session * seat_get_expected_active_session (Seat *seat) { + SeatPrivate *priv = seat_get_instance_private (seat); g_return_val_if_fail (seat != NULL, NULL); - return seat->priv->active_session; + return priv->active_session; } /** @@ -313,15 +329,18 @@ seat_get_expected_active_session (Seat *seat) void seat_set_externally_activated_session (Seat *seat, Session *session) { + SeatPrivate *priv = seat_get_instance_private (seat); g_return_if_fail (seat != NULL); - g_clear_object (&seat->priv->active_session); - seat->priv->active_session = g_object_ref (session); + g_clear_object (&priv->active_session); + priv->active_session = g_object_ref (session); } Session * seat_find_session_by_login1_id (Seat *seat, const gchar *login1_session_id) { - for (GList *session_link = seat->priv->sessions; session_link; session_link = session_link->next) + SeatPrivate *priv = seat_get_instance_private (seat); + + for (GList *session_link = priv->sessions; session_link; session_link = session_link->next) { Session *session = session_link->data; if (g_strcmp0 (login1_session_id, session_get_login1_session_id (session)) == 0) @@ -334,8 +353,9 @@ seat_find_session_by_login1_id (Seat *seat, const gchar *login1_session_id) gboolean seat_get_can_switch (Seat *seat) { + SeatPrivate *priv = seat_get_instance_private (seat); g_return_val_if_fail (seat != NULL, FALSE); - return seat_get_boolean_property (seat, "allow-user-switching") && seat->priv->supports_multi_session; + return seat_get_boolean_property (seat, "allow-user-switching") && priv->supports_multi_session; } gboolean @@ -415,12 +435,14 @@ emit_upstart_signal (const gchar *signal) static void check_stopped (Seat *seat) { - if (seat->priv->stopping && - !seat->priv->stopped && - g_list_length (seat->priv->display_servers) == 0 && - g_list_length (seat->priv->sessions) == 0) + SeatPrivate *priv = seat_get_instance_private (seat); + + if (priv->stopping && + !priv->stopped && + g_list_length (priv->display_servers) == 0 && + g_list_length (priv->sessions) == 0) { - seat->priv->stopped = TRUE; + priv->stopped = TRUE; l_debug (seat, "Stopped"); g_signal_emit (seat, signals[STOPPED], 0); } @@ -429,6 +451,8 @@ check_stopped (Seat *seat) static void display_server_stopped_cb (DisplayServer *display_server, Seat *seat) { + SeatPrivate *priv = seat_get_instance_private (seat); + l_debug (seat, "Display server stopped"); /* Run a script right after stopping the display server */ @@ -437,9 +461,9 @@ display_server_stopped_cb (DisplayServer *display_server, Seat *seat) run_script (seat, NULL, script, NULL); g_signal_handlers_disconnect_matched (display_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); - seat->priv->display_servers = g_list_remove (seat->priv->display_servers, display_server); + priv->display_servers = g_list_remove (priv->display_servers, display_server); - if (seat->priv->stopping || !seat->priv->started) + if (priv->stopping || !priv->started) { check_stopped (seat); g_object_unref (display_server); @@ -447,7 +471,7 @@ display_server_stopped_cb (DisplayServer *display_server, Seat *seat) } /* Stop all sessions on this display server */ - GList *list = g_list_copy (seat->priv->sessions); + GList *list = g_list_copy (priv->sessions); for (GList *link = list; link; link = link->next) g_object_ref (link->data); for (GList *link = list; link; link = link->next) @@ -464,7 +488,7 @@ display_server_stopped_cb (DisplayServer *display_server, Seat *seat) /* Stop seat if this is the only display server and it failed to start a greeter */ if (is_failed_greeter && - g_list_length (seat->priv->display_servers) == 0) + g_list_length (priv->display_servers) == 0) { l_debug (seat, "Stopping; greeter display server failed to start"); seat_stop (seat); @@ -472,7 +496,7 @@ display_server_stopped_cb (DisplayServer *display_server, Seat *seat) } g_list_free_full (list, g_object_unref); - if (!seat->priv->stopping) + if (!priv->stopping) { /* If we were the active session, switch to a greeter */ Session *active_session = seat_get_active_session (seat); @@ -493,13 +517,16 @@ display_server_stopped_cb (DisplayServer *display_server, Seat *seat) static gboolean can_share_display_server (Seat *seat, DisplayServer *display_server) { - return seat->priv->share_display_server && display_server_get_can_share (display_server); + SeatPrivate *priv = seat_get_instance_private (seat); + return priv->share_display_server && display_server_get_can_share (display_server); } static GreeterSession * find_greeter_session (Seat *seat) { - for (GList *link = seat->priv->sessions; link; link = link->next) + SeatPrivate *priv = seat_get_instance_private (seat); + + for (GList *link = priv->sessions; link; link = link->next) { Session *session = link->data; if (!session_get_is_stopping (session) && IS_GREETER_SESSION (session)) @@ -512,7 +539,9 @@ find_greeter_session (Seat *seat) static GreeterSession * find_resettable_greeter (Seat *seat) { - for (GList *link = seat->priv->sessions; link; link = link->next) + SeatPrivate *priv = seat_get_instance_private (seat); + + for (GList *link = priv->sessions; link; link = link->next) { Session *session = link->data; if (!session_get_is_stopping (session) && IS_GREETER_SESSION (session) && @@ -537,6 +566,8 @@ set_greeter_hints (Seat *seat, Greeter *greeter) static void switch_to_greeter_from_failed_session (Seat *seat, Session *session) { + SeatPrivate *priv = seat_get_instance_private (seat); + /* Switch to greeter if one open */ GreeterSession *greeter_session = find_resettable_greeter (seat); gboolean existing = FALSE; @@ -564,8 +595,8 @@ switch_to_greeter_from_failed_session (Seat *seat, Session *session) } else { - g_clear_object (&seat->priv->session_to_activate); - seat->priv->session_to_activate = g_object_ref (SESSION (greeter_session)); + g_clear_object (&priv->session_to_activate); + priv->session_to_activate = g_object_ref (SESSION (greeter_session)); if (can_share_display_server (seat, session_get_display_server (session))) session_set_display_server (SESSION (greeter_session), session_get_display_server (session)); @@ -594,7 +625,7 @@ start_session (Seat *seat, Session *session) if (IS_GREETER_SESSION (session)) { g_autofree gchar *log_dir = config_get_string (config_get_instance (), "LightDM", "log-directory"); - g_autofree gchar *filename = g_strdup_printf ("%s-greeter.log", seat->priv->name); + g_autofree gchar *filename = g_strdup_printf ("%s-greeter.log", seat_get_name (seat)); g_autofree gchar *log_filename = g_build_filename (log_dir, filename, NULL); gboolean backup_logs = config_get_boolean (config_get_instance (), "LightDM", "backup-logs"); session_set_log_file (session, log_filename, backup_logs ? LOG_MODE_BACKUP_AND_TRUNCATE : LOG_MODE_APPEND); @@ -617,6 +648,8 @@ start_session (Seat *seat, Session *session) static void run_session (Seat *seat, Session *session) { + SeatPrivate *priv = seat_get_instance_private (seat); + const gchar *script; if (IS_GREETER_SESSION (session)) script = seat_get_string_property (seat, "greeter-setup-script"); @@ -639,12 +672,12 @@ run_session (Seat *seat, Session *session) // FIXME: Wait until the session is ready - if (session == seat->priv->session_to_activate) + if (session == priv->session_to_activate) { seat_set_active_session (seat, session); - g_clear_object (&seat->priv->session_to_activate); + g_clear_object (&priv->session_to_activate); } - else if (seat->priv->active_session) + else if (priv->active_session) { /* Multiple sessions can theoretically be on the same VT (especially if using Mir). If a new session appears on an existing active VT, @@ -653,17 +686,19 @@ run_session (Seat *seat, Session *session) session that we want to be active. So let's be explicit and re-activate the correct session whenever a new session starts. There's no harm to do this in seats that enforce separate VTs. */ - session_activate (seat->priv->active_session); + session_activate (priv->active_session); } } static Session * find_user_session (Seat *seat, const gchar *username, Session *ignore_session) { + SeatPrivate *priv = seat_get_instance_private (seat); + if (!username) return NULL; - for (GList *link = seat->priv->sessions; link; link = link->next) + for (GList *link = priv->sessions; link; link = link->next) { Session *session = link->data; @@ -680,10 +715,11 @@ find_user_session (Seat *seat, const gchar *username, Session *ignore_session) static void greeter_active_username_changed_cb (Greeter *greeter, GParamSpec *pspec, Seat *seat) { - Session *session = find_user_session (seat, greeter_get_active_username (greeter), seat->priv->active_session); + SeatPrivate *priv = seat_get_instance_private (seat); + Session *session = find_user_session (seat, greeter_get_active_username (greeter), priv->active_session); - g_clear_object (&seat->priv->next_session); - seat->priv->next_session = session ? g_object_ref (session) : NULL; + g_clear_object (&priv->next_session); + priv->next_session = session ? g_object_ref (session) : NULL; SEAT_GET_CLASS (seat)->set_next_session (seat, session); } @@ -721,16 +757,18 @@ session_authentication_complete_cb (Session *session, Seat *seat) static void session_stopped_cb (Session *session, Seat *seat) { + SeatPrivate *priv = seat_get_instance_private (seat); + l_debug (seat, "Session stopped"); g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); - seat->priv->sessions = g_list_remove (seat->priv->sessions, session); - if (session == seat->priv->active_session) - g_clear_object (&seat->priv->active_session); - if (session == seat->priv->next_session) - g_clear_object (&seat->priv->next_session); - if (session == seat->priv->session_to_activate) - g_clear_object (&seat->priv->session_to_activate); + priv->sessions = g_list_remove (priv->sessions, session); + if (session == priv->active_session) + g_clear_object (&priv->active_session); + if (session == priv->next_session) + g_clear_object (&priv->next_session); + if (session == priv->session_to_activate) + g_clear_object (&priv->session_to_activate); DisplayServer *display_server = session_get_display_server (session); @@ -744,10 +782,10 @@ session_stopped_cb (Session *session, Seat *seat) /* We were waiting for this session, but it didn't start :( */ // FIXME: Start a greeter on this? - if (session == seat->priv->session_to_activate) - g_clear_object (&seat->priv->session_to_activate); + if (session == priv->session_to_activate) + g_clear_object (&priv->session_to_activate); - if (seat->priv->stopping) + if (priv->stopping) { check_stopped (seat); g_object_unref (session); @@ -755,10 +793,10 @@ session_stopped_cb (Session *session, Seat *seat) } /* If there is a pending replacement greeter, start it */ - if (IS_GREETER_SESSION (session) && seat->priv->replacement_greeter) + if (IS_GREETER_SESSION (session) && priv->replacement_greeter) { - GreeterSession *replacement_greeter = seat->priv->replacement_greeter; - seat->priv->replacement_greeter = NULL; + GreeterSession *replacement_greeter = priv->replacement_greeter; + priv->replacement_greeter = NULL; if (session_get_is_authenticated (SESSION (replacement_greeter))) { @@ -778,7 +816,7 @@ session_stopped_cb (Session *session, Seat *seat) can_share_display_server (seat, display_server) && greeter_get_start_session (greeter_session_get_greeter (GREETER_SESSION (session)))) { - for (GList *link = seat->priv->sessions; link; link = link->next) + for (GList *link = priv->sessions; link; link = link->next) { Session *s = link->data; @@ -802,8 +840,8 @@ session_stopped_cb (Session *session, Seat *seat) /* If this is the greeter and nothing else is running then stop the seat */ else if (IS_GREETER_SESSION (session) && !greeter_get_start_session (greeter_session_get_greeter (GREETER_SESSION (session))) && - g_list_length (seat->priv->display_servers) == 1 && - g_list_nth_data (seat->priv->display_servers, 0) == display_server) + g_list_length (priv->display_servers) == 1 && + g_list_nth_data (priv->display_servers, 0) == display_server) { l_debug (seat, "Stopping; failed to start a greeter"); seat_stop (seat); @@ -860,8 +898,10 @@ set_session_env (Session *session) static Session * create_session (Seat *seat, gboolean autostart) { + SeatPrivate *priv = seat_get_instance_private (seat); + Session *session = SEAT_GET_CLASS (seat)->create_session (seat); - seat->priv->sessions = g_list_append (seat->priv->sessions, session); + priv->sessions = g_list_append (priv->sessions, session); if (autostart) g_signal_connect (session, SESSION_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (session_authentication_complete_cb), seat); g_signal_connect (session, SESSION_SIGNAL_STOPPED, G_CALLBACK (session_stopped_cb), seat); @@ -1046,8 +1086,10 @@ create_guest_session (Seat *seat, const gchar *session_name) static Session * get_greeter_session (Seat *seat, Greeter *greeter) { + SeatPrivate *priv = seat_get_instance_private (seat); + /* Stop any greeters */ - for (GList *link = seat->priv->sessions; link; link = link->next) + for (GList *link = priv->sessions; link; link = link->next) { Session *session = link->data; @@ -1074,6 +1116,8 @@ greeter_create_session_cb (Greeter *greeter, Seat *seat) static gboolean greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *session_name, Seat *seat) { + SeatPrivate *priv = seat_get_instance_private (seat); + /* Get the session to use */ Session *session; if (greeter_get_guest_authenticated (greeter)) @@ -1134,8 +1178,8 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi } /* Switch to this session when it is ready */ - g_clear_object (&seat->priv->session_to_activate); - seat->priv->session_to_activate = session; + g_clear_object (&priv->session_to_activate); + priv->session_to_activate = session; /* Return to existing session if it is open */ const gchar *username = session_get_username (session); @@ -1186,6 +1230,8 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi static GreeterSession * create_greeter_session (Seat *seat) { + SeatPrivate *priv = seat_get_instance_private (seat); + l_debug (seat, "Creating greeter session"); g_autofree gchar *sessions_dir = config_get_string (config_get_instance (), "LightDM", "greeters-directory"); @@ -1204,7 +1250,7 @@ create_greeter_session (Seat *seat) GreeterSession *greeter_session = SEAT_GET_CLASS (seat)->create_greeter_session (seat); Greeter *greeter = greeter_session_get_greeter (greeter_session); session_set_config (SESSION (greeter_session), session_config); - seat->priv->sessions = g_list_append (seat->priv->sessions, SESSION (greeter_session)); + priv->sessions = g_list_append (priv->sessions, SESSION (greeter_session)); g_signal_connect (greeter, GREETER_SIGNAL_ACTIVE_USERNAME_CHANGED, G_CALLBACK (greeter_active_username_changed_cb), seat); g_signal_connect (greeter_session, SESSION_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (session_authentication_complete_cb), seat); g_signal_connect (greeter_session, SESSION_SIGNAL_STOPPED, G_CALLBACK (session_stopped_cb), seat); @@ -1262,7 +1308,9 @@ create_greeter_session (Seat *seat) static Session * find_session_for_display_server (Seat *seat, DisplayServer *display_server) { - for (GList *link = seat->priv->sessions; link; link = link->next) + SeatPrivate *priv = seat_get_instance_private (seat); + + for (GList *link = priv->sessions; link; link = link->next) { Session *session = link->data; @@ -1314,6 +1362,8 @@ display_server_ready_cb (DisplayServer *display_server, Seat *seat) static DisplayServer * create_display_server (Seat *seat, Session *session) { + SeatPrivate *priv = seat_get_instance_private (seat); + l_debug (seat, "Creating display server of type %s", session_get_session_type (session)); DisplayServer *display_server = SEAT_GET_CLASS (seat)->create_display_server (seat, session); @@ -1321,9 +1371,9 @@ create_display_server (Seat *seat, Session *session) return NULL; /* Remember this display server */ - if (!g_list_find (seat->priv->display_servers, display_server)) + if (!g_list_find (priv->display_servers, display_server)) { - seat->priv->display_servers = g_list_append (seat->priv->display_servers, display_server); + priv->display_servers = g_list_append (priv->display_servers, display_server); g_signal_connect (display_server, DISPLAY_SERVER_SIGNAL_READY, G_CALLBACK (display_server_ready_cb), seat); g_signal_connect (display_server, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (display_server_stopped_cb), seat); } @@ -1346,9 +1396,11 @@ start_display_server (Seat *seat, DisplayServer *display_server) gboolean seat_switch_to_greeter (Seat *seat) { + SeatPrivate *priv = seat_get_instance_private (seat); + g_return_val_if_fail (seat != NULL, FALSE); - if (!seat_get_can_switch (seat) && seat->priv->sessions != NULL) + if (!seat_get_can_switch (seat) && priv->sessions != NULL) return FALSE; /* Switch to greeter if one open */ @@ -1364,12 +1416,12 @@ seat_switch_to_greeter (Seat *seat) if (!greeter_session) return FALSE; - g_clear_object (&seat->priv->session_to_activate); - seat->priv->session_to_activate = g_object_ref (SESSION (greeter_session)); + g_clear_object (&priv->session_to_activate); + priv->session_to_activate = g_object_ref (SESSION (greeter_session)); DisplayServer *display_server = create_display_server (seat, SESSION (greeter_session)); if (!display_server) { - g_clear_object (&seat->priv->session_to_activate); + g_clear_object (&priv->session_to_activate); return FALSE; } session_set_display_server (SESSION (greeter_session), display_server); @@ -1380,6 +1432,8 @@ seat_switch_to_greeter (Seat *seat) static void switch_authentication_complete_cb (Session *session, Seat *seat) { + SeatPrivate *priv = seat_get_instance_private (seat); + /* If authenticated, then unlock existing session or start new one */ if (session_get_is_authenticated (session)) { @@ -1394,8 +1448,8 @@ switch_authentication_complete_cb (Session *session, Seat *seat) else { l_debug (seat, "Session authenticated, starting display server"); - g_clear_object (&seat->priv->session_to_activate); - seat->priv->session_to_activate = g_object_ref (session); + g_clear_object (&priv->session_to_activate); + priv->session_to_activate = g_object_ref (session); DisplayServer *display_server = create_display_server (seat, session); session_set_display_server (session, display_server); start_display_server (seat, display_server); @@ -1434,8 +1488,8 @@ switch_authentication_complete_cb (Session *session, Seat *seat) } else { - g_clear_object (&seat->priv->session_to_activate); - seat->priv->session_to_activate = g_object_ref (SESSION (greeter_session)); + g_clear_object (&priv->session_to_activate); + priv->session_to_activate = g_object_ref (SESSION (greeter_session)); DisplayServer *display_server = create_display_server (seat, SESSION (greeter_session)); session_set_display_server (SESSION (greeter_session), display_server); @@ -1446,6 +1500,8 @@ switch_authentication_complete_cb (Session *session, Seat *seat) gboolean seat_switch_to_user (Seat *seat, const gchar *username, const gchar *session_name) { + SeatPrivate *priv = seat_get_instance_private (seat); + g_return_val_if_fail (seat != NULL, FALSE); g_return_val_if_fail (username != NULL, FALSE); @@ -1454,7 +1510,7 @@ seat_switch_to_user (Seat *seat, const gchar *username, const gchar *session_nam /* If we're already on this session, then ignore */ Session *session = find_user_session (seat, username, NULL); - if (session && session == seat->priv->active_session) + if (session && session == priv->active_session) return TRUE; l_debug (seat, "Switching to user %s", username); @@ -1470,7 +1526,9 @@ seat_switch_to_user (Seat *seat, const gchar *username, const gchar *session_nam static Session * find_guest_session (Seat *seat) { - for (GList *link = seat->priv->sessions; link; link = link->next) + SeatPrivate *priv = seat_get_instance_private (seat); + + for (GList *link = priv->sessions; link; link = link->next) { Session *session = link->data; if (!session_get_is_stopping (session) && session_get_is_guest (session)) @@ -1483,6 +1541,8 @@ find_guest_session (Seat *seat) gboolean seat_switch_to_guest (Seat *seat, const gchar *session_name) { + SeatPrivate *priv = seat_get_instance_private (seat); + g_return_val_if_fail (seat != NULL, FALSE); if (!seat_get_can_switch (seat) || !seat_get_allow_guest (seat)) @@ -1503,8 +1563,8 @@ seat_switch_to_guest (Seat *seat, const gchar *session_name) DisplayServer *display_server = create_display_server (seat, session); - g_clear_object (&seat->priv->session_to_activate); - seat->priv->session_to_activate = g_object_ref (session); + g_clear_object (&priv->session_to_activate); + priv->session_to_activate = g_object_ref (session); session_set_pam_service (session, seat_get_string_property (seat, "pam-autologin-service")); session_set_display_server (session, display_server); @@ -1514,6 +1574,8 @@ seat_switch_to_guest (Seat *seat, const gchar *session_name) gboolean seat_lock (Seat *seat, const gchar *username) { + SeatPrivate *priv = seat_get_instance_private (seat); + g_return_val_if_fail (seat != NULL, FALSE); if (!seat_get_can_switch (seat)) @@ -1571,13 +1633,13 @@ seat_lock (Seat *seat, const gchar *username) display_server = create_display_server (seat, SESSION (greeter_session)); session_set_display_server (SESSION (greeter_session), display_server); - g_clear_object (&seat->priv->session_to_activate); - seat->priv->session_to_activate = g_object_ref (SESSION (greeter_session)); + g_clear_object (&priv->session_to_activate); + priv->session_to_activate = g_object_ref (SESSION (greeter_session)); if (reuse_xserver) { - g_clear_object (&seat->priv->replacement_greeter); - seat->priv->replacement_greeter = g_object_ref (greeter_session); + g_clear_object (&priv->replacement_greeter); + priv->replacement_greeter = g_object_ref (greeter_session); return TRUE; } else @@ -1588,21 +1650,24 @@ seat_lock (Seat *seat, const gchar *username) void seat_stop (Seat *seat) { + SeatPrivate *priv = seat_get_instance_private (seat); + g_return_if_fail (seat != NULL); - if (seat->priv->stopping) + if (priv->stopping) return; l_debug (seat, "Stopping"); - seat->priv->stopping = TRUE; + priv->stopping = TRUE; SEAT_GET_CLASS (seat)->stop (seat); } gboolean seat_get_is_stopping (Seat *seat) { + SeatPrivate *priv = seat_get_instance_private (seat); g_return_val_if_fail (seat != NULL, FALSE); - return seat->priv->stopping; + return priv->stopping; } static void @@ -1613,6 +1678,8 @@ seat_real_setup (Seat *seat) static gboolean seat_real_start (Seat *seat) { + SeatPrivate *priv = seat_get_instance_private (seat); + /* Get autologin settings */ const gchar *autologin_username = seat_get_string_property (seat, "autologin-user"); if (g_strcmp0 (autologin_username, "") == 0) @@ -1642,8 +1709,8 @@ seat_real_start (Seat *seat) if (session) { - g_clear_object (&seat->priv->session_to_activate); - seat->priv->session_to_activate = g_object_ref (session); + g_clear_object (&priv->session_to_activate); + priv->session_to_activate = g_object_ref (session); DisplayServer *display_server = create_display_server (seat, session); session_set_display_server (session, display_server); @@ -1668,9 +1735,9 @@ seat_real_start (Seat *seat) return FALSE; } - g_clear_object (&seat->priv->session_to_activate); + g_clear_object (&priv->session_to_activate); session = SESSION (greeter_session); - seat->priv->session_to_activate = g_object_ref (session); + priv->session_to_activate = g_object_ref (session); DisplayServer *display_server = create_display_server (seat, session); session_set_display_server (session, display_server); @@ -1712,7 +1779,9 @@ seat_real_create_display_server (Seat *seat, Session *session) static gboolean seat_real_display_server_is_used (Seat *seat, DisplayServer *display_server) { - for (GList *link = seat->priv->sessions; link; link = link->next) + SeatPrivate *priv = seat_get_instance_private (seat); + + for (GList *link = priv->sessions; link; link = link->next) { Session *session = link->data; @@ -1785,13 +1854,15 @@ seat_real_get_active_session (Seat *seat) static void seat_real_stop (Seat *seat) { + SeatPrivate *priv = seat_get_instance_private (seat); + check_stopped (seat); - if (seat->priv->stopped) + if (priv->stopped) return; /* Stop all the display servers and sessions on the seat. Copy the list as * it might be modified if a display server / session stops during this loop */ - GList *list = g_list_copy (seat->priv->display_servers); + GList *list = g_list_copy (priv->display_servers); for (GList *link = list; link; link = link->next) g_object_ref (link->data); for (GList *link = list; link; link = link->next) @@ -1804,7 +1875,7 @@ seat_real_stop (Seat *seat) } } g_list_free_full (list, g_object_unref); - list = g_list_copy (seat->priv->sessions); + list = g_list_copy (priv->sessions); for (GList *link = list; link; link = link->next) g_object_ref (link->data); for (GList *link = list; link; link = link->next) @@ -1822,34 +1893,36 @@ seat_real_stop (Seat *seat) static void seat_init (Seat *seat) { - seat->priv = G_TYPE_INSTANCE_GET_PRIVATE (seat, SEAT_TYPE, SeatPrivate); - seat->priv->properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - seat->priv->share_display_server = TRUE; + SeatPrivate *priv = seat_get_instance_private (seat); + + priv->properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + priv->share_display_server = TRUE; } static void seat_finalize (GObject *object) { Seat *self = SEAT (object); + SeatPrivate *priv = seat_get_instance_private (SEAT (self)); - g_free (self->priv->name); - g_hash_table_unref (self->priv->properties); - for (GList *link = self->priv->display_servers; link; link = link->next) + g_free (priv->name); + g_hash_table_unref (priv->properties); + for (GList *link = priv->display_servers; link; link = link->next) { DisplayServer *display_server = link->data; g_signal_handlers_disconnect_matched (display_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); } - g_list_free_full (self->priv->display_servers, g_object_unref); - for (GList *link = self->priv->sessions; link; link = link->next) + g_list_free_full (priv->display_servers, g_object_unref); + for (GList *link = priv->sessions; link; link = link->next) { Session *session = link->data; g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); } - g_list_free_full (self->priv->sessions, g_object_unref); - g_clear_object (&self->priv->active_session); - g_clear_object (&self->priv->next_session); - g_clear_object (&self->priv->session_to_activate); - g_clear_object (&self->priv->replacement_greeter); + g_list_free_full (priv->sessions, g_object_unref); + g_clear_object (&priv->active_session); + g_clear_object (&priv->next_session); + g_clear_object (&priv->session_to_activate); + g_clear_object (&priv->replacement_greeter); G_OBJECT_CLASS (seat_parent_class)->finalize (object); } @@ -1910,7 +1983,7 @@ seat_class_init (SeatClass *klass) static gint seat_real_logprefix (Logger *self, gchar *buf, gulong buflen) { - return g_snprintf (buf, buflen, "Seat %s: ", SEAT (self)->priv->name); + return g_snprintf (buf, buflen, "Seat %s: ", seat_get_name (SEAT (self))); } static void diff --git a/src/seat.h b/src/seat.h index 6fa6474e..56228833 100644 --- a/src/seat.h +++ b/src/seat.h @@ -31,12 +31,9 @@ G_BEGIN_DECLS #define SEAT_SIGNAL_SESSION_REMOVED "session-removed" #define SEAT_SIGNAL_STOPPED "stopped" -typedef struct SeatPrivate SeatPrivate; - typedef struct { - GObject parent_instance; - SeatPrivate *priv; + GObject parent_instance; } Seat; typedef struct diff --git a/src/session-config.c b/src/session-config.c index 04b0f974..e0bca920 100644 --- a/src/session-config.c +++ b/src/session-config.c @@ -11,7 +11,7 @@ #include "session-config.h" -struct SessionConfigPrivate +typedef struct { /* Session type */ gchar *session_type; @@ -24,7 +24,7 @@ struct SessionConfigPrivate /* TRUE if can run a greeter inside the session */ gboolean allow_greeter; -}; +} SessionConfigPrivate; G_DEFINE_TYPE_WITH_PRIVATE (SessionConfig, session_config, G_TYPE_OBJECT) @@ -45,25 +45,26 @@ session_config_new_from_file (const gchar *filename, const gchar *default_sessio } g_autoptr(SessionConfig) config = g_object_new (SESSION_CONFIG_TYPE, NULL); - config->priv->command = g_steal_pointer (&command); - config->priv->session_type = g_key_file_get_string (desktop_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-Session-Type", NULL); - if (!config->priv->session_type) - config->priv->session_type = g_strdup (default_session_type); - - config->priv->desktop_names = g_key_file_get_string_list (desktop_file, G_KEY_FILE_DESKTOP_GROUP, "DesktopNames", NULL, NULL); - if (!config->priv->desktop_names) + SessionConfigPrivate *priv = session_config_get_instance_private (config); + priv->command = g_steal_pointer (&command); + priv->session_type = g_key_file_get_string (desktop_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-Session-Type", NULL); + if (!priv->session_type) + priv->session_type = g_strdup (default_session_type); + + priv->desktop_names = g_key_file_get_string_list (desktop_file, G_KEY_FILE_DESKTOP_GROUP, "DesktopNames", NULL, NULL); + if (!priv->desktop_names) { gchar *name; name = g_key_file_get_string (desktop_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-DesktopName", NULL); if (name) { - config->priv->desktop_names = g_malloc (sizeof (gchar *) * 2); - config->priv->desktop_names[0] = name; - config->priv->desktop_names[1] = NULL; + priv->desktop_names = g_malloc (sizeof (gchar *) * 2); + priv->desktop_names[0] = name; + priv->desktop_names[1] = NULL; } } - config->priv->allow_greeter = g_key_file_get_boolean (desktop_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-Allow-Greeter", NULL); + priv->allow_greeter = g_key_file_get_boolean (desktop_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-Allow-Greeter", NULL); return g_steal_pointer (&config); } @@ -71,45 +72,49 @@ session_config_new_from_file (const gchar *filename, const gchar *default_sessio const gchar * session_config_get_command (SessionConfig *config) { + SessionConfigPrivate *priv = session_config_get_instance_private (config); g_return_val_if_fail (config != NULL, NULL); - return config->priv->command; + return priv->command; } const gchar * session_config_get_session_type (SessionConfig *config) { + SessionConfigPrivate *priv = session_config_get_instance_private (config); g_return_val_if_fail (config != NULL, NULL); - return config->priv->session_type; + return priv->session_type; } gchar ** session_config_get_desktop_names (SessionConfig *config) { + SessionConfigPrivate *priv = session_config_get_instance_private (config); g_return_val_if_fail (config != NULL, NULL); - return config->priv->desktop_names; + return priv->desktop_names; } gboolean session_config_get_allow_greeter (SessionConfig *config) { + SessionConfigPrivate *priv = session_config_get_instance_private (config); g_return_val_if_fail (config != NULL, FALSE); - return config->priv->allow_greeter; + return priv->allow_greeter; } static void session_config_init (SessionConfig *config) { - config->priv = G_TYPE_INSTANCE_GET_PRIVATE (config, SESSION_CONFIG_TYPE, SessionConfigPrivate); } static void session_config_finalize (GObject *object) { SessionConfig *self = SESSION_CONFIG (object); + SessionConfigPrivate *priv = session_config_get_instance_private (self); - g_clear_pointer (&self->priv->session_type, g_free); - g_clear_pointer (&self->priv->desktop_names, g_strfreev); - g_clear_pointer (&self->priv->command, g_free); + g_clear_pointer (&priv->session_type, g_free); + g_clear_pointer (&priv->desktop_names, g_strfreev); + g_clear_pointer (&priv->command, g_free); G_OBJECT_CLASS (session_config_parent_class)->finalize (object); } diff --git a/src/session-config.h b/src/session-config.h index 226aa7dc..247abb37 100644 --- a/src/session-config.h +++ b/src/session-config.h @@ -21,12 +21,9 @@ G_BEGIN_DECLS #define SESSION_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SESSION_CONFIG_TYPE, SessionConfigClass)) #define SESSION_CONFIG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SESSION_CONFIG_TYPE, SessionConfigClass)) -typedef struct SessionConfigPrivate SessionConfigPrivate; - typedef struct { - GObject parent_instance; - SessionConfigPrivate *priv; + GObject parent_instance; } SessionConfig; typedef struct diff --git a/src/session.c b/src/session.c index 43b9d382..2ea9352a 100644 --- a/src/session.c +++ b/src/session.c @@ -38,7 +38,7 @@ enum { }; static guint signals[LAST_SIGNAL] = { 0 }; -struct SessionPrivate +typedef struct { /* Configuration for this session */ SessionConfig *config; @@ -119,7 +119,7 @@ struct SessionPrivate /* TRUE if stopping this session */ gboolean stopping; -}; +} SessionPrivate; /* Maximum length of a string to pass between daemon and session */ #define MAX_STRING_LENGTH 65535 @@ -140,139 +140,159 @@ session_new (void) void session_set_config (Session *session, SessionConfig *config) { + SessionPrivate *priv = session_get_instance_private (session); + g_return_if_fail (session != NULL); - g_clear_object (&session->priv->config); - session->priv->config = g_object_ref (config); + g_clear_object (&priv->config); + priv->config = g_object_ref (config); } SessionConfig * session_get_config (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); g_return_val_if_fail (session != NULL, NULL); - return session->priv->config; + return priv->config; } const gchar * session_get_session_type (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); g_return_val_if_fail (session != NULL, NULL); - return session_config_get_session_type (session->priv->config); + return session_config_get_session_type (priv->config); } void session_set_pam_service (Session *session, const gchar *pam_service) { + SessionPrivate *priv = session_get_instance_private (session); g_return_if_fail (session != NULL); - g_free (session->priv->pam_service); - session->priv->pam_service = g_strdup (pam_service); + g_free (priv->pam_service); + priv->pam_service = g_strdup (pam_service); } void session_set_username (Session *session, const gchar *username) { + SessionPrivate *priv = session_get_instance_private (session); g_return_if_fail (session != NULL); - g_free (session->priv->username); - session->priv->username = g_strdup (username); + g_free (priv->username); + priv->username = g_strdup (username); } void session_set_do_authenticate (Session *session, gboolean do_authenticate) { + SessionPrivate *priv = session_get_instance_private (session); g_return_if_fail (session != NULL); - session->priv->do_authenticate = do_authenticate; + priv->do_authenticate = do_authenticate; } void session_set_is_interactive (Session *session, gboolean is_interactive) { + SessionPrivate *priv = session_get_instance_private (session); g_return_if_fail (session != NULL); - session->priv->is_interactive = is_interactive; + priv->is_interactive = is_interactive; } void session_set_is_guest (Session *session, gboolean is_guest) { + SessionPrivate *priv = session_get_instance_private (session); g_return_if_fail (session != NULL); - session->priv->is_guest = is_guest; + priv->is_guest = is_guest; } gboolean session_get_is_guest (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); g_return_val_if_fail (session != NULL, FALSE); - return session->priv->is_guest; + return priv->is_guest; } void session_set_log_file (Session *session, const gchar *filename, LogMode log_mode) { + SessionPrivate *priv = session_get_instance_private (session); g_return_if_fail (session != NULL); - g_free (session->priv->log_filename); - session->priv->log_filename = g_strdup (filename); - session->priv->log_mode = log_mode; + g_free (priv->log_filename); + priv->log_filename = g_strdup (filename); + priv->log_mode = log_mode; } void session_set_display_server (Session *session, DisplayServer *display_server) { + SessionPrivate *priv = session_get_instance_private (session); + g_return_if_fail (session != NULL); g_return_if_fail (display_server != NULL); - if (session->priv->display_server == display_server) + if (priv->display_server == display_server) return; - if (session->priv->display_server) - display_server_disconnect_session (session->priv->display_server, session); - g_clear_object (&session->priv->display_server); - session->priv->display_server = g_object_ref (display_server); + if (priv->display_server) + display_server_disconnect_session (priv->display_server, session); + g_clear_object (&priv->display_server); + priv->display_server = g_object_ref (display_server); } DisplayServer * session_get_display_server (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); g_return_val_if_fail (session != NULL, NULL); - return session->priv->display_server; + return priv->display_server; } void session_set_tty (Session *session, const gchar *tty) { + SessionPrivate *priv = session_get_instance_private (session); g_return_if_fail (session != NULL); - g_free (session->priv->tty); - session->priv->tty = g_strdup (tty); + g_free (priv->tty); + priv->tty = g_strdup (tty); } void session_set_xdisplay (Session *session, const gchar *xdisplay) { + SessionPrivate *priv = session_get_instance_private (session); g_return_if_fail (session != NULL); - g_free (session->priv->xdisplay); - session->priv->xdisplay = g_strdup (xdisplay); + g_free (priv->xdisplay); + priv->xdisplay = g_strdup (xdisplay); } void session_set_x_authority (Session *session, XAuthority *authority, gboolean use_system_location) { + SessionPrivate *priv = session_get_instance_private (session); g_return_if_fail (session != NULL); - g_clear_object (&session->priv->x_authority); + g_clear_object (&priv->x_authority); if (authority) - session->priv->x_authority = g_object_ref (authority); - session->priv->x_authority_use_system_location = use_system_location; + priv->x_authority = g_object_ref (authority); + priv->x_authority_use_system_location = use_system_location; } void session_set_remote_host_name (Session *session, const gchar *remote_host_name) { + SessionPrivate *priv = session_get_instance_private (session); g_return_if_fail (session != NULL); - g_free (session->priv->remote_host_name); - session->priv->remote_host_name = g_strdup (remote_host_name); + g_free (priv->remote_host_name); + priv->remote_host_name = g_strdup (remote_host_name); } static GList * find_env_entry (Session *session, const gchar *name) { - for (GList *link = session->priv->env; link; link = link->next) + SessionPrivate *priv = session_get_instance_private (session); + + for (GList *link = priv->env; link; link = link->next) { const gchar *entry = link->data; @@ -286,6 +306,8 @@ find_env_entry (Session *session, const gchar *name) void session_set_env (Session *session, const gchar *name, const gchar *value) { + SessionPrivate *priv = session_get_instance_private (session); + g_return_if_fail (session != NULL); g_return_if_fail (value != NULL); @@ -298,7 +320,7 @@ session_set_env (Session *session, const gchar *name, const gchar *value) link->data = entry; } else - session->priv->env = g_list_append (session->priv->env, entry); + priv->env = g_list_append (priv->env, entry); } const gchar * @@ -316,6 +338,8 @@ session_get_env (Session *session, const gchar *name) void session_unset_env (Session *session, const gchar *name) { + SessionPrivate *priv = session_get_instance_private (session); + g_return_if_fail (session != NULL); GList *link = find_env_entry (session, name); @@ -323,34 +347,38 @@ session_unset_env (Session *session, const gchar *name) return; g_free (link->data); - session->priv->env = g_list_delete_link (session->priv->env, link); + priv->env = g_list_delete_link (priv->env, link); } void session_set_argv (Session *session, gchar **argv) { + SessionPrivate *priv = session_get_instance_private (session); g_return_if_fail (session != NULL); - session->priv->argv = g_strdupv (argv); + priv->argv = g_strdupv (argv); } User * session_get_user (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); + g_return_val_if_fail (session != NULL, NULL); - if (session->priv->username == NULL) + if (priv->username == NULL) return NULL; - if (!session->priv->user) - session->priv->user = accounts_get_user_by_name (session->priv->username); + if (!priv->user) + priv->user = accounts_get_user_by_name (priv->username); - return session->priv->user; + return priv->user; } static void write_data (Session *session, const void *buf, size_t count) { - if (write (session->priv->to_child_input, buf, count) != count) + SessionPrivate *priv = session_get_instance_private (session); + if (write (priv->to_child_input, buf, count) != count) l_warning (session, "Error writing to session: %s", strerror (errno)); } @@ -366,28 +394,32 @@ write_string (Session *session, const char *value) static void write_xauth (Session *session, XAuthority *x_authority) { + SessionPrivate *priv = session_get_instance_private (session); + if (!x_authority) { write_string (session, NULL); return; } - write_string (session, x_authority_get_authorization_name (session->priv->x_authority)); - guint16 family = x_authority_get_family (session->priv->x_authority); + write_string (session, x_authority_get_authorization_name (priv->x_authority)); + guint16 family = x_authority_get_family (priv->x_authority); write_data (session, &family, sizeof (family)); - gsize length = x_authority_get_address_length (session->priv->x_authority); + gsize length = x_authority_get_address_length (priv->x_authority); write_data (session, &length, sizeof (length)); - write_data (session, x_authority_get_address (session->priv->x_authority), length); - write_string (session, x_authority_get_number (session->priv->x_authority)); - length = x_authority_get_authorization_data_length (session->priv->x_authority); + write_data (session, x_authority_get_address (priv->x_authority), length); + write_string (session, x_authority_get_number (priv->x_authority)); + length = x_authority_get_authorization_data_length (priv->x_authority); write_data (session, &length, sizeof (length)); - write_data (session, x_authority_get_authorization_data (session->priv->x_authority), length); + write_data (session, x_authority_get_authorization_data (priv->x_authority), length); } static ssize_t read_from_child (Session *session, void *buf, size_t count) { - ssize_t n_read = read (session->priv->from_child_output, buf, count); + SessionPrivate *priv = session_get_instance_private (session); + + ssize_t n_read = read (priv->from_child_output, buf, count); if (n_read < 0) l_warning (session, "Error reading from session: %s", strerror (errno)); return n_read; @@ -418,8 +450,9 @@ static void session_watch_cb (GPid pid, gint status, gpointer data) { Session *session = data; + SessionPrivate *priv = session_get_instance_private (session); - session->priv->child_watch = 0; + priv->child_watch = 0; if (WIFEXITED (status)) l_debug (session, "Exited with return value %d", WEXITSTATUS (status)); @@ -427,24 +460,24 @@ session_watch_cb (GPid pid, gint status, gpointer data) l_debug (session, "Terminated with signal %d", WTERMSIG (status)); /* do this as late as possible for log messages prefix */ - session->priv->pid = 0; + priv->pid = 0; /* If failed during authentication then report this as an authentication failure */ - if (session->priv->authentication_started && !session->priv->authentication_complete) + if (priv->authentication_started && !priv->authentication_complete) { l_debug (session, "Failed during authentication"); - session->priv->authentication_complete = TRUE; - session->priv->authentication_result = PAM_CONV_ERR; - g_free (session->priv->authentication_result_string); - session->priv->authentication_result_string = g_strdup ("Authentication stopped before completion"); + priv->authentication_complete = TRUE; + priv->authentication_result = PAM_CONV_ERR; + g_free (priv->authentication_result_string); + priv->authentication_result_string = g_strdup ("Authentication stopped before completion"); g_signal_emit (G_OBJECT (session), signals[AUTHENTICATION_COMPLETE], 0); } g_signal_emit (G_OBJECT (session), signals[STOPPED], 0); /* Delete account if it is a guest one */ - if (session->priv->is_guest) - guest_account_cleanup (session->priv->username); + if (priv->is_guest) + guest_account_cleanup (priv->username); /* Drop our reference on the child process, it has terminated */ g_object_unref (session); @@ -454,21 +487,22 @@ static gboolean from_child_cb (GIOChannel *source, GIOCondition condition, gpointer data) { Session *session = data; + SessionPrivate *priv = session_get_instance_private (session); /* Remote end gone */ if (condition == G_IO_HUP) { - session->priv->from_child_watch = 0; + priv->from_child_watch = 0; return FALSE; } /* Get the username currently being authenticated (may change during authentication) */ g_autofree gchar *username = read_string_from_child (session); - if (g_strcmp0 (username, session->priv->username) != 0) + if (g_strcmp0 (username, priv->username) != 0) { - g_free (session->priv->username); - session->priv->username = g_steal_pointer (&username); - g_clear_object (&session->priv->user); + g_free (priv->username); + priv->username = g_steal_pointer (&username); + g_clear_object (&priv->user); } /* Check if authentication completed */ @@ -478,21 +512,21 @@ from_child_cb (GIOChannel *source, GIOCondition condition, gpointer data) l_debug (session, "Error reading from child: %s", strerror (errno)); if (n_read <= 0) { - session->priv->from_child_watch = 0; + priv->from_child_watch = 0; return FALSE; } if (auth_complete) { - session->priv->authentication_complete = TRUE; - read_from_child (session, &session->priv->authentication_result, sizeof (session->priv->authentication_result)); - g_free (session->priv->authentication_result_string); - session->priv->authentication_result_string = read_string_from_child (session); + priv->authentication_complete = TRUE; + read_from_child (session, &priv->authentication_result, sizeof (priv->authentication_result)); + g_free (priv->authentication_result_string); + priv->authentication_result_string = read_string_from_child (session); - l_debug (session, "Authentication complete with return value %d: %s", session->priv->authentication_result, session->priv->authentication_result_string); + l_debug (session, "Authentication complete with return value %d: %s", priv->authentication_result, priv->authentication_result_string); /* No longer expect any more messages */ - session->priv->from_child_watch = 0; + priv->from_child_watch = 0; g_signal_emit (G_OBJECT (session), signals[AUTHENTICATION_COMPLETE], 0); @@ -500,17 +534,17 @@ from_child_cb (GIOChannel *source, GIOCondition condition, gpointer data) } else { - session->priv->messages_length = 0; - read_from_child (session, &session->priv->messages_length, sizeof (session->priv->messages_length)); - session->priv->messages = calloc (session->priv->messages_length, sizeof (struct pam_message)); - for (int i = 0; i < session->priv->messages_length; i++) + priv->messages_length = 0; + read_from_child (session, &priv->messages_length, sizeof (priv->messages_length)); + priv->messages = calloc (priv->messages_length, sizeof (struct pam_message)); + for (int i = 0; i < priv->messages_length; i++) { - struct pam_message *m = &session->priv->messages[i]; + struct pam_message *m = &priv->messages[i]; read_from_child (session, &m->msg_style, sizeof (m->msg_style)); m->msg = read_string_from_child (session); } - l_debug (session, "Got %d message(s) from PAM", session->priv->messages_length); + l_debug (session, "Got %d message(s) from PAM", priv->messages_length); g_signal_emit (G_OBJECT (session), signals[GOT_MESSAGES], 0); } @@ -528,7 +562,8 @@ session_start (Session *session) gboolean session_get_is_started (Session *session) { - return session->priv->pid != 0; + SessionPrivate *priv = session_get_instance_private (session); + return priv->pid != 0; } static Greeter * @@ -542,10 +577,12 @@ create_greeter_cb (GreeterSocket *socket, Session *session) static gboolean session_real_start (Session *session) { - g_return_val_if_fail (session->priv->pid == 0, FALSE); + SessionPrivate *priv = session_get_instance_private (session); - if (session->priv->display_server) - display_server_connect_session (session->priv->display_server, session); + g_return_val_if_fail (priv->pid == 0, FALSE); + + if (priv->display_server) + display_server_connect_session (priv->display_server, session); /* Create pipes to talk to the child */ int to_child_pipe[2], from_child_pipe[2]; @@ -555,29 +592,29 @@ session_real_start (Session *session) return FALSE; } int to_child_output = to_child_pipe[0]; - session->priv->to_child_input = to_child_pipe[1]; - session->priv->from_child_output = from_child_pipe[0]; + priv->to_child_input = to_child_pipe[1]; + priv->from_child_output = from_child_pipe[0]; int from_child_input = from_child_pipe[1]; - session->priv->from_child_channel = g_io_channel_unix_new (session->priv->from_child_output); - session->priv->from_child_watch = g_io_add_watch (session->priv->from_child_channel, G_IO_IN | G_IO_HUP, from_child_cb, session); + priv->from_child_channel = g_io_channel_unix_new (priv->from_child_output); + priv->from_child_watch = g_io_add_watch (priv->from_child_channel, G_IO_IN | G_IO_HUP, from_child_cb, session); /* Don't allow the daemon end of the pipes to be accessed in child processes */ - fcntl (session->priv->to_child_input, F_SETFD, FD_CLOEXEC); - fcntl (session->priv->from_child_output, F_SETFD, FD_CLOEXEC); + fcntl (priv->to_child_input, F_SETFD, FD_CLOEXEC); + fcntl (priv->from_child_output, F_SETFD, FD_CLOEXEC); /* Create the guest account if it is one */ - if (session->priv->is_guest && session->priv->username == NULL) + if (priv->is_guest && priv->username == NULL) { - session->priv->username = guest_account_setup (); - if (!session->priv->username) + priv->username = guest_account_setup (); + if (!priv->username) return FALSE; } /* Run the child */ g_autofree gchar *arg0 = g_strdup_printf ("%d", to_child_output); g_autofree gchar *arg1 = g_strdup_printf ("%d", from_child_input); - session->priv->pid = fork (); - if (session->priv->pid == 0) + priv->pid = fork (); + if (priv->pid == 0) { /* Run us again in session child mode */ execlp ("lightdm", @@ -587,7 +624,7 @@ session_real_start (Session *session) _exit (EXIT_FAILURE); } - if (session->priv->pid < 0) + if (priv->pid < 0) { g_debug ("Failed to fork session child process: %s", strerror (errno)); return FALSE; @@ -599,8 +636,8 @@ session_real_start (Session *session) g_object_ref (session); /* Listen for session termination */ - session->priv->authentication_started = TRUE; - session->priv->child_watch = g_child_watch_add (session->priv->pid, session_watch_cb, session); + priv->authentication_started = TRUE; + priv->child_watch = g_child_watch_add (priv->pid, session_watch_cb, session); /* Close the ends of the pipes we don't need */ close (to_child_output); @@ -611,17 +648,17 @@ session_real_start (Session *session) write_data (session, &version, sizeof (version)); /* Send configuration */ - write_string (session, session->priv->pam_service); - write_string (session, session->priv->username); - write_data (session, &session->priv->do_authenticate, sizeof (session->priv->do_authenticate)); - write_data (session, &session->priv->is_interactive, sizeof (session->priv->is_interactive)); + write_string (session, priv->pam_service); + write_string (session, priv->username); + write_data (session, &priv->do_authenticate, sizeof (priv->do_authenticate)); + write_data (session, &priv->is_interactive, sizeof (priv->is_interactive)); write_string (session, NULL); /* Used to be class, now we just use the environment variable */ - write_string (session, session->priv->tty); - write_string (session, session->priv->remote_host_name); - write_string (session, session->priv->xdisplay); - write_xauth (session, session->priv->x_authority); + write_string (session, priv->tty); + write_string (session, priv->remote_host_name); + write_string (session, priv->xdisplay); + write_xauth (session, priv->x_authority); - l_debug (session, "Started with service '%s', username '%s'", session->priv->pam_service, session->priv->username); + l_debug (session, "Started with service '%s', username '%s'", priv->pam_service, priv->username); return TRUE; } @@ -629,43 +666,48 @@ session_real_start (Session *session) const gchar * session_get_username (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); g_return_val_if_fail (session != NULL, NULL); - return session->priv->username; + return priv->username; } const gchar * session_get_login1_session_id (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); g_return_val_if_fail (session != NULL, NULL); - return session->priv->login1_session_id; + return priv->login1_session_id; } const gchar * session_get_console_kit_cookie (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); g_return_val_if_fail (session != NULL, NULL); - return session->priv->console_kit_cookie; + return priv->console_kit_cookie; } void session_respond (Session *session, struct pam_response *response) { + SessionPrivate *priv = session_get_instance_private (session); + g_return_if_fail (session != NULL); int error = PAM_SUCCESS; write_data (session, &error, sizeof (error)); - for (int i = 0; i < session->priv->messages_length; i++) + for (int i = 0; i < priv->messages_length; i++) { write_string (session, response[i].resp); write_data (session, &response[i].resp_retcode, sizeof (response[i].resp_retcode)); } /* Delete the old messages */ - for (int i = 0; i < session->priv->messages_length; i++) - g_free ((char *) session->priv->messages[i].msg); - g_free (session->priv->messages); - session->priv->messages = NULL; - session->priv->messages_length = 0; + for (int i = 0; i < priv->messages_length; i++) + g_free ((char *) priv->messages[i].msg); + g_free (priv->messages); + priv->messages = NULL; + priv->messages_length = 0; } void @@ -680,75 +722,84 @@ session_respond_error (Session *session, int error) int session_get_messages_length (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); g_return_val_if_fail (session != NULL, 0); - return session->priv->messages_length; + return priv->messages_length; } const struct pam_message * session_get_messages (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); g_return_val_if_fail (session != NULL, NULL); - return session->priv->messages; + return priv->messages; } gboolean session_get_is_authenticated (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); g_return_val_if_fail (session != NULL, FALSE); - return session->priv->authentication_complete && session->priv->authentication_result == PAM_SUCCESS; + return priv->authentication_complete && priv->authentication_result == PAM_SUCCESS; } int session_get_authentication_result (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); g_return_val_if_fail (session != NULL, 0); - return session->priv->authentication_result; + return priv->authentication_result; } const gchar * session_get_authentication_result_string (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); g_return_val_if_fail (session != NULL, NULL); - return session->priv->authentication_result_string; + return priv->authentication_result_string; } void session_run (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); g_return_if_fail (session != NULL); - g_return_if_fail (session->priv->display_server != NULL); + g_return_if_fail (priv->display_server != NULL); return SESSION_GET_CLASS (session)->run (session); } gboolean session_get_is_run (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); g_return_val_if_fail (session != NULL, FALSE); - return session->priv->command_run; + return priv->command_run; } static void session_real_run (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); + g_return_if_fail (session != NULL); - g_return_if_fail (!session->priv->command_run); + g_return_if_fail (!priv->command_run); g_return_if_fail (session_get_is_authenticated (session)); - g_return_if_fail (session->priv->argv != NULL); - g_return_if_fail (session->priv->pid != 0); + g_return_if_fail (priv->argv != NULL); + g_return_if_fail (priv->pid != 0); - display_server_connect_session (session->priv->display_server, session); + display_server_connect_session (priv->display_server, session); - session->priv->command_run = TRUE; + priv->command_run = TRUE; - g_autofree gchar *command = g_strjoinv (" ", session->priv->argv); + g_autofree gchar *command = g_strjoinv (" ", priv->argv); l_debug (session, "Running command %s", command); /* Create authority location */ g_autofree gchar *x_authority_filename = NULL; - if (session->priv->x_authority_use_system_location) + if (priv->x_authority_use_system_location) { g_autofree gchar *run_dir = config_get_string (config_get_instance (), "LightDM", "run-directory"); - g_autofree gchar *dir = g_build_filename (run_dir, session->priv->username, NULL); + g_autofree gchar *dir = g_build_filename (run_dir, priv->username, NULL); if (g_mkdir_with_parents (dir, S_IRWXU) < 0) l_warning (session, "Failed to set create system authority dir %s: %s", dir, strerror (errno)); @@ -764,18 +815,18 @@ session_real_run (Session *session) x_authority_filename = g_build_filename (user_get_home_directory (session_get_user (session)), ".Xauthority", NULL); /* Make sure shared user directory for this user exists */ - if (!session->priv->remote_host_name) + if (!priv->remote_host_name) { - g_autofree gchar *data_dir = shared_data_manager_ensure_user_dir (shared_data_manager_get_instance (), session->priv->username); + g_autofree gchar *data_dir = shared_data_manager_ensure_user_dir (shared_data_manager_get_instance (), priv->username); if (data_dir) session_set_env (session, "XDG_GREETER_DATA_DIR", data_dir); } /* Open socket to allow in-session greeter */ - if (session->priv->config && session_config_get_allow_greeter (session->priv->config)) + if (priv->config && session_config_get_allow_greeter (priv->config)) { g_autofree gchar *run_dir = config_get_string (config_get_instance (), "LightDM", "run-directory"); - g_autofree gchar *dir = g_build_filename (run_dir, session->priv->username, NULL); + g_autofree gchar *dir = g_build_filename (run_dir, priv->username, NULL); if (g_mkdir_with_parents (dir, S_IRWXU) < 0) l_warning (session, "Failed to create greeter socket dir %s: %s", dir, strerror (errno)); @@ -786,93 +837,104 @@ session_real_run (Session *session) } g_autofree gchar *path = g_build_filename (dir, "greeter-socket", NULL); - session->priv->greeter_socket = greeter_socket_new (path); - g_signal_connect (session->priv->greeter_socket, GREETER_SOCKET_SIGNAL_CREATE_GREETER, G_CALLBACK (create_greeter_cb), session); + priv->greeter_socket = greeter_socket_new (path); + g_signal_connect (priv->greeter_socket, GREETER_SOCKET_SIGNAL_CREATE_GREETER, G_CALLBACK (create_greeter_cb), session); session_set_env (session, "LIGHTDM_GREETER_PIPE", path); g_autoptr(GError) error = NULL; - if (!greeter_socket_start (session->priv->greeter_socket, &error)) + if (!greeter_socket_start (priv->greeter_socket, &error)) l_warning (session, "Failed to start greeter socket: %s\n", error->message); } - if (session->priv->log_filename) - l_debug (session, "Logging to %s", session->priv->log_filename); - write_string (session, session->priv->log_filename); - write_data (session, &session->priv->log_mode, sizeof (session->priv->log_mode)); - write_string (session, session->priv->tty); + if (priv->log_filename) + l_debug (session, "Logging to %s", priv->log_filename); + write_string (session, priv->log_filename); + write_data (session, &priv->log_mode, sizeof (priv->log_mode)); + write_string (session, priv->tty); write_string (session, x_authority_filename); - write_string (session, session->priv->xdisplay); - write_xauth (session, session->priv->x_authority); - gsize argc = g_list_length (session->priv->env); + write_string (session, priv->xdisplay); + write_xauth (session, priv->x_authority); + gsize argc = g_list_length (priv->env); write_data (session, &argc, sizeof (argc)); - for (GList *link = session->priv->env; link; link = link->next) + for (GList *link = priv->env; link; link = link->next) write_string (session, (gchar *) link->data); - argc = g_strv_length (session->priv->argv); + argc = g_strv_length (priv->argv); write_data (session, &argc, sizeof (argc)); for (gsize i = 0; i < argc; i++) - write_string (session, session->priv->argv[i]); + write_string (session, priv->argv[i]); - session->priv->login1_session_id = read_string_from_child (session); - session->priv->console_kit_cookie = read_string_from_child (session); + priv->login1_session_id = read_string_from_child (session); + priv->console_kit_cookie = read_string_from_child (session); } void session_lock (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); + g_return_if_fail (session != NULL); + if (getuid () == 0) { - if (session->priv->login1_session_id) - login1_service_lock_session (login1_service_get_instance (), session->priv->login1_session_id); - else if (session->priv->console_kit_cookie) - ck_lock_session (session->priv->console_kit_cookie); + if (priv->login1_session_id) + login1_service_lock_session (login1_service_get_instance (), priv->login1_session_id); + else if (priv->console_kit_cookie) + ck_lock_session (priv->console_kit_cookie); } } void session_unlock (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); + g_return_if_fail (session != NULL); + if (getuid () == 0) { - if (session->priv->login1_session_id) - login1_service_unlock_session (login1_service_get_instance (), session->priv->login1_session_id); - else if (session->priv->console_kit_cookie) - ck_unlock_session (session->priv->console_kit_cookie); + if (priv->login1_session_id) + login1_service_unlock_session (login1_service_get_instance (), priv->login1_session_id); + else if (priv->console_kit_cookie) + ck_unlock_session (priv->console_kit_cookie); } } void session_activate (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); + g_return_if_fail (session != NULL); + if (getuid () == 0) { - if (session->priv->login1_session_id) - login1_service_activate_session (login1_service_get_instance (), session->priv->login1_session_id); - else if (session->priv->console_kit_cookie) - ck_activate_session (session->priv->console_kit_cookie); + if (priv->login1_session_id) + login1_service_activate_session (login1_service_get_instance (), priv->login1_session_id); + else if (priv->console_kit_cookie) + ck_activate_session (priv->console_kit_cookie); } } void session_stop (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); + g_return_if_fail (session != NULL); - if (session->priv->stopping) + if (priv->stopping) return; - session->priv->stopping = TRUE; + priv->stopping = TRUE; /* Kill remaining processes in our logind session to avoid them leaking * to the user session (they share the same $DISPLAY) */ - if (getuid () == 0 && session->priv->login1_session_id) - login1_service_terminate_session (login1_service_get_instance (), session->priv->login1_session_id); + if (getuid () == 0 && priv->login1_session_id) + login1_service_terminate_session (login1_service_get_instance (), priv->login1_session_id); /* If can cleanly stop then do that */ - if (session_get_is_authenticated (session) && !session->priv->command_run) + if (session_get_is_authenticated (session) && !priv->command_run) { - session->priv->command_run = TRUE; + priv->command_run = TRUE; write_string (session, NULL); // log filename LogMode log_mode = LOG_MODE_INVALID; write_data (session, &log_mode, sizeof (log_mode)); // log mode @@ -892,12 +954,14 @@ session_stop (Session *session) static void session_real_stop (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); + g_return_if_fail (session != NULL); - if (session->priv->pid > 0) + if (priv->pid > 0) { l_debug (session, "Sending SIGTERM"); - kill (session->priv->pid, SIGTERM); + kill (priv->pid, SIGTERM); // FIXME: Handle timeout } else @@ -907,52 +971,55 @@ session_real_stop (Session *session) gboolean session_get_is_stopping (Session *session) { + SessionPrivate *priv = session_get_instance_private (session); g_return_val_if_fail (session != NULL, FALSE); - return session->priv->stopping; + return priv->stopping; } static void session_init (Session *session) { - session->priv = G_TYPE_INSTANCE_GET_PRIVATE (session, SESSION_TYPE, SessionPrivate); - session->priv->log_filename = g_strdup (".xsession-errors"); - session->priv->log_mode = LOG_MODE_BACKUP_AND_TRUNCATE; - session->priv->to_child_input = -1; - session->priv->from_child_output = -1; + SessionPrivate *priv = session_get_instance_private (session); + + priv->log_filename = g_strdup (".xsession-errors"); + priv->log_mode = LOG_MODE_BACKUP_AND_TRUNCATE; + priv->to_child_input = -1; + priv->from_child_output = -1; } static void session_finalize (GObject *object) { Session *self = SESSION (object); - - g_clear_object (&self->priv->config); - g_clear_object (&self->priv->display_server); - if (self->priv->pid) - kill (self->priv->pid, SIGKILL); - close (self->priv->to_child_input); - close (self->priv->from_child_output); - g_clear_pointer (&self->priv->from_child_channel, g_io_channel_unref); - if (self->priv->from_child_watch) - g_source_remove (self->priv->from_child_watch); - if (self->priv->child_watch) - g_source_remove (self->priv->child_watch); - g_clear_pointer (&self->priv->username, g_free); - g_clear_object (&self->priv->user); - g_clear_pointer (&self->priv->pam_service, g_free); - for (int i = 0; i < self->priv->messages_length; i++) - g_free ((char *) self->priv->messages[i].msg); - g_clear_pointer (&self->priv->messages, g_free); - g_clear_pointer (&self->priv->authentication_result_string, g_free); - g_clear_pointer (&self->priv->log_filename, g_free); - g_clear_pointer (&self->priv->tty, g_free); - g_clear_pointer (&self->priv->xdisplay, g_free); - g_clear_object (&self->priv->x_authority); - g_clear_pointer (&self->priv->remote_host_name, g_free); - g_clear_pointer (&self->priv->login1_session_id, g_free); - g_clear_pointer (&self->priv->console_kit_cookie, g_free); - g_list_free_full (self->priv->env, g_free); - g_clear_pointer (&self->priv->argv, g_strfreev); + SessionPrivate *priv = session_get_instance_private (self); + + g_clear_object (&priv->config); + g_clear_object (&priv->display_server); + if (priv->pid) + kill (priv->pid, SIGKILL); + close (priv->to_child_input); + close (priv->from_child_output); + g_clear_pointer (&priv->from_child_channel, g_io_channel_unref); + if (priv->from_child_watch) + g_source_remove (priv->from_child_watch); + if (priv->child_watch) + g_source_remove (priv->child_watch); + g_clear_pointer (&priv->username, g_free); + g_clear_object (&priv->user); + g_clear_pointer (&priv->pam_service, g_free); + for (int i = 0; i < priv->messages_length; i++) + g_free ((char *) priv->messages[i].msg); + g_clear_pointer (&priv->messages, g_free); + g_clear_pointer (&priv->authentication_result_string, g_free); + g_clear_pointer (&priv->log_filename, g_free); + g_clear_pointer (&priv->tty, g_free); + g_clear_pointer (&priv->xdisplay, g_free); + g_clear_object (&priv->x_authority); + g_clear_pointer (&priv->remote_host_name, g_free); + g_clear_pointer (&priv->login1_session_id, g_free); + g_clear_pointer (&priv->console_kit_cookie, g_free); + g_list_free_full (priv->env, g_free); + g_clear_pointer (&priv->argv, g_strfreev); G_OBJECT_CLASS (session_parent_class)->finalize (object); } @@ -1009,8 +1076,10 @@ static gint session_real_logprefix (Logger *self, gchar *buf, gulong buflen) { Session *session = SESSION (self); - if (session->priv->pid != 0) - return g_snprintf (buf, buflen, "Session pid=%d: ", session->priv->pid); + SessionPrivate *priv = session_get_instance_private (session); + + if (priv->pid != 0) + return g_snprintf (buf, buflen, "Session pid=%d: ", priv->pid); else return g_snprintf (buf, buflen, "Session: "); } diff --git a/src/session.h b/src/session.h index eb3f0c0e..350cf3bb 100644 --- a/src/session.h +++ b/src/session.h @@ -44,12 +44,9 @@ G_BEGIN_DECLS #define SESSION_SIGNAL_AUTHENTICATION_COMPLETE "authentication-complete" #define SESSION_SIGNAL_STOPPED "stopped" -typedef struct SessionPrivate SessionPrivate; - struct Session { - GObject parent_instance; - SessionPrivate *priv; + GObject parent_instance; }; typedef struct diff --git a/src/shared-data-manager.c b/src/shared-data-manager.c index 79a551b3..50a9d014 100644 --- a/src/shared-data-manager.c +++ b/src/shared-data-manager.c @@ -21,12 +21,12 @@ #define NUM_ENUMERATION_FILES 100 -struct SharedDataManagerPrivate +typedef struct { gchar *greeter_user; guint32 greeter_gid; GHashTable *starting_dirs; -}; +} SharedDataManagerPrivate; struct OwnerInfo { @@ -74,6 +74,8 @@ delete_unused_user (gpointer key, gpointer value, gpointer user_data) gchar * shared_data_manager_ensure_user_dir (SharedDataManager *manager, const gchar *user) { + SharedDataManagerPrivate *priv = shared_data_manager_get_instance_private (manager); + struct passwd *entry = getpwnam (user); if (!entry) return NULL; @@ -106,7 +108,7 @@ shared_data_manager_ensure_user_dir (SharedDataManager *manager, const gchar *us runs. */ g_autoptr(GFileInfo) info = g_file_info_new (); g_file_info_set_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_UID, entry->pw_uid); - g_file_info_set_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_GID, manager->priv->greeter_gid); + g_file_info_set_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_GID, priv->greeter_gid); g_file_info_set_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_MODE, 0770); result = g_file_set_attributes_from_info (file, info, G_FILE_QUERY_INFO_NONE, NULL, &error); if (error) @@ -122,6 +124,7 @@ next_user_dirs_cb (GObject *object, GAsyncResult *res, gpointer user_data) { GFileEnumerator *enumerator = G_FILE_ENUMERATOR (object); SharedDataManager *manager = SHARED_DATA_MANAGER (user_data); + SharedDataManagerPrivate *priv = shared_data_manager_get_instance_private (manager); g_autoptr(GError) error = NULL; GList *files = g_file_enumerator_next_files_finish (enumerator, res, &error); @@ -135,7 +138,7 @@ next_user_dirs_cb (GObject *object, GAsyncResult *res, gpointer user_data) for (GList *link = files; link; link = link->next) { GFileInfo *info = link->data; - g_hash_table_insert (manager->priv->starting_dirs, g_strdup (g_file_info_get_name (info)), NULL); + g_hash_table_insert (priv->starting_dirs, g_strdup (g_file_info_get_name (info)), NULL); } if (files != NULL) @@ -152,11 +155,11 @@ next_user_dirs_cb (GObject *object, GAsyncResult *res, gpointer user_data) for (GList *link = users; link; link = link->next) { CommonUser *user = link->data; - g_hash_table_remove (manager->priv->starting_dirs, common_user_get_name (user)); + g_hash_table_remove (priv->starting_dirs, common_user_get_name (user)); } - g_hash_table_foreach (manager->priv->starting_dirs, delete_unused_user, manager); - g_hash_table_destroy (manager->priv->starting_dirs); - manager->priv->starting_dirs = NULL; + g_hash_table_foreach (priv->starting_dirs, delete_unused_user, manager); + g_hash_table_destroy (priv->starting_dirs); + priv->starting_dirs = NULL; g_object_unref (manager); } @@ -167,6 +170,7 @@ list_user_dirs_cb (GObject *object, GAsyncResult *res, gpointer user_data) { GFile *file = G_FILE (object); g_autoptr(SharedDataManager) manager = SHARED_DATA_MANAGER (user_data); + SharedDataManagerPrivate *priv = shared_data_manager_get_instance_private (manager); g_autoptr(GError) error = NULL; GFileEnumerator *enumerator = g_file_enumerate_children_finish (file, res, &error); @@ -175,7 +179,7 @@ list_user_dirs_cb (GObject *object, GAsyncResult *res, gpointer user_data) if (!enumerator) return; - manager->priv->starting_dirs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + priv->starting_dirs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); g_file_enumerator_next_files_async (enumerator, NUM_ENUMERATION_FILES, G_PRIORITY_DEFAULT, NULL, next_user_dirs_cb, g_steal_pointer (&manager)); @@ -204,28 +208,29 @@ shared_data_manager_start (SharedDataManager *manager) static void shared_data_manager_init (SharedDataManager *manager) { - manager->priv = G_TYPE_INSTANCE_GET_PRIVATE (manager, SHARED_DATA_MANAGER_TYPE, SharedDataManagerPrivate); + SharedDataManagerPrivate *priv = shared_data_manager_get_instance_private (manager); /* Grab current greeter-user gid */ - manager->priv->greeter_user = config_get_string (config_get_instance (), "LightDM", "greeter-user"); - struct passwd *greeter_entry = getpwnam (manager->priv->greeter_user); + priv->greeter_user = config_get_string (config_get_instance (), "LightDM", "greeter-user"); + struct passwd *greeter_entry = getpwnam (priv->greeter_user); if (greeter_entry) - manager->priv->greeter_gid = greeter_entry->pw_gid; + priv->greeter_gid = greeter_entry->pw_gid; } static void shared_data_manager_finalize (GObject *object) { SharedDataManager *self = SHARED_DATA_MANAGER (object); + SharedDataManagerPrivate *priv = shared_data_manager_get_instance_private (self); /* Should also cancel outstanding GIO operations, but whatever, let them do their thing. */ g_signal_handlers_disconnect_by_data (common_user_list_get_instance (), self); - if (self->priv->starting_dirs) - g_hash_table_destroy (self->priv->starting_dirs); + if (priv->starting_dirs) + g_hash_table_destroy (priv->starting_dirs); - g_clear_pointer (&self->priv->greeter_user, g_free); + g_clear_pointer (&priv->greeter_user, g_free); G_OBJECT_CLASS (shared_data_manager_parent_class)->finalize (object); } diff --git a/src/shared-data-manager.h b/src/shared-data-manager.h index 6099bd8a..a53de85b 100644 --- a/src/shared-data-manager.h +++ b/src/shared-data-manager.h @@ -23,12 +23,9 @@ G_BEGIN_DECLS #define SHARED_DATA_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHARED_DATA_MANAGER_TYPE, SharedDataManagerClass)) #define SHARED_DATA_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHARED_DATA_MANAGER_TYPE, SharedDataManagerClass)) -typedef struct SharedDataManagerPrivate SharedDataManagerPrivate; - struct SharedDataManager { - GObject parent_instance; - SharedDataManagerPrivate *priv; + GObject parent_instance; }; typedef struct diff --git a/src/unity-system-compositor.c b/src/unity-system-compositor.c index e75f1bf9..8558a80f 100644 --- a/src/unity-system-compositor.c +++ b/src/unity-system-compositor.c @@ -24,7 +24,7 @@ #include "greeter-session.h" #include "vt.h" -struct UnitySystemCompositorPrivate +typedef struct { /* Compositor process */ Process *process; @@ -62,7 +62,7 @@ struct UnitySystemCompositorPrivate /* Counters for Mir IDs to use */ int next_session_id; int next_greeter_id; -}; +} UnitySystemCompositorPrivate; static void unity_system_compositor_logger_iface_init (LoggerInterface *iface); @@ -89,54 +89,63 @@ unity_system_compositor_new (void) void unity_system_compositor_set_command (UnitySystemCompositor *compositor, const gchar *command) { + UnitySystemCompositorPrivate *priv = unity_system_compositor_get_instance_private (compositor); + g_return_if_fail (compositor != NULL); g_return_if_fail (command != NULL); - g_free (compositor->priv->command); - compositor->priv->command = g_strdup (command); + g_free (priv->command); + priv->command = g_strdup (command); } void unity_system_compositor_set_socket (UnitySystemCompositor *compositor, const gchar *socket) { + UnitySystemCompositorPrivate *priv = unity_system_compositor_get_instance_private (compositor); g_return_if_fail (compositor != NULL); - g_free (compositor->priv->socket); - compositor->priv->socket = g_strdup (socket); + g_free (priv->socket); + priv->socket = g_strdup (socket); } const gchar * unity_system_compositor_get_socket (UnitySystemCompositor *compositor) { + UnitySystemCompositorPrivate *priv = unity_system_compositor_get_instance_private (compositor); g_return_val_if_fail (compositor != NULL, NULL); - return compositor->priv->socket; + return priv->socket; } void unity_system_compositor_set_vt (UnitySystemCompositor *compositor, gint vt) { + UnitySystemCompositorPrivate *priv = unity_system_compositor_get_instance_private (compositor); + g_return_if_fail (compositor != NULL); - if (compositor->priv->have_vt_ref) - vt_unref (compositor->priv->vt); - compositor->priv->have_vt_ref = FALSE; - compositor->priv->vt = vt; + if (priv->have_vt_ref) + vt_unref (priv->vt); + priv->have_vt_ref = FALSE; + priv->vt = vt; if (vt > 0) { vt_ref (vt); - compositor->priv->have_vt_ref = TRUE; + priv->have_vt_ref = TRUE; } } void unity_system_compositor_set_timeout (UnitySystemCompositor *compositor, gint timeout) { + UnitySystemCompositorPrivate *priv = unity_system_compositor_get_instance_private (compositor); g_return_if_fail (compositor != NULL); - compositor->priv->timeout = timeout; + priv->timeout = timeout; } static void write_message (UnitySystemCompositor *compositor, guint16 id, const guint8 *payload, guint16 payload_length) { + UnitySystemCompositorPrivate *priv = unity_system_compositor_get_instance_private (compositor); + gsize data_length = 4 + payload_length; g_autofree guint8 *data = g_malloc (data_length); data[0] = id >> 8; @@ -147,7 +156,7 @@ write_message (UnitySystemCompositor *compositor, guint16 id, const guint8 *payl memcpy (data + 4, payload, payload_length); errno = 0; - if (write (compositor->priv->to_compositor_pipe[1], data, data_length) != data_length) + if (write (priv->to_compositor_pipe[1], data, data_length) != data_length) l_warning (compositor, "Failed to write to compositor: %s", strerror (errno)); } @@ -168,39 +177,41 @@ unity_system_compositor_set_next_session (UnitySystemCompositor *compositor, con static gint unity_system_compositor_get_vt (DisplayServer *server) { + UnitySystemCompositorPrivate *priv = unity_system_compositor_get_instance_private (UNITY_SYSTEM_COMPOSITOR (server)); g_return_val_if_fail (server != NULL, 0); - return UNITY_SYSTEM_COMPOSITOR (server)->priv->vt; + return priv->vt; } static void unity_system_compositor_connect_session (DisplayServer *display_server, Session *session) { UnitySystemCompositor *compositor = UNITY_SYSTEM_COMPOSITOR (display_server); + UnitySystemCompositorPrivate *priv = unity_system_compositor_get_instance_private (compositor); session_set_env (session, "XDG_SESSION_TYPE", "mir"); - if (compositor->priv->socket) - session_set_env (session, "MIR_SERVER_HOST_SOCKET", compositor->priv->socket); + if (priv->socket) + session_set_env (session, "MIR_SERVER_HOST_SOCKET", priv->socket); if (!session_get_env (session, "MIR_SERVER_NAME")) { g_autofree gchar *name = NULL; if (IS_GREETER_SESSION (session)) { - name = g_strdup_printf ("greeter-%d", compositor->priv->next_greeter_id); - compositor->priv->next_greeter_id++; + name = g_strdup_printf ("greeter-%d", priv->next_greeter_id); + priv->next_greeter_id++; } else { - name = g_strdup_printf ("session-%d", compositor->priv->next_session_id); - compositor->priv->next_session_id++; + name = g_strdup_printf ("session-%d", priv->next_session_id); + priv->next_session_id++; } session_set_env (session, "MIR_SERVER_NAME", name); } - if (compositor->priv->vt >= 0) + if (priv->vt >= 0) { - g_autofree gchar *value = g_strdup_printf ("%d", compositor->priv->vt); + g_autofree gchar *value = g_strdup_printf ("%d", priv->vt); session_set_env (session, "XDG_VTNR", value); } } @@ -236,35 +247,36 @@ static gboolean read_cb (GIOChannel *source, GIOCondition condition, gpointer data) { UnitySystemCompositor *compositor = data; + UnitySystemCompositorPrivate *priv = unity_system_compositor_get_instance_private (compositor); if (condition == G_IO_HUP) { l_debug (compositor, "Compositor closed communication channel"); - compositor->priv->from_compositor_watch = 0; + priv->from_compositor_watch = 0; return FALSE; } /* Work out how much required for a message */ gsize n_to_read = 0; - if (compositor->priv->read_buffer_n_used < 4) - n_to_read = 4 - compositor->priv->read_buffer_n_used; + if (priv->read_buffer_n_used < 4) + n_to_read = 4 - priv->read_buffer_n_used; else { - guint16 payload_length = compositor->priv->read_buffer[2] << 8 | compositor->priv->read_buffer[3]; - n_to_read = 4 + payload_length - compositor->priv->read_buffer_n_used; + guint16 payload_length = priv->read_buffer[2] << 8 | priv->read_buffer[3]; + n_to_read = 4 + payload_length - priv->read_buffer_n_used; } /* Read from compositor */ if (n_to_read > 0) { - gsize n_total = compositor->priv->read_buffer_n_used + n_to_read; - if (compositor->priv->read_buffer_length < n_total) - compositor->priv->read_buffer = g_realloc (compositor->priv->read_buffer, n_total); + gsize n_total = priv->read_buffer_n_used + n_to_read; + if (priv->read_buffer_length < n_total) + priv->read_buffer = g_realloc (priv->read_buffer, n_total); g_autoptr(GError) error = NULL; gsize n_read = 0; GIOStatus status = g_io_channel_read_chars (source, - (gchar *)compositor->priv->read_buffer + compositor->priv->read_buffer_n_used, + (gchar *)priv->read_buffer + priv->read_buffer_n_used, n_to_read, &n_read, &error); @@ -272,19 +284,19 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) l_warning (compositor, "Failed to read from compositor: %s", error->message); if (status != G_IO_STATUS_NORMAL) return TRUE; - compositor->priv->read_buffer_n_used += n_read; + priv->read_buffer_n_used += n_read; } /* Read header */ - if (compositor->priv->read_buffer_n_used < 4) + if (priv->read_buffer_n_used < 4) return TRUE; - guint16 id = compositor->priv->read_buffer[0] << 8 | compositor->priv->read_buffer[1]; - guint16 payload_length = compositor->priv->read_buffer[2] << 8 | compositor->priv->read_buffer[3]; + guint16 id = priv->read_buffer[0] << 8 | priv->read_buffer[1]; + guint16 payload_length = priv->read_buffer[2] << 8 | priv->read_buffer[3]; /* Read payload */ - if (compositor->priv->read_buffer_n_used < 4 + payload_length) + if (priv->read_buffer_n_used < 4 + payload_length) return TRUE; - /*guint8 *payload = compositor->priv->read_buffer + 4;*/ + /*guint8 *payload = priv->read_buffer + 4;*/ switch (id) { @@ -297,12 +309,12 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) break; case USC_MESSAGE_READY: l_debug (compositor, "READY"); - if (!compositor->priv->is_ready) + if (!priv->is_ready) { - compositor->priv->is_ready = TRUE; + priv->is_ready = TRUE; l_debug (compositor, "Compositor ready"); - g_source_remove (compositor->priv->timeout_source); - compositor->priv->timeout_source = 0; + g_source_remove (priv->timeout_source); + priv->timeout_source = 0; DISPLAY_SERVER_CLASS (unity_system_compositor_parent_class)->start (DISPLAY_SERVER (compositor)); } break; @@ -315,7 +327,7 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) } /* Clear buffer */ - compositor->priv->read_buffer_n_used = 0; + priv->read_buffer_n_used = 0; return TRUE; } @@ -333,11 +345,12 @@ static gboolean timeout_cb (gpointer data) { UnitySystemCompositor *compositor = data; + UnitySystemCompositorPrivate *priv = unity_system_compositor_get_instance_private (compositor); /* Stop the compositor - it is not working */ display_server_stop (DISPLAY_SERVER (compositor)); - compositor->priv->timeout_source = 0; + priv->timeout_source = 0; return TRUE; } @@ -345,17 +358,19 @@ timeout_cb (gpointer data) static void stopped_cb (Process *process, UnitySystemCompositor *compositor) { + UnitySystemCompositorPrivate *priv = unity_system_compositor_get_instance_private (compositor); + l_debug (compositor, "Unity system compositor stopped"); - if (compositor->priv->timeout_source != 0) - g_source_remove (compositor->priv->timeout_source); - compositor->priv->timeout_source = 0; + if (priv->timeout_source != 0) + g_source_remove (priv->timeout_source); + priv->timeout_source = 0; /* Release VT and display number for re-use */ - if (compositor->priv->have_vt_ref) + if (priv->have_vt_ref) { - vt_unref (compositor->priv->vt); - compositor->priv->have_vt_ref = FALSE; + vt_unref (priv->vt); + priv->have_vt_ref = FALSE; } DISPLAY_SERVER_CLASS (unity_system_compositor_parent_class)->stop (DISPLAY_SERVER (compositor)); @@ -365,27 +380,28 @@ static gboolean unity_system_compositor_start (DisplayServer *server) { UnitySystemCompositor *compositor = UNITY_SYSTEM_COMPOSITOR (server); + UnitySystemCompositorPrivate *priv = unity_system_compositor_get_instance_private (compositor); - g_return_val_if_fail (compositor->priv->process == NULL, FALSE); + g_return_val_if_fail (priv->process == NULL, FALSE); - compositor->priv->is_ready = FALSE; + priv->is_ready = FALSE; - g_return_val_if_fail (compositor->priv->command != NULL, FALSE); + g_return_val_if_fail (priv->command != NULL, FALSE); /* Create pipes to talk to compositor */ - if (pipe (compositor->priv->to_compositor_pipe) < 0 || pipe (compositor->priv->from_compositor_pipe) < 0) + if (pipe (priv->to_compositor_pipe) < 0 || pipe (priv->from_compositor_pipe) < 0) { l_debug (compositor, "Failed to create compositor pipes: %s", g_strerror (errno)); return FALSE; } /* Don't allow the daemon end of the pipes to be accessed in the compositor */ - fcntl (compositor->priv->to_compositor_pipe[1], F_SETFD, FD_CLOEXEC); - fcntl (compositor->priv->from_compositor_pipe[0], F_SETFD, FD_CLOEXEC); + fcntl (priv->to_compositor_pipe[1], F_SETFD, FD_CLOEXEC); + fcntl (priv->from_compositor_pipe[0], F_SETFD, FD_CLOEXEC); /* Listen for messages from the compositor */ - compositor->priv->from_compositor_channel = g_io_channel_unix_new (compositor->priv->from_compositor_pipe[0]); - compositor->priv->from_compositor_watch = g_io_add_watch (compositor->priv->from_compositor_channel, G_IO_IN | G_IO_HUP, read_cb, compositor); + priv->from_compositor_channel = g_io_channel_unix_new (priv->from_compositor_pipe[0]); + priv->from_compositor_watch = g_io_add_watch (priv->from_compositor_channel, G_IO_IN | G_IO_HUP, read_cb, compositor); /* Setup logging */ g_autofree gchar *dir = config_get_string (config_get_instance (), "LightDM", "log-directory"); @@ -393,53 +409,53 @@ unity_system_compositor_start (DisplayServer *server) l_debug (compositor, "Logging to %s", log_file); /* Setup environment */ - compositor->priv->process = process_new (run_cb, compositor); + priv->process = process_new (run_cb, compositor); gboolean backup_logs = config_get_boolean (config_get_instance (), "LightDM", "backup-logs"); - process_set_log_file (compositor->priv->process, log_file, TRUE, backup_logs ? LOG_MODE_BACKUP_AND_TRUNCATE : LOG_MODE_APPEND); - process_set_clear_environment (compositor->priv->process, TRUE); - process_set_env (compositor->priv->process, "XDG_SEAT", "seat0"); - g_autofree gchar *value = g_strdup_printf ("%d", compositor->priv->vt); - process_set_env (compositor->priv->process, "XDG_VTNR", value); + process_set_log_file (priv->process, log_file, TRUE, backup_logs ? LOG_MODE_BACKUP_AND_TRUNCATE : LOG_MODE_APPEND); + process_set_clear_environment (priv->process, TRUE); + process_set_env (priv->process, "XDG_SEAT", "seat0"); + g_autofree gchar *value = g_strdup_printf ("%d", priv->vt); + process_set_env (priv->process, "XDG_VTNR", value); /* Variable required for regression tests */ if (g_getenv ("LIGHTDM_TEST_ROOT")) { - process_set_env (compositor->priv->process, "LIGHTDM_TEST_ROOT", g_getenv ("LIGHTDM_TEST_ROOT")); - process_set_env (compositor->priv->process, "LD_PRELOAD", g_getenv ("LD_PRELOAD")); - process_set_env (compositor->priv->process, "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH")); + process_set_env (priv->process, "LIGHTDM_TEST_ROOT", g_getenv ("LIGHTDM_TEST_ROOT")); + process_set_env (priv->process, "LD_PRELOAD", g_getenv ("LD_PRELOAD")); + process_set_env (priv->process, "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH")); } /* Generate command line to run */ - g_autofree gchar *absolute_command = get_absolute_command (compositor->priv->command); + g_autofree gchar *absolute_command = get_absolute_command (priv->command); if (!absolute_command) { - l_debug (compositor, "Can't launch compositor %s, not found in path", compositor->priv->command); + l_debug (compositor, "Can't launch compositor %s, not found in path", priv->command); return FALSE; } g_autoptr(GString) command = g_string_new (absolute_command); - g_string_append_printf (command, " --file '%s'", compositor->priv->socket); - g_string_append_printf (command, " --from-dm-fd %d --to-dm-fd %d", compositor->priv->to_compositor_pipe[0], compositor->priv->from_compositor_pipe[1]); - if (compositor->priv->vt > 0) - g_string_append_printf (command, " --vt %d", compositor->priv->vt); - process_set_command (compositor->priv->process, command->str); + g_string_append_printf (command, " --file '%s'", priv->socket); + g_string_append_printf (command, " --from-dm-fd %d --to-dm-fd %d", priv->to_compositor_pipe[0], priv->from_compositor_pipe[1]); + if (priv->vt > 0) + g_string_append_printf (command, " --vt %d", priv->vt); + process_set_command (priv->process, command->str); /* Start the compositor */ - g_signal_connect (compositor->priv->process, PROCESS_SIGNAL_STOPPED, G_CALLBACK (stopped_cb), compositor); - gboolean result = process_start (compositor->priv->process, FALSE); + g_signal_connect (priv->process, PROCESS_SIGNAL_STOPPED, G_CALLBACK (stopped_cb), compositor); + gboolean result = process_start (priv->process, FALSE); /* Close compositor ends of the pipes */ - close (compositor->priv->to_compositor_pipe[0]); - compositor->priv->to_compositor_pipe[0] = -1; - close (compositor->priv->from_compositor_pipe[1]); - compositor->priv->from_compositor_pipe[1] = -1; + close (priv->to_compositor_pipe[0]); + priv->to_compositor_pipe[0] = -1; + close (priv->from_compositor_pipe[1]); + priv->from_compositor_pipe[1] = -1; if (!result) return FALSE; /* Connect to the compositor */ - if (compositor->priv->timeout > 0) + if (priv->timeout > 0) { - l_debug (compositor, "Waiting for system compositor for %ds", compositor->priv->timeout); - compositor->priv->timeout_source = g_timeout_add (compositor->priv->timeout * 1000, timeout_cb, compositor); + l_debug (compositor, "Waiting for system compositor for %ds", priv->timeout); + priv->timeout_source = g_timeout_add (priv->timeout * 1000, timeout_cb, compositor); } return TRUE; @@ -448,45 +464,47 @@ unity_system_compositor_start (DisplayServer *server) static void unity_system_compositor_stop (DisplayServer *server) { - process_stop (UNITY_SYSTEM_COMPOSITOR (server)->priv->process); + UnitySystemCompositorPrivate *priv = unity_system_compositor_get_instance_private (UNITY_SYSTEM_COMPOSITOR (server)); + process_stop (priv->process); } static void unity_system_compositor_init (UnitySystemCompositor *compositor) { - compositor->priv = G_TYPE_INSTANCE_GET_PRIVATE (compositor, UNITY_SYSTEM_COMPOSITOR_TYPE, UnitySystemCompositorPrivate); - compositor->priv->vt = -1; - compositor->priv->command = g_strdup ("unity-system-compositor"); - compositor->priv->socket = g_strdup ("/run/mir_socket"); - compositor->priv->timeout = -1; - compositor->priv->to_compositor_pipe[0] = -1; - compositor->priv->to_compositor_pipe[1] = -1; - compositor->priv->from_compositor_pipe[0] = -1; - compositor->priv->from_compositor_pipe[1] = -1; + UnitySystemCompositorPrivate *priv = unity_system_compositor_get_instance_private (compositor); + priv->vt = -1; + priv->command = g_strdup ("unity-system-compositor"); + priv->socket = g_strdup ("/run/mir_socket"); + priv->timeout = -1; + priv->to_compositor_pipe[0] = -1; + priv->to_compositor_pipe[1] = -1; + priv->from_compositor_pipe[0] = -1; + priv->from_compositor_pipe[1] = -1; } static void unity_system_compositor_finalize (GObject *object) { UnitySystemCompositor *self = UNITY_SYSTEM_COMPOSITOR (object); - - if (self->priv->process) - g_signal_handlers_disconnect_matched (self->priv->process, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); - g_clear_object (&self->priv->process); - g_clear_pointer (&self->priv->command, g_free); - g_clear_pointer (&self->priv->socket, g_free); - if (self->priv->have_vt_ref) - vt_unref (self->priv->vt); - close (self->priv->to_compositor_pipe[0]); - close (self->priv->to_compositor_pipe[1]); - close (self->priv->from_compositor_pipe[0]); - close (self->priv->from_compositor_pipe[1]); - g_clear_pointer (&self->priv->from_compositor_channel, g_io_channel_unref); - if (self->priv->from_compositor_watch) - g_source_remove (self->priv->from_compositor_watch); - g_clear_pointer (&self->priv->read_buffer, g_free); - if (self->priv->timeout_source) - g_source_remove (self->priv->timeout_source); + UnitySystemCompositorPrivate *priv = unity_system_compositor_get_instance_private (self); + + if (priv->process) + g_signal_handlers_disconnect_matched (priv->process, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); + g_clear_object (&priv->process); + g_clear_pointer (&priv->command, g_free); + g_clear_pointer (&priv->socket, g_free); + if (priv->have_vt_ref) + vt_unref (priv->vt); + close (priv->to_compositor_pipe[0]); + close (priv->to_compositor_pipe[1]); + close (priv->from_compositor_pipe[0]); + close (priv->from_compositor_pipe[1]); + g_clear_pointer (&priv->from_compositor_channel, g_io_channel_unref); + if (priv->from_compositor_watch) + g_source_remove (priv->from_compositor_watch); + g_clear_pointer (&priv->read_buffer, g_free); + if (priv->timeout_source) + g_source_remove (priv->timeout_source); G_OBJECT_CLASS (unity_system_compositor_parent_class)->finalize (object); } diff --git a/src/unity-system-compositor.h b/src/unity-system-compositor.h index cc74935d..546a8cc6 100644 --- a/src/unity-system-compositor.h +++ b/src/unity-system-compositor.h @@ -21,12 +21,9 @@ G_BEGIN_DECLS #define UNITY_SYSTEM_COMPOSITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UNITY_SYSTEM_COMPOSITOR_TYPE, UnitySystemCompositor)) #define IS_UNITY_SYSTEM_COMPOSITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UNITY_SYSTEM_COMPOSITOR_TYPE)) -typedef struct UnitySystemCompositorPrivate UnitySystemCompositorPrivate; - typedef struct { - DisplayServer parent_instance; - UnitySystemCompositorPrivate *priv; + DisplayServer parent_instance; } UnitySystemCompositor; typedef struct diff --git a/src/vnc-server.c b/src/vnc-server.c index e5612b2f..d3500764 100644 --- a/src/vnc-server.c +++ b/src/vnc-server.c @@ -19,7 +19,7 @@ enum { }; static guint signals[LAST_SIGNAL] = { 0 }; -struct VNCServerPrivate +typedef struct { /* Port to listen on */ guint port; @@ -29,7 +29,7 @@ struct VNCServerPrivate /* Listening sockets */ GSocket *socket, *socket6; -}; +} VNCServerPrivate; G_DEFINE_TYPE_WITH_PRIVATE (VNCServer, vnc_server, G_TYPE_OBJECT) @@ -42,31 +42,36 @@ vnc_server_new (void) void vnc_server_set_port (VNCServer *server, guint port) { + VNCServerPrivate *priv = vnc_server_get_instance_private (server); g_return_if_fail (server != NULL); - server->priv->port = port; + priv->port = port; } guint vnc_server_get_port (VNCServer *server) { + VNCServerPrivate *priv = vnc_server_get_instance_private (server); g_return_val_if_fail (server != NULL, 0); - return server->priv->port; + return priv->port; } void vnc_server_set_listen_address (VNCServer *server, const gchar *listen_address) { + VNCServerPrivate *priv = vnc_server_get_instance_private (server); + g_return_if_fail (server != NULL); - g_free (server->priv->listen_address); - server->priv->listen_address = g_strdup (listen_address); + g_free (priv->listen_address); + priv->listen_address = g_strdup (listen_address); } const gchar * vnc_server_get_listen_address (VNCServer *server) { + VNCServerPrivate *priv = vnc_server_get_instance_private (server); g_return_val_if_fail (server != NULL, NULL); - return server->priv->listen_address; + return priv->listen_address; } static gboolean @@ -117,33 +122,35 @@ open_tcp_socket (GSocketFamily family, guint port, const gchar *listen_address, gboolean vnc_server_start (VNCServer *server) { + VNCServerPrivate *priv = vnc_server_get_instance_private (server); + g_return_val_if_fail (server != NULL, FALSE); g_autoptr(GError) ipv4_error = NULL; - server->priv->socket = open_tcp_socket (G_SOCKET_FAMILY_IPV4, server->priv->port, server->priv->listen_address, &ipv4_error); + priv->socket = open_tcp_socket (G_SOCKET_FAMILY_IPV4, priv->port, priv->listen_address, &ipv4_error); if (ipv4_error) g_warning ("Failed to create IPv4 VNC socket: %s", ipv4_error->message); - if (server->priv->socket) + if (priv->socket) { - GSource *source = g_socket_create_source (server->priv->socket, G_IO_IN, NULL); + GSource *source = g_socket_create_source (priv->socket, G_IO_IN, NULL); g_source_set_callback (source, (GSourceFunc) read_cb, server, NULL); g_source_attach (source, NULL); } g_autoptr(GError) ipv6_error = NULL; - server->priv->socket6 = open_tcp_socket (G_SOCKET_FAMILY_IPV6, server->priv->port, server->priv->listen_address, &ipv6_error); + priv->socket6 = open_tcp_socket (G_SOCKET_FAMILY_IPV6, priv->port, priv->listen_address, &ipv6_error); if (ipv6_error) g_warning ("Failed to create IPv6 VNC socket: %s", ipv6_error->message); - if (server->priv->socket6) + if (priv->socket6) { - GSource *source = g_socket_create_source (server->priv->socket6, G_IO_IN, NULL); + GSource *source = g_socket_create_source (priv->socket6, G_IO_IN, NULL); g_source_set_callback (source, (GSourceFunc) read_cb, server, NULL); g_source_attach (source, NULL); } - if (!server->priv->socket && !server->priv->socket6) + if (!priv->socket && !priv->socket6) return FALSE; return TRUE; @@ -152,18 +159,19 @@ vnc_server_start (VNCServer *server) static void vnc_server_init (VNCServer *server) { - server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, VNC_SERVER_TYPE, VNCServerPrivate); - server->priv->port = 5900; + VNCServerPrivate *priv = vnc_server_get_instance_private (server); + priv->port = 5900; } static void vnc_server_finalize (GObject *object) { VNCServer *self = VNC_SERVER (object); + VNCServerPrivate *priv = vnc_server_get_instance_private (self); - g_clear_pointer (&self->priv->listen_address, g_free); - g_clear_object (&self->priv->socket); - g_clear_object (&self->priv->socket6); + g_clear_pointer (&priv->listen_address, g_free); + g_clear_object (&priv->socket); + g_clear_object (&priv->socket6); G_OBJECT_CLASS (vnc_server_parent_class)->finalize (object); } diff --git a/src/vnc-server.h b/src/vnc-server.h index 889fdb74..d493995b 100644 --- a/src/vnc-server.h +++ b/src/vnc-server.h @@ -21,12 +21,9 @@ G_BEGIN_DECLS #define VNC_SERVER_SIGNAL_NEW_CONNECTION "new-connection" -typedef struct VNCServerPrivate VNCServerPrivate; - typedef struct { - GObject parent_instance; - VNCServerPrivate *priv; + GObject parent_instance; } VNCServer; typedef struct diff --git a/src/wayland-session.c b/src/wayland-session.c index 576b2e60..187bf1f0 100644 --- a/src/wayland-session.c +++ b/src/wayland-session.c @@ -12,12 +12,12 @@ #include "wayland-session.h" #include "vt.h" -struct WaylandSessionPrivate +typedef struct { /* VT to run on */ gint vt; gboolean have_vt_ref; -}; +} WaylandSessionPrivate; G_DEFINE_TYPE_WITH_PRIVATE (WaylandSession, wayland_session, DISPLAY_SERVER_TYPE) @@ -30,36 +30,40 @@ wayland_session_new (void) void wayland_session_set_vt (WaylandSession *session, gint vt) { + WaylandSessionPrivate *priv = wayland_session_get_instance_private (session); + g_return_if_fail (session != NULL); - if (session->priv->have_vt_ref) - vt_unref (session->priv->vt); - session->priv->have_vt_ref = FALSE; - session->priv->vt = vt; + if (priv->have_vt_ref) + vt_unref (priv->vt); + priv->have_vt_ref = FALSE; + priv->vt = vt; if (vt > 0) { vt_ref (vt); - session->priv->have_vt_ref = TRUE; + priv->have_vt_ref = TRUE; } } static gint wayland_session_get_vt (DisplayServer *server) { + WaylandSessionPrivate *priv = wayland_session_get_instance_private (WAYLAND_SESSION (server)); g_return_val_if_fail (server != NULL, 0); - return WAYLAND_SESSION (server)->priv->vt; + return priv->vt; } static void wayland_session_connect_session (DisplayServer *display_server, Session *session) { WaylandSession *wayland_session = WAYLAND_SESSION (display_server); + WaylandSessionPrivate *priv = wayland_session_get_instance_private (wayland_session); session_set_env (session, "XDG_SESSION_TYPE", "wayland"); - if (wayland_session->priv->vt >= 0) + if (priv->vt >= 0) { - g_autofree gchar *value = g_strdup_printf ("%d", wayland_session->priv->vt); + g_autofree gchar *value = g_strdup_printf ("%d", priv->vt); session_set_env (session, "XDG_VTNR", value); } } @@ -74,16 +78,16 @@ wayland_session_disconnect_session (DisplayServer *display_server, Session *sess static void wayland_session_init (WaylandSession *session) { - session->priv = G_TYPE_INSTANCE_GET_PRIVATE (session, WAYLAND_SESSION_TYPE, WaylandSessionPrivate); } static void wayland_session_finalize (GObject *object) { WaylandSession *self = WAYLAND_SESSION (object); + WaylandSessionPrivate *priv = wayland_session_get_instance_private (self); - if (self->priv->have_vt_ref) - vt_unref (self->priv->vt); + if (priv->have_vt_ref) + vt_unref (priv->vt); G_OBJECT_CLASS (wayland_session_parent_class)->finalize (object); } diff --git a/src/wayland-session.h b/src/wayland-session.h index 240c19fb..8547be5e 100644 --- a/src/wayland-session.h +++ b/src/wayland-session.h @@ -21,12 +21,9 @@ G_BEGIN_DECLS #define WAYLAND_SESSION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), WAYLAND_SESSION_TYPE, WaylandSession)) #define IS_WAYLAND_SESSION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), WAYLAND_SESSION_TYPE)) -typedef struct WaylandSessionPrivate WaylandSessionPrivate; - typedef struct { - DisplayServer parent_instance; - WaylandSessionPrivate *priv; + DisplayServer parent_instance; } WaylandSession; typedef struct diff --git a/src/x-authority.c b/src/x-authority.c index 6f4a06b5..baaf4bea 100644 --- a/src/x-authority.c +++ b/src/x-authority.c @@ -19,7 +19,7 @@ #include "x-authority.h" -struct XAuthorityPrivate +typedef struct { /* Protocol family */ guint16 family; @@ -37,7 +37,7 @@ struct XAuthorityPrivate /* Authorization data */ guint8 *authorization_data; gsize authorization_data_length; -}; +} XAuthorityPrivate; G_DEFINE_TYPE_WITH_PRIVATE (XAuthority, x_authority, G_TYPE_OBJECT) @@ -76,103 +76,117 @@ x_authority_new_local_cookie (const gchar *number) void x_authority_set_family (XAuthority *auth, guint16 family) { + XAuthorityPrivate *priv = x_authority_get_instance_private (auth); g_return_if_fail (auth != NULL); - auth->priv->family = family; + priv->family = family; } guint16 x_authority_get_family (XAuthority *auth) { + XAuthorityPrivate *priv = x_authority_get_instance_private (auth); g_return_val_if_fail (auth != NULL, 0); - return auth->priv->family; + return priv->family; } void x_authority_set_address (XAuthority *auth, const guint8 *address, gsize address_length) { + XAuthorityPrivate *priv = x_authority_get_instance_private (auth); g_return_if_fail (auth != NULL); - g_free (auth->priv->address); - auth->priv->address = g_malloc (address_length); - memcpy (auth->priv->address, address, address_length); - auth->priv->address_length = address_length; + g_free (priv->address); + priv->address = g_malloc (address_length); + memcpy (priv->address, address, address_length); + priv->address_length = address_length; } const guint8 * x_authority_get_address (XAuthority *auth) { + XAuthorityPrivate *priv = x_authority_get_instance_private (auth); g_return_val_if_fail (auth != NULL, NULL); - return auth->priv->address; + return priv->address; } gsize x_authority_get_address_length (XAuthority *auth) { + XAuthorityPrivate *priv = x_authority_get_instance_private (auth); g_return_val_if_fail (auth != NULL, 0); - return auth->priv->address_length; + return priv->address_length; } void x_authority_set_number (XAuthority *auth, const gchar *number) { + XAuthorityPrivate *priv = x_authority_get_instance_private (auth); g_return_if_fail (auth != NULL); - g_free (auth->priv->number); - auth->priv->number = g_strdup (number); + g_free (priv->number); + priv->number = g_strdup (number); } const gchar * x_authority_get_number (XAuthority *auth) { + XAuthorityPrivate *priv = x_authority_get_instance_private (auth); g_return_val_if_fail (auth != NULL, NULL); - return auth->priv->number; + return priv->number; } void x_authority_set_authorization_name (XAuthority *auth, const gchar *name) { + XAuthorityPrivate *priv = x_authority_get_instance_private (auth); g_return_if_fail (auth != NULL); - g_free (auth->priv->authorization_name); - auth->priv->authorization_name = g_strdup (name); + g_free (priv->authorization_name); + priv->authorization_name = g_strdup (name); } const gchar * x_authority_get_authorization_name (XAuthority *auth) { + XAuthorityPrivate *priv = x_authority_get_instance_private (auth); g_return_val_if_fail (auth != NULL, NULL); - return auth->priv->authorization_name; + return priv->authorization_name; } void x_authority_set_authorization_data (XAuthority *auth, const guint8 *data, gsize data_length) { + XAuthorityPrivate *priv = x_authority_get_instance_private (auth); g_return_if_fail (auth != NULL); - g_free (auth->priv->authorization_data); - auth->priv->authorization_data = g_malloc (data_length); - memcpy (auth->priv->authorization_data, data, data_length); - auth->priv->authorization_data_length = data_length; + g_free (priv->authorization_data); + priv->authorization_data = g_malloc (data_length); + memcpy (priv->authorization_data, data, data_length); + priv->authorization_data_length = data_length; } const guint8 * x_authority_get_authorization_data (XAuthority *auth) { + XAuthorityPrivate *priv = x_authority_get_instance_private (auth); g_return_val_if_fail (auth != NULL, NULL); - return auth->priv->authorization_data; + return priv->authorization_data; } guint8 * x_authority_copy_authorization_data (XAuthority *auth) { + XAuthorityPrivate *priv = x_authority_get_instance_private (auth); + g_return_val_if_fail (auth != NULL, NULL); - guint8 *data = g_malloc (auth->priv->authorization_data_length); - memcpy (data, auth->priv->authorization_data, auth->priv->authorization_data_length); + guint8 *data = g_malloc (priv->authorization_data_length); + memcpy (data, priv->authorization_data, priv->authorization_data_length); return data; } gsize x_authority_get_authorization_data_length (XAuthority *auth) { + XAuthorityPrivate *priv = x_authority_get_instance_private (auth); g_return_val_if_fail (auth != NULL, 0); - return auth->priv->authorization_data_length; + return priv->authorization_data_length; } static gboolean @@ -239,6 +253,8 @@ write_string (int fd, const gchar *value) gboolean x_authority_write (XAuthority *auth, XAuthWriteMode mode, const gchar *filename, GError **error) { + XAuthorityPrivate *priv = x_authority_get_instance_private (auth); + g_return_val_if_fail (auth != NULL, FALSE); g_return_val_if_fail (filename != NULL, FALSE); @@ -257,41 +273,42 @@ x_authority_write (XAuthority *auth, XAuthWriteMode mode, const gchar *filename, while (input_offset != input_length) { g_autoptr(XAuthority) a = g_object_new (X_AUTHORITY_TYPE, NULL); + XAuthorityPrivate *a_priv = x_authority_get_instance_private (a); guint16 address_length = 0; guint16 authorization_data_length = 0; - gboolean result = read_uint16 (input, input_length, &input_offset, &a->priv->family) && + gboolean result = read_uint16 (input, input_length, &input_offset, &a_priv->family) && read_uint16 (input, input_length, &input_offset, &address_length) && - read_data (input, input_length, &input_offset, address_length, &a->priv->address) && - read_string (input, input_length, &input_offset, &a->priv->number) && - read_string (input, input_length, &input_offset, &a->priv->authorization_name) && + read_data (input, input_length, &input_offset, address_length, &a_priv->address) && + read_string (input, input_length, &input_offset, &a_priv->number) && + read_string (input, input_length, &input_offset, &a_priv->authorization_name) && read_uint16 (input, input_length, &input_offset, &authorization_data_length) && - read_data (input, input_length, &input_offset, authorization_data_length, &a->priv->authorization_data); - a->priv->address_length = address_length; - a->priv->authorization_data_length = authorization_data_length; + read_data (input, input_length, &input_offset, authorization_data_length, &a_priv->authorization_data); + a_priv->address_length = address_length; + a_priv->authorization_data_length = authorization_data_length; if (!result) break; gboolean address_matches = FALSE; - if (auth->priv->address_length == a->priv->address_length) + if (priv->address_length == a_priv->address_length) { guint16 i; - for (i = 0; i < auth->priv->address_length && auth->priv->address[i] == a->priv->address[i]; i++); - address_matches = i == auth->priv->address_length; + for (i = 0; i < priv->address_length && priv->address[i] == a_priv->address[i]; i++); + address_matches = i == priv->address_length; } /* If this record matches, then update or delete it */ if (!matched && - auth->priv->family == a->priv->family && + priv->family == a_priv->family && address_matches && - strcmp (auth->priv->number, a->priv->number) == 0) + strcmp (priv->number, a_priv->number) == 0) { matched = TRUE; if (mode == XAUTH_WRITE_MODE_REMOVE) continue; else - x_authority_set_authorization_data (a, auth->priv->authorization_data, auth->priv->authorization_data_length); + x_authority_set_authorization_data (a, priv->authorization_data, priv->authorization_data_length); } records = g_list_append (records, g_steal_pointer (&a)); @@ -320,14 +337,15 @@ x_authority_write (XAuthority *auth, XAuthWriteMode mode, const gchar *filename, for (GList *link = records; link && result; link = link->next) { XAuthority *a = link->data; - - result = write_uint16 (output_fd, a->priv->family) && - write_uint16 (output_fd, a->priv->address_length) && - write_data (output_fd, a->priv->address, a->priv->address_length) && - write_string (output_fd, a->priv->number) && - write_string (output_fd, a->priv->authorization_name) && - write_uint16 (output_fd, a->priv->authorization_data_length) && - write_data (output_fd, a->priv->authorization_data, a->priv->authorization_data_length); + XAuthorityPrivate *a_priv = x_authority_get_instance_private (a); + + result = write_uint16 (output_fd, a_priv->family) && + write_uint16 (output_fd, a_priv->address_length) && + write_data (output_fd, a_priv->address, a_priv->address_length) && + write_string (output_fd, a_priv->number) && + write_string (output_fd, a_priv->authorization_name) && + write_uint16 (output_fd, a_priv->authorization_data_length) && + write_data (output_fd, a_priv->authorization_data, a_priv->authorization_data_length); } g_list_free_full (records, g_object_unref); @@ -351,19 +369,20 @@ x_authority_write (XAuthority *auth, XAuthWriteMode mode, const gchar *filename, static void x_authority_init (XAuthority *auth) { - auth->priv = G_TYPE_INSTANCE_GET_PRIVATE (auth, X_AUTHORITY_TYPE, XAuthorityPrivate); - auth->priv->number = g_strdup (""); + XAuthorityPrivate *priv = x_authority_get_instance_private (auth); + priv->number = g_strdup (""); } static void x_authority_finalize (GObject *object) { XAuthority *self = X_AUTHORITY (object); + XAuthorityPrivate *priv = x_authority_get_instance_private (self); - g_clear_pointer (&self->priv->address, g_free); - g_clear_pointer (&self->priv->number, g_free); - g_clear_pointer (&self->priv->authorization_name, g_free); - g_clear_pointer (&self->priv->authorization_data, g_free); + g_clear_pointer (&priv->address, g_free); + g_clear_pointer (&priv->number, g_free); + g_clear_pointer (&priv->authorization_name, g_free); + g_clear_pointer (&priv->authorization_data, g_free); G_OBJECT_CLASS (x_authority_parent_class)->finalize (object); } diff --git a/src/x-authority.h b/src/x-authority.h index 748e3f18..1ddb8526 100644 --- a/src/x-authority.h +++ b/src/x-authority.h @@ -19,12 +19,9 @@ G_BEGIN_DECLS #define X_AUTHORITY_TYPE (x_authority_get_type()) #define X_AUTHORITY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), X_AUTHORITY_TYPE, XAuthority)); -typedef struct XAuthorityPrivate XAuthorityPrivate; - typedef struct { GObject parent_instance; - XAuthorityPrivate *priv; } XAuthority; typedef struct diff --git a/src/x-server-local.c b/src/x-server-local.c index 223593e1..47286f29 100644 --- a/src/x-server-local.c +++ b/src/x-server-local.c @@ -22,7 +22,7 @@ #include "process.h" #include "vt.h" -struct XServerLocalPrivate +typedef struct { /* X server process */ Process *x_server_process; @@ -66,7 +66,7 @@ struct XServerLocalPrivate /* Background to set */ gchar *background; -}; +} XServerLocalPrivate; static void x_server_local_logger_iface_init (LoggerInterface *iface); @@ -188,120 +188,137 @@ x_server_local_new (void) void x_server_local_set_command (XServerLocal *server, const gchar *command) { + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); g_return_if_fail (server != NULL); - g_free (server->priv->command); - server->priv->command = g_strdup (command); + g_free (priv->command); + priv->command = g_strdup (command); } void x_server_local_set_vt (XServerLocal *server, gint vt) { + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); + g_return_if_fail (server != NULL); - if (server->priv->have_vt_ref) - vt_unref (server->priv->vt); - server->priv->have_vt_ref = FALSE; - server->priv->vt = vt; + + if (priv->have_vt_ref) + vt_unref (priv->vt); + priv->have_vt_ref = FALSE; + priv->vt = vt; if (vt > 0) { vt_ref (vt); - server->priv->have_vt_ref = TRUE; + priv->have_vt_ref = TRUE; } } void x_server_local_set_config (XServerLocal *server, const gchar *path) { + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); g_return_if_fail (server != NULL); - g_free (server->priv->config_file); - server->priv->config_file = g_strdup (path); + g_free (priv->config_file); + priv->config_file = g_strdup (path); } void x_server_local_set_layout (XServerLocal *server, const gchar *layout) { + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); g_return_if_fail (server != NULL); - g_free (server->priv->layout); - server->priv->layout = g_strdup (layout); + g_free (priv->layout); + priv->layout = g_strdup (layout); } void x_server_local_set_xdg_seat (XServerLocal *server, const gchar *xdg_seat) { + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); g_return_if_fail (server != NULL); - g_free (server->priv->xdg_seat); - server->priv->xdg_seat = g_strdup (xdg_seat); + g_free (priv->xdg_seat); + priv->xdg_seat = g_strdup (xdg_seat); } void x_server_local_set_allow_tcp (XServerLocal *server, gboolean allow_tcp) { + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); g_return_if_fail (server != NULL); - server->priv->allow_tcp = allow_tcp; + priv->allow_tcp = allow_tcp; } void x_server_local_set_xdmcp_server (XServerLocal *server, const gchar *hostname) { + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); g_return_if_fail (server != NULL); - g_free (server->priv->xdmcp_server); - server->priv->xdmcp_server = g_strdup (hostname); + g_free (priv->xdmcp_server); + priv->xdmcp_server = g_strdup (hostname); } const gchar * x_server_local_get_xdmcp_server (XServerLocal *server) { + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); g_return_val_if_fail (server != NULL, 0); - return server->priv->xdmcp_server; + return priv->xdmcp_server; } void x_server_local_set_xdmcp_port (XServerLocal *server, guint port) { + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); g_return_if_fail (server != NULL); - server->priv->xdmcp_port = port; + priv->xdmcp_port = port; } guint x_server_local_get_xdmcp_port (XServerLocal *server) { + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); g_return_val_if_fail (server != NULL, 0); - return server->priv->xdmcp_port; + return priv->xdmcp_port; } void x_server_local_set_xdmcp_key (XServerLocal *server, const gchar *key) { + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); g_return_if_fail (server != NULL); - g_free (server->priv->xdmcp_key); - server->priv->xdmcp_key = g_strdup (key); + g_free (priv->xdmcp_key); + priv->xdmcp_key = g_strdup (key); x_server_set_authority (X_SERVER (server), NULL); } void x_server_local_set_background (XServerLocal *server, const gchar *background) { + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); g_return_if_fail (server != NULL); - g_free (server->priv->background); - server->priv->background = g_strdup (background); + g_free (priv->background); + priv->background = g_strdup (background); } static guint x_server_local_get_display_number (XServer *server) { - return X_SERVER_LOCAL (server)->priv->display_number; + XServerLocalPrivate *priv = x_server_local_get_instance_private (X_SERVER_LOCAL (server)); + return priv->display_number; } static gint x_server_local_get_vt (DisplayServer *server) { - return X_SERVER_LOCAL (server)->priv->vt; + XServerLocalPrivate *priv = x_server_local_get_instance_private (X_SERVER_LOCAL (server)); + return priv->vt; } const gchar * x_server_local_get_authority_file_path (XServerLocal *server) { + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); g_return_val_if_fail (server != NULL, 0); - return server->priv->authority_file; + return priv->authority_file; } static gchar * @@ -348,10 +365,12 @@ x_server_local_get_log_stdout (XServerLocal *server) static void got_signal_cb (Process *process, int signum, XServerLocal *server) { - if (signum == SIGUSR1 && !server->priv->got_signal) + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); + + if (signum == SIGUSR1 && !priv->got_signal) { - server->priv->got_signal = TRUE; - l_debug (server, "Got signal from X server :%d", server->priv->display_number); + priv->got_signal = TRUE; + l_debug (server, "Got signal from X server :%d", priv->display_number); // FIXME: Check return value DISPLAY_SERVER_CLASS (x_server_local_parent_class)->start (DISPLAY_SERVER (server)); @@ -361,24 +380,26 @@ got_signal_cb (Process *process, int signum, XServerLocal *server) static void stopped_cb (Process *process, XServerLocal *server) { + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); + l_debug (server, "X server stopped"); /* Release VT and display number for re-use */ - if (server->priv->have_vt_ref) + if (priv->have_vt_ref) { - vt_unref (server->priv->vt); - server->priv->have_vt_ref = FALSE; + vt_unref (priv->vt); + priv->have_vt_ref = FALSE; } - x_server_local_release_display_number (server->priv->display_number); + x_server_local_release_display_number (priv->display_number); - if (x_server_get_authority (X_SERVER (server)) && server->priv->authority_file) + if (x_server_get_authority (X_SERVER (server)) && priv->authority_file) { - l_debug (server, "Removing X server authority %s", server->priv->authority_file); + l_debug (server, "Removing X server authority %s", priv->authority_file); - g_unlink (server->priv->authority_file); + g_unlink (priv->authority_file); - g_free (server->priv->authority_file); - server->priv->authority_file = NULL; + g_free (priv->authority_file); + priv->authority_file = NULL; } DISPLAY_SERVER_CLASS (x_server_local_parent_class)->stop (DISPLAY_SERVER (server)); @@ -387,12 +408,14 @@ stopped_cb (Process *process, XServerLocal *server) static void write_authority_file (XServerLocal *server) { + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); + XAuthority *authority = x_server_get_authority (X_SERVER (server)); if (!authority) return; /* Get file to write to if have authority */ - if (!server->priv->authority_file) + if (!priv->authority_file) { g_autofree gchar *run_dir = NULL; g_autofree gchar *dir = NULL; @@ -402,13 +425,13 @@ write_authority_file (XServerLocal *server) if (g_mkdir_with_parents (dir, S_IRWXU) < 0) l_warning (server, "Failed to make authority directory %s: %s", dir, strerror (errno)); - server->priv->authority_file = g_build_filename (dir, x_server_get_address (X_SERVER (server)), NULL); + priv->authority_file = g_build_filename (dir, x_server_get_address (X_SERVER (server)), NULL); } - l_debug (server, "Writing X server authority to %s", server->priv->authority_file); + l_debug (server, "Writing X server authority to %s", priv->authority_file); g_autoptr(GError) error = NULL; - x_authority_write (authority, XAUTH_WRITE_MODE_REPLACE, server->priv->authority_file, &error); + x_authority_write (authority, XAUTH_WRITE_MODE_REPLACE, priv->authority_file, &error); if (error) l_warning (server, "Failed to write authority: %s", error->message); } @@ -417,61 +440,62 @@ static gboolean x_server_local_start (DisplayServer *display_server) { XServerLocal *server = X_SERVER_LOCAL (display_server); + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); - g_return_val_if_fail (server->priv->x_server_process == NULL, FALSE); + g_return_val_if_fail (priv->x_server_process == NULL, FALSE); - server->priv->got_signal = FALSE; + priv->got_signal = FALSE; - g_return_val_if_fail (server->priv->command != NULL, FALSE); + g_return_val_if_fail (priv->command != NULL, FALSE); ProcessRunFunc run_cb = X_SERVER_LOCAL_GET_CLASS (server)->get_run_function (server); - server->priv->x_server_process = process_new (run_cb, server); - process_set_clear_environment (server->priv->x_server_process, TRUE); - g_signal_connect (server->priv->x_server_process, PROCESS_SIGNAL_GOT_SIGNAL, G_CALLBACK (got_signal_cb), server); - g_signal_connect (server->priv->x_server_process, PROCESS_SIGNAL_STOPPED, G_CALLBACK (stopped_cb), server); + priv->x_server_process = process_new (run_cb, server); + process_set_clear_environment (priv->x_server_process, TRUE); + g_signal_connect (priv->x_server_process, PROCESS_SIGNAL_GOT_SIGNAL, G_CALLBACK (got_signal_cb), server); + g_signal_connect (priv->x_server_process, PROCESS_SIGNAL_STOPPED, G_CALLBACK (stopped_cb), server); /* Setup logging */ g_autofree gchar *filename = g_strdup_printf ("x-%d.log", x_server_get_display_number (X_SERVER (server))); g_autofree gchar *dir = config_get_string (config_get_instance (), "LightDM", "log-directory"); g_autofree gchar *log_file = g_build_filename (dir, filename, NULL); gboolean backup_logs = config_get_boolean (config_get_instance (), "LightDM", "backup-logs"); - process_set_log_file (server->priv->x_server_process, log_file, X_SERVER_LOCAL_GET_CLASS (server)->get_log_stdout (server), backup_logs ? LOG_MODE_BACKUP_AND_TRUNCATE : LOG_MODE_APPEND); + process_set_log_file (priv->x_server_process, log_file, X_SERVER_LOCAL_GET_CLASS (server)->get_log_stdout (server), backup_logs ? LOG_MODE_BACKUP_AND_TRUNCATE : LOG_MODE_APPEND); l_debug (display_server, "Logging to %s", log_file); - g_autofree gchar *absolute_command = get_absolute_command (server->priv->command); + g_autofree gchar *absolute_command = get_absolute_command (priv->command); if (!absolute_command) { - l_debug (display_server, "Can't launch X server %s, not found in path", server->priv->command); - stopped_cb (server->priv->x_server_process, X_SERVER_LOCAL (server)); + l_debug (display_server, "Can't launch X server %s, not found in path", priv->command); + stopped_cb (priv->x_server_process, X_SERVER_LOCAL (server)); return FALSE; } g_autoptr(GString) command = g_string_new (absolute_command); - g_string_append_printf (command, " :%d", server->priv->display_number); + g_string_append_printf (command, " :%d", priv->display_number); - if (server->priv->config_file) - g_string_append_printf (command, " -config %s", server->priv->config_file); + if (priv->config_file) + g_string_append_printf (command, " -config %s", priv->config_file); - if (server->priv->layout) - g_string_append_printf (command, " -layout %s", server->priv->layout); + if (priv->layout) + g_string_append_printf (command, " -layout %s", priv->layout); - if (server->priv->xdg_seat) - g_string_append_printf (command, " -seat %s", server->priv->xdg_seat); + if (priv->xdg_seat) + g_string_append_printf (command, " -seat %s", priv->xdg_seat); write_authority_file (server); - if (server->priv->authority_file) - g_string_append_printf (command, " -auth %s", server->priv->authority_file); + if (priv->authority_file) + g_string_append_printf (command, " -auth %s", priv->authority_file); /* Connect to a remote server using XDMCP */ - if (server->priv->xdmcp_server != NULL) + if (priv->xdmcp_server != NULL) { - if (server->priv->xdmcp_port != 0) - g_string_append_printf (command, " -port %d", server->priv->xdmcp_port); - g_string_append_printf (command, " -query %s", server->priv->xdmcp_server); - if (server->priv->xdmcp_key) - g_string_append_printf (command, " -cookie %s", server->priv->xdmcp_key); + if (priv->xdmcp_port != 0) + g_string_append_printf (command, " -port %d", priv->xdmcp_port); + g_string_append_printf (command, " -query %s", priv->xdmcp_server); + if (priv->xdmcp_key) + g_string_append_printf (command, " -cookie %s", priv->xdmcp_key); } - else if (server->priv->allow_tcp) + else if (priv->allow_tcp) { if (x_server_local_version_compare (1, 17) >= 0) g_string_append (command, " -listen tcp"); @@ -479,50 +503,50 @@ x_server_local_start (DisplayServer *display_server) else g_string_append (command, " -nolisten tcp"); - if (server->priv->vt >= 0) - g_string_append_printf (command, " vt%d -novtswitch", server->priv->vt); + if (priv->vt >= 0) + g_string_append_printf (command, " vt%d -novtswitch", priv->vt); - if (server->priv->background) - g_string_append_printf (command, " -background %s", server->priv->background); + if (priv->background) + g_string_append_printf (command, " -background %s", priv->background); /* Allow sub-classes to add arguments */ if (X_SERVER_LOCAL_GET_CLASS (server)->add_args) X_SERVER_LOCAL_GET_CLASS (server)->add_args (server, command); - process_set_command (server->priv->x_server_process, command->str); + process_set_command (priv->x_server_process, command->str); l_debug (display_server, "Launching X Server"); /* If running inside another display then pass through those variables */ if (g_getenv ("DISPLAY")) { - process_set_env (server->priv->x_server_process, "DISPLAY", g_getenv ("DISPLAY")); + process_set_env (priv->x_server_process, "DISPLAY", g_getenv ("DISPLAY")); if (g_getenv ("XAUTHORITY")) - process_set_env (server->priv->x_server_process, "XAUTHORITY", g_getenv ("XAUTHORITY")); + process_set_env (priv->x_server_process, "XAUTHORITY", g_getenv ("XAUTHORITY")); else { g_autofree gchar *path = g_build_filename (g_get_home_dir (), ".Xauthority", NULL); - process_set_env (server->priv->x_server_process, "XAUTHORITY", path); + process_set_env (priv->x_server_process, "XAUTHORITY", path); } } /* Pass through library variables */ if (g_getenv ("LD_PRELOAD")) - process_set_env (server->priv->x_server_process, "LD_PRELOAD", g_getenv ("LD_PRELOAD")); + process_set_env (priv->x_server_process, "LD_PRELOAD", g_getenv ("LD_PRELOAD")); if (g_getenv ("LD_LIBRARY_PATH")) - process_set_env (server->priv->x_server_process, "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH")); + process_set_env (priv->x_server_process, "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH")); if (g_getenv ("PATH")) - process_set_env (server->priv->x_server_process, "PATH", g_getenv ("PATH")); + process_set_env (priv->x_server_process, "PATH", g_getenv ("PATH")); /* Variable required for regression tests */ if (g_getenv ("LIGHTDM_TEST_ROOT")) - process_set_env (server->priv->x_server_process, "LIGHTDM_TEST_ROOT", g_getenv ("LIGHTDM_TEST_ROOT")); + process_set_env (priv->x_server_process, "LIGHTDM_TEST_ROOT", g_getenv ("LIGHTDM_TEST_ROOT")); - gboolean result = process_start (server->priv->x_server_process, FALSE); + gboolean result = process_start (priv->x_server_process, FALSE); if (result) - l_debug (display_server, "Waiting for ready signal from X server :%d", server->priv->display_number); + l_debug (display_server, "Waiting for ready signal from X server :%d", priv->display_number); else - stopped_cb (server->priv->x_server_process, X_SERVER_LOCAL (server)); + stopped_cb (priv->x_server_process, X_SERVER_LOCAL (server)); return result; } @@ -530,36 +554,38 @@ x_server_local_start (DisplayServer *display_server) static void x_server_local_stop (DisplayServer *server) { - process_stop (X_SERVER_LOCAL (server)->priv->x_server_process); + XServerLocalPrivate *priv = x_server_local_get_instance_private (X_SERVER_LOCAL (server)); + process_stop (priv->x_server_process); } static void x_server_local_init (XServerLocal *server) { - server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, X_SERVER_LOCAL_TYPE, XServerLocalPrivate); - server->priv->vt = -1; - server->priv->command = g_strdup ("X"); - server->priv->display_number = x_server_local_get_unused_display_number (); + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); + priv->vt = -1; + priv->command = g_strdup ("X"); + priv->display_number = x_server_local_get_unused_display_number (); } static void x_server_local_finalize (GObject *object) { XServerLocal *self = X_SERVER_LOCAL (object); - - if (self->priv->x_server_process) - g_signal_handlers_disconnect_matched (self->priv->x_server_process, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); - g_clear_object (&self->priv->x_server_process); - g_clear_pointer (&self->priv->command, g_free); - g_clear_pointer (&self->priv->config_file, g_free); - g_clear_pointer (&self->priv->layout, g_free); - g_clear_pointer (&self->priv->xdg_seat, g_free); - g_clear_pointer (&self->priv->xdmcp_server, g_free); - g_clear_pointer (&self->priv->xdmcp_key, g_free); - g_clear_pointer (&self->priv->authority_file, g_free); - if (self->priv->have_vt_ref) - vt_unref (self->priv->vt); - g_clear_pointer (&self->priv->background, g_free); + XServerLocalPrivate *priv = x_server_local_get_instance_private (self); + + if (priv->x_server_process) + g_signal_handlers_disconnect_matched (priv->x_server_process, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); + g_clear_object (&priv->x_server_process); + g_clear_pointer (&priv->command, g_free); + g_clear_pointer (&priv->config_file, g_free); + g_clear_pointer (&priv->layout, g_free); + g_clear_pointer (&priv->xdg_seat, g_free); + g_clear_pointer (&priv->xdmcp_server, g_free); + g_clear_pointer (&priv->xdmcp_key, g_free); + g_clear_pointer (&priv->authority_file, g_free); + if (priv->have_vt_ref) + vt_unref (priv->vt); + g_clear_pointer (&priv->background, g_free); G_OBJECT_CLASS (x_server_local_parent_class)->finalize (object); } @@ -584,7 +610,8 @@ static gint x_server_local_real_logprefix (Logger *self, gchar *buf, gulong buflen) { XServerLocal *server = X_SERVER_LOCAL (self); - return g_snprintf (buf, buflen, "XServer %d: ", server->priv->display_number); + XServerLocalPrivate *priv = x_server_local_get_instance_private (server); + return g_snprintf (buf, buflen, "XServer %d: ", priv->display_number); } static void diff --git a/src/x-server-local.h b/src/x-server-local.h index c1714585..41b41865 100644 --- a/src/x-server-local.h +++ b/src/x-server-local.h @@ -23,12 +23,9 @@ G_BEGIN_DECLS #define X_SERVER_LOCAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), X_SERVER_LOCAL_TYPE, XServerLocalClass)) #define IS_X_SERVER_LOCAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), X_SERVER_LOCAL_TYPE)) -typedef struct XServerLocalPrivate XServerLocalPrivate; - typedef struct { - XServer parent_instance; - XServerLocalPrivate *priv; + XServer parent_instance; } XServerLocal; typedef struct diff --git a/src/x-server-remote.c b/src/x-server-remote.c index 675e3f80..4e0a9dad 100644 --- a/src/x-server-remote.c +++ b/src/x-server-remote.c @@ -13,11 +13,11 @@ #include "x-server-remote.h" -struct XServerRemotePrivate +typedef struct { /* Display number to use */ guint display_number; -}; +} XServerRemotePrivate; G_DEFINE_TYPE_WITH_PRIVATE (XServerRemote, x_server_remote, X_SERVER_TYPE) @@ -25,8 +25,9 @@ XServerRemote * x_server_remote_new (const gchar *hostname, guint number, XAuthority *authority) { XServerRemote *server = g_object_new (X_SERVER_REMOTE_TYPE, NULL); + XServerRemotePrivate *priv = x_server_remote_get_instance_private (server); - server->priv->display_number = number; + priv->display_number = number; x_server_set_hostname (X_SERVER (server), hostname); x_server_set_authority (X_SERVER (server), authority); @@ -37,13 +38,13 @@ x_server_remote_new (const gchar *hostname, guint number, XAuthority *authority) static guint x_server_remote_get_display_number (XServer *server) { - return X_SERVER_REMOTE (server)->priv->display_number; + XServerRemotePrivate *priv = x_server_remote_get_instance_private (X_SERVER_REMOTE (server)); + return priv->display_number; } static void x_server_remote_init (XServerRemote *server) { - server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, X_SERVER_REMOTE_TYPE, XServerRemotePrivate); } static void diff --git a/src/x-server-remote.h b/src/x-server-remote.h index c1c160d3..024b8c3b 100644 --- a/src/x-server-remote.h +++ b/src/x-server-remote.h @@ -19,12 +19,9 @@ G_BEGIN_DECLS #define X_SERVER_REMOTE_TYPE (x_server_remote_get_type()) #define X_SERVER_REMOTE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), X_SERVER_REMOTE_TYPE, XServerRemote)) -typedef struct XServerRemotePrivate XServerRemotePrivate; - typedef struct { - XServer parent_instance; - XServerRemotePrivate *priv; + XServer parent_instance; } XServerRemote; typedef struct diff --git a/src/x-server-xmir.c b/src/x-server-xmir.c index 05e6ccc0..38cb8656 100644 --- a/src/x-server-xmir.c +++ b/src/x-server-xmir.c @@ -12,7 +12,7 @@ #include "x-server-xmir.h" -struct XServerXmirPrivate +typedef struct { /* Compositor we are running under */ UnitySystemCompositor *compositor; @@ -25,16 +25,18 @@ struct XServerXmirPrivate /* Filename of socket Mir is listening on */ gchar *mir_socket; -}; +} XServerXmirPrivate; G_DEFINE_TYPE_WITH_PRIVATE (XServerXmir, x_server_xmir, X_SERVER_LOCAL_TYPE) static void compositor_ready_cb (UnitySystemCompositor *compositor, XServerXmir *server) { - if (!server->priv->waiting_for_compositor) + XServerXmirPrivate *priv = x_server_xmir_get_instance_private (server); + + if (!priv->waiting_for_compositor) return; - server->priv->waiting_for_compositor = FALSE; + priv->waiting_for_compositor = FALSE; gboolean result = X_SERVER_LOCAL_CLASS (x_server_xmir_parent_class)->start (DISPLAY_SERVER (server)); if (!result) @@ -51,8 +53,10 @@ XServerXmir * x_server_xmir_new (UnitySystemCompositor *compositor) { XServerXmir *server = g_object_new (X_SERVER_XMIR_TYPE, NULL); + XServerXmirPrivate *priv = x_server_xmir_get_instance_private (server); + x_server_local_set_command (X_SERVER_LOCAL (server), "Xmir"); - server->priv->compositor = g_object_ref (compositor); + priv->compositor = g_object_ref (compositor); g_signal_connect (compositor, DISPLAY_SERVER_SIGNAL_READY, G_CALLBACK (compositor_ready_cb), server); g_signal_connect (compositor, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (compositor_stopped_cb), server); @@ -62,63 +66,70 @@ x_server_xmir_new (UnitySystemCompositor *compositor) void x_server_xmir_set_mir_id (XServerXmir *server, const gchar *id) { + XServerXmirPrivate *priv = x_server_xmir_get_instance_private (server); g_return_if_fail (server != NULL); - g_free (server->priv->mir_id); - server->priv->mir_id = g_strdup (id); + g_free (priv->mir_id); + priv->mir_id = g_strdup (id); } const gchar * x_server_xmir_get_mir_id (XServerXmir *server) { + XServerXmirPrivate *priv = x_server_xmir_get_instance_private (server); g_return_val_if_fail (server != NULL, NULL); - return server->priv->mir_id; + return priv->mir_id; } void x_server_xmir_set_mir_socket (XServerXmir *server, const gchar *socket) { + XServerXmirPrivate *priv = x_server_xmir_get_instance_private (server); g_return_if_fail (server != NULL); - g_free (server->priv->mir_socket); - server->priv->mir_socket = g_strdup (socket); + g_free (priv->mir_socket); + priv->mir_socket = g_strdup (socket); } static void x_server_xmir_add_args (XServerLocal *x_server, GString *command) { XServerXmir *server = X_SERVER_XMIR (x_server); + XServerXmirPrivate *priv = x_server_xmir_get_instance_private (server); - if (server->priv->mir_id) - g_string_append_printf (command, " -mir %s", server->priv->mir_id); + if (priv->mir_id) + g_string_append_printf (command, " -mir %s", priv->mir_id); - if (server->priv->mir_socket) - g_string_append_printf (command, " -mirSocket %s", server->priv->mir_socket); + if (priv->mir_socket) + g_string_append_printf (command, " -mirSocket %s", priv->mir_socket); } static DisplayServer * x_server_xmir_get_parent (DisplayServer *server) { - return DISPLAY_SERVER (X_SERVER_XMIR (server)->priv->compositor); + XServerXmirPrivate *priv = x_server_xmir_get_instance_private (X_SERVER_XMIR (server)); + return DISPLAY_SERVER (priv->compositor); } static gint x_server_xmir_get_vt (DisplayServer *server) { - return display_server_get_vt (DISPLAY_SERVER (X_SERVER_XMIR (server)->priv->compositor)); + XServerXmirPrivate *priv = x_server_xmir_get_instance_private (X_SERVER_XMIR (server)); + return display_server_get_vt (DISPLAY_SERVER (priv->compositor)); } static gboolean x_server_xmir_start (DisplayServer *display_server) { XServerXmir *server = X_SERVER_XMIR (display_server); + XServerXmirPrivate *priv = x_server_xmir_get_instance_private (server); - if (display_server_get_is_ready (DISPLAY_SERVER (server->priv->compositor))) + if (display_server_get_is_ready (DISPLAY_SERVER (priv->compositor))) return X_SERVER_LOCAL_CLASS (x_server_xmir_parent_class)->start (display_server); else { - if (!server->priv->waiting_for_compositor) + if (!priv->waiting_for_compositor) { - server->priv->waiting_for_compositor = TRUE; - if (!display_server_start (DISPLAY_SERVER (server->priv->compositor))) + priv->waiting_for_compositor = TRUE; + if (!display_server_start (DISPLAY_SERVER (priv->compositor))) return FALSE; } return TRUE; @@ -128,19 +139,19 @@ x_server_xmir_start (DisplayServer *display_server) static void x_server_xmir_init (XServerXmir *server) { - server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, X_SERVER_XMIR_TYPE, XServerXmirPrivate); } static void x_server_xmir_finalize (GObject *object) { XServerXmir *self = X_SERVER_XMIR (object); + XServerXmirPrivate *priv = x_server_xmir_get_instance_private (self); - if (self->priv->compositor) - g_signal_handlers_disconnect_matched (self->priv->compositor, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); - g_clear_object (&self->priv->compositor); - g_clear_pointer (&self->priv->mir_id, g_free); - g_clear_pointer (&self->priv->mir_socket, g_free); + if (priv->compositor) + g_signal_handlers_disconnect_matched (priv->compositor, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); + g_clear_object (&priv->compositor); + g_clear_pointer (&priv->mir_id, g_free); + g_clear_pointer (&priv->mir_socket, g_free); G_OBJECT_CLASS (x_server_xmir_parent_class)->finalize (object); } diff --git a/src/x-server-xmir.h b/src/x-server-xmir.h index 6d1d45de..24b631c4 100644 --- a/src/x-server-xmir.h +++ b/src/x-server-xmir.h @@ -20,12 +20,9 @@ G_BEGIN_DECLS #define X_SERVER_XMIR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), X_SERVER_XMIR_TYPE, XServerXmir)) #define IS_X_SERVER_XMIR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), X_SERVER_XMIR_TYPE)) -typedef struct XServerXmirPrivate XServerXmirPrivate; - typedef struct { - XServerLocal parent_instance; - XServerXmirPrivate *priv; + XServerLocal parent_instance; } XServerXmir; typedef struct diff --git a/src/x-server-xvnc.c b/src/x-server-xvnc.c index 601240ef..68340d53 100644 --- a/src/x-server-xvnc.c +++ b/src/x-server-xvnc.c @@ -20,14 +20,14 @@ #include "configuration.h" #include "process.h" -struct XServerXVNCPrivate +typedef struct { /* File descriptor to use for standard input */ gint socket_fd; /* Geometry and colour depth */ gint width, height, depth; -}; +} XServerXVNCPrivate; G_DEFINE_TYPE_WITH_PRIVATE (XServerXVNC, x_server_xvnc, X_SERVER_LOCAL_TYPE) @@ -43,41 +43,46 @@ x_server_xvnc_new (void) void x_server_xvnc_set_socket (XServerXVNC *server, int fd) { + XServerXVNCPrivate *priv = x_server_xvnc_get_instance_private (server); g_return_if_fail (server != NULL); - server->priv->socket_fd = fd; + priv->socket_fd = fd; } int x_server_xvnc_get_socket (XServerXVNC *server) { + XServerXVNCPrivate *priv = x_server_xvnc_get_instance_private (server); g_return_val_if_fail (server != NULL, 0); - return server->priv->socket_fd; + return priv->socket_fd; } void x_server_xvnc_set_geometry (XServerXVNC *server, gint width, gint height) { + XServerXVNCPrivate *priv = x_server_xvnc_get_instance_private (server); g_return_if_fail (server != NULL); - server->priv->width = width; - server->priv->height = height; + priv->width = width; + priv->height = height; } void x_server_xvnc_set_depth (XServerXVNC *server, gint depth) { + XServerXVNCPrivate *priv = x_server_xvnc_get_instance_private (server); g_return_if_fail (server != NULL); - server->priv->depth = depth; + priv->depth = depth; } static void x_server_xvnc_run (Process *process, gpointer user_data) { XServerXVNC *server = user_data; + XServerXVNCPrivate *priv = x_server_xvnc_get_instance_private (server); /* Connect input */ - dup2 (server->priv->socket_fd, STDIN_FILENO); - dup2 (server->priv->socket_fd, STDOUT_FILENO); - close (server->priv->socket_fd); + dup2 (priv->socket_fd, STDIN_FILENO); + dup2 (priv->socket_fd, STDOUT_FILENO); + close (priv->socket_fd); /* Set SIGUSR1 to ignore so the X server can indicate it when it is ready */ signal (SIGUSR1, SIG_IGN); @@ -105,23 +110,24 @@ static void x_server_xvnc_add_args (XServerLocal *x_server, GString *command) { XServerXVNC *server = X_SERVER_XVNC (x_server); + XServerXVNCPrivate *priv = x_server_xvnc_get_instance_private (server); g_string_append (command, " -inetd"); - if (server->priv->width > 0 && server->priv->height > 0) - g_string_append_printf (command, " -geometry %dx%d", server->priv->width, server->priv->height); + if (priv->width > 0 && priv->height > 0) + g_string_append_printf (command, " -geometry %dx%d", priv->width, priv->height); - if (server->priv->depth > 0) - g_string_append_printf (command, " -depth %d", server->priv->depth); + if (priv->depth > 0) + g_string_append_printf (command, " -depth %d", priv->depth); } static void x_server_xvnc_init (XServerXVNC *server) { - server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, X_SERVER_XVNC_TYPE, XServerXVNCPrivate); - server->priv->width = 1024; - server->priv->height = 768; - server->priv->depth = 8; + XServerXVNCPrivate *priv = x_server_xvnc_get_instance_private (server); + priv->width = 1024; + priv->height = 768; + priv->depth = 8; } static void diff --git a/src/x-server-xvnc.h b/src/x-server-xvnc.h index accea198..eb71c80f 100644 --- a/src/x-server-xvnc.h +++ b/src/x-server-xvnc.h @@ -20,12 +20,9 @@ G_BEGIN_DECLS #define X_SERVER_XVNC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), X_SERVER_XVNC_TYPE, XServerXVNC)) #define IS_X_SERVER_XVNC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), X_SERVER_XVNC_TYPE)) -typedef struct XServerXVNCPrivate XServerXVNCPrivate; - typedef struct { - XServerLocal parent_instance; - XServerXVNCPrivate *priv; + XServerLocal parent_instance; } XServerXVNC; typedef struct diff --git a/src/x-server.c b/src/x-server.c index dc99d837..ae64808a 100644 --- a/src/x-server.c +++ b/src/x-server.c @@ -16,7 +16,7 @@ #include "x-server.h" #include "configuration.h" -struct XServerPrivate +typedef struct { /* Host running the server */ gchar *hostname; @@ -29,25 +29,29 @@ struct XServerPrivate /* Connection to this X server */ xcb_connection_t *connection; -}; +} XServerPrivate; G_DEFINE_TYPE_WITH_PRIVATE (XServer, x_server, DISPLAY_SERVER_TYPE) void x_server_set_hostname (XServer *server, const gchar *hostname) { + XServerPrivate *priv = x_server_get_instance_private (server); + g_return_if_fail (server != NULL); - g_free (server->priv->hostname); - server->priv->hostname = g_strdup (hostname); - g_free (server->priv->address); - server->priv->address = NULL; + + g_free (priv->hostname); + priv->hostname = g_strdup (hostname); + g_free (priv->address); + priv->address = NULL; } gchar * x_server_get_hostname (XServer *server) { + XServerPrivate *priv = x_server_get_instance_private (server); g_return_val_if_fail (server != NULL, NULL); - return server->priv->hostname; + return priv->hostname; } guint @@ -60,34 +64,39 @@ x_server_get_display_number (XServer *server) const gchar * x_server_get_address (XServer *server) { + XServerPrivate *priv = x_server_get_instance_private (server); + g_return_val_if_fail (server != NULL, NULL); - if (!server->priv->address) + if (!priv->address) { - if (server->priv->hostname) - server->priv->address = g_strdup_printf("%s:%d", server->priv->hostname, x_server_get_display_number (server)); + if (priv->hostname) + priv->address = g_strdup_printf("%s:%d", priv->hostname, x_server_get_display_number (server)); else - server->priv->address = g_strdup_printf(":%d", x_server_get_display_number (server)); + priv->address = g_strdup_printf(":%d", x_server_get_display_number (server)); } - return server->priv->address; + return priv->address; } void x_server_set_authority (XServer *server, XAuthority *authority) { + XServerPrivate *priv = x_server_get_instance_private (server); + g_return_if_fail (server != NULL); - g_clear_object (&server->priv->authority); + g_clear_object (&priv->authority); if (authority) - server->priv->authority = g_object_ref (authority); + priv->authority = g_object_ref (authority); } XAuthority * x_server_get_authority (XServer *server) { + XServerPrivate *priv = x_server_get_instance_private (server); g_return_val_if_fail (server != NULL, NULL); - return server->priv->authority; + return priv->authority; } static const gchar * @@ -106,21 +115,22 @@ static gboolean x_server_start (DisplayServer *display_server) { XServer *server = X_SERVER (display_server); + XServerPrivate *priv = x_server_get_instance_private (server); xcb_auth_info_t *auth = NULL, a; - if (server->priv->authority) + if (priv->authority) { - a.namelen = strlen (x_authority_get_authorization_name (server->priv->authority)); - a.name = (char *) x_authority_get_authorization_name (server->priv->authority); - a.datalen = x_authority_get_authorization_data_length (server->priv->authority); - a.data = (char *) x_authority_get_authorization_data (server->priv->authority); + a.namelen = strlen (x_authority_get_authorization_name (priv->authority)); + a.name = (char *) x_authority_get_authorization_name (priv->authority); + a.datalen = x_authority_get_authorization_data_length (priv->authority); + a.data = (char *) x_authority_get_authorization_data (priv->authority); auth = &a; } /* Open connection */ l_debug (server, "Connecting to XServer %s", x_server_get_address (server)); - server->priv->connection = xcb_connect_to_display_with_auth_info (x_server_get_address (server), auth, NULL); - if (xcb_connection_has_error (server->priv->connection)) + priv->connection = xcb_connect_to_display_with_auth_info (x_server_get_address (server), auth, NULL); + if (xcb_connection_has_error (priv->connection)) { l_debug (server, "Error connecting to XServer %s", x_server_get_address (server)); return FALSE; @@ -178,20 +188,20 @@ x_server_disconnect_session (DisplayServer *display_server, Session *session) void x_server_init (XServer *server) { - server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, X_SERVER_TYPE, XServerPrivate); } static void x_server_finalize (GObject *object) { XServer *self = X_SERVER (object); - - g_clear_pointer (&self->priv->hostname, g_free); - g_clear_pointer (&self->priv->address, g_free); - g_clear_object (&self->priv->authority); - if (self->priv->connection) - xcb_disconnect (self->priv->connection); - self->priv->connection = NULL; + XServerPrivate *priv = x_server_get_instance_private (self); + + g_clear_pointer (&priv->hostname, g_free); + g_clear_pointer (&priv->address, g_free); + g_clear_object (&priv->authority); + if (priv->connection) + xcb_disconnect (priv->connection); + priv->connection = NULL; G_OBJECT_CLASS (x_server_parent_class)->finalize (object); } diff --git a/src/x-server.h b/src/x-server.h index 2d38cb2f..18b91634 100644 --- a/src/x-server.h +++ b/src/x-server.h @@ -24,12 +24,9 @@ G_BEGIN_DECLS #define X_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), X_SERVER_TYPE, XServerClass)) #define IS_X_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), X_SERVER_TYPE)) -typedef struct XServerPrivate XServerPrivate; - typedef struct { - DisplayServer parent_instance; - XServerPrivate *priv; + DisplayServer parent_instance; } XServer; typedef struct diff --git a/src/xdmcp-server.c b/src/xdmcp-server.c index f7c66c4c..5ebcacfa 100644 --- a/src/xdmcp-server.c +++ b/src/xdmcp-server.c @@ -18,7 +18,6 @@ #include "xdmcp-server.h" #include "xdmcp-protocol.h" -#include "xdmcp-session-private.h" #include "x-authority.h" enum { @@ -27,7 +26,7 @@ enum { }; static guint signals[LAST_SIGNAL] = { 0 }; -struct XDMCPServerPrivate +typedef struct { /* Port to listen on */ guint port; @@ -47,9 +46,9 @@ struct XDMCPServerPrivate /* XDM-AUTHENTICATION-1 key */ gchar *key; - /* Active XDMCP sessions */ + /* Known XDMCP sessions */ GHashTable *sessions; -}; +} XDMCPServerPrivate; G_DEFINE_TYPE_WITH_PRIVATE (XDMCPServer, xdmcp_server, G_TYPE_OBJECT) @@ -72,104 +71,133 @@ xdmcp_server_new (void) void xdmcp_server_set_port (XDMCPServer *server, guint port) { + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (server); g_return_if_fail (server != NULL); - server->priv->port = port; + priv->port = port; } guint xdmcp_server_get_port (XDMCPServer *server) { + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (server); g_return_val_if_fail (server != NULL, 0); - return server->priv->port; + return priv->port; } void xdmcp_server_set_listen_address (XDMCPServer *server, const gchar *listen_address) { + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (server); g_return_if_fail (server != NULL); - - g_free (server->priv->listen_address); - server->priv->listen_address = g_strdup (listen_address); + g_free (priv->listen_address); + priv->listen_address = g_strdup (listen_address); } const gchar * xdmcp_server_get_listen_address (XDMCPServer *server) { + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (server); g_return_val_if_fail (server != NULL, NULL); - return server->priv->listen_address; + return priv->listen_address; } void xdmcp_server_set_hostname (XDMCPServer *server, const gchar *hostname) { + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (server); g_return_if_fail (server != NULL); - - g_free (server->priv->hostname); - server->priv->hostname = g_strdup (hostname); + g_free (priv->hostname); + priv->hostname = g_strdup (hostname); } const gchar * xdmcp_server_get_hostname (XDMCPServer *server) { + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (server); g_return_val_if_fail (server != NULL, NULL); - return server->priv->hostname; + return priv->hostname; } void xdmcp_server_set_status (XDMCPServer *server, const gchar *status) { + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (server); g_return_if_fail (server != NULL); - - g_free (server->priv->status); - server->priv->status = g_strdup (status); + g_free (priv->status); + priv->status = g_strdup (status); } const gchar * xdmcp_server_get_status (XDMCPServer *server) { + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (server); g_return_val_if_fail (server != NULL, NULL); - return server->priv->status; + return priv->status; } void xdmcp_server_set_key (XDMCPServer *server, const gchar *key) { + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (server); g_return_if_fail (server != NULL); - g_free (server->priv->key); - server->priv->key = g_strdup (key); + g_free (priv->key); + priv->key = g_strdup (key); } +typedef struct +{ + XDMCPServer *server; + XDMCPSession *session; + guint timeout_source; +} SessionData; + +static void +session_data_free (SessionData *data) +{ + g_object_unref (data->session); + if (data->timeout_source != 0) + g_source_remove (data->timeout_source); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (SessionData, session_data_free) + static gboolean -session_timeout_cb (XDMCPSession *session) +session_timeout_cb (gpointer user_data) { - session->priv->inactive_timeout = 0; + g_autoptr(SessionData) data = user_data; + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (data->server); - g_debug ("Timing out unmanaged session %d", session->priv->id); - g_hash_table_remove (session->priv->server->priv->sessions, GINT_TO_POINTER ((gint) session->priv->id)); - return FALSE; + g_debug ("Timing out unmanaged session %d", xdmcp_session_get_id (data->session)); + g_hash_table_remove (priv->sessions, GINT_TO_POINTER ((gint) xdmcp_session_get_id (data->session))); + return G_SOURCE_REMOVE; } static XDMCPSession * -add_session (XDMCPServer *server) +add_session (XDMCPServer *server, GInetAddress *address, guint16 display_number, XAuthority *authority) { + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (server); + guint16 id; do { id = g_random_int () & 0xFFFFFFFF; - } while (g_hash_table_lookup (server->priv->sessions, GINT_TO_POINTER ((gint) id))); + } while (g_hash_table_lookup (priv->sessions, GINT_TO_POINTER ((gint) id))); - XDMCPSession *session = xdmcp_session_new (id); - session->priv->server = server; - g_hash_table_insert (server->priv->sessions, GINT_TO_POINTER ((gint) id), session); - session->priv->inactive_timeout = g_timeout_add (MANAGE_TIMEOUT, (GSourceFunc) session_timeout_cb, session); + SessionData *data = g_malloc0 (sizeof (SessionData)); + data->server = server; + data->session = xdmcp_session_new (id, address, display_number, authority); + data->timeout_source = g_timeout_add (MANAGE_TIMEOUT, session_timeout_cb, data); + g_hash_table_insert (priv->sessions, GINT_TO_POINTER ((gint) id), data); - return session; + return data->session; } -static XDMCPSession * -get_session (XDMCPServer *server, guint16 id) +static SessionData * +get_session_data (XDMCPServer *server, guint16 id) { - return g_hash_table_lookup (server->priv->sessions, GINT_TO_POINTER ((gint) id)); + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (server); + return g_hash_table_lookup (priv->sessions, GINT_TO_POINTER ((gint) id)); } static gchar * @@ -201,7 +229,8 @@ send_packet (GSocket *socket, GSocketAddress *address, XDMCPPacket *packet) static const gchar * get_authentication_name (XDMCPServer *server) { - if (server->priv->key) + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (server); + if (priv->key) return "XDM-AUTHENTICATION-1"; else return ""; @@ -210,14 +239,16 @@ get_authentication_name (XDMCPServer *server) static void handle_query (XDMCPServer *server, GSocket *socket, GSocketAddress *address, gchar **authentication_names) { + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (server); + /* If no authentication requested and we are configured for none then allow */ const gchar *authentication_name = NULL; - if (authentication_names[0] == NULL && server->priv->key == NULL) + if (authentication_names[0] == NULL && priv->key == NULL) authentication_name = ""; for (gchar **i = authentication_names; *i; i++) { - if (strcmp (*i, get_authentication_name (server)) == 0 && server->priv->key != NULL) + if (strcmp (*i, get_authentication_name (server)) == 0 && priv->key != NULL) { authentication_name = *i; break; @@ -229,14 +260,14 @@ handle_query (XDMCPServer *server, GSocket *socket, GSocketAddress *address, gch { response = xdmcp_packet_alloc (XDMCP_Willing); response->Willing.authentication_name = g_strdup (authentication_name); - response->Willing.hostname = g_strdup (server->priv->hostname); - response->Willing.status = g_strdup (server->priv->status); + response->Willing.hostname = g_strdup (priv->hostname); + response->Willing.status = g_strdup (priv->status); } else { response = xdmcp_packet_alloc (XDMCP_Unwilling); - response->Unwilling.hostname = g_strdup (server->priv->hostname); - if (server->priv->key) + response->Unwilling.hostname = g_strdup (priv->hostname); + if (priv->key) response->Unwilling.status = g_strdup_printf ("No matching authentication, server requires %s", get_authentication_name (server)); else response->Unwilling.status = g_strdup ("No matching authentication"); @@ -428,6 +459,8 @@ has_string (gchar **list, const gchar *text) static void handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, XDMCPPacket *packet) { + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (server); + /* Check authentication */ g_autofree gchar *authentication_name = NULL; g_autofree guint8 *authentication_data = NULL; @@ -436,7 +469,7 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X XdmAuthKeyRec rho; if (strcmp (packet->Request.authentication_name, "") == 0) { - if (!server->priv->key) + if (!priv->key) { if (!has_string (packet->Request.authorization_names, "MIT-MAGIC-COOKIE-1")) decline_status = g_strdup ("No matching authorization, server requires MIT-MAGIC-COOKIE-1"); @@ -444,7 +477,7 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X else decline_status = g_strdup ("No matching authentication, server requires XDM-AUTHENTICATION-1"); } - else if (strcmp (packet->Request.authentication_name, "XDM-AUTHENTICATION-1") == 0 && server->priv->key) + else if (strcmp (packet->Request.authentication_name, "XDM-AUTHENTICATION-1") == 0 && priv->key) { if (packet->Request.authentication_data.length == 8) { @@ -453,7 +486,7 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X memcpy (input, packet->Request.authentication_data.data, packet->Request.authentication_data.length); /* Setup key */ - decode_key (server->priv->key, key); + decode_key (priv->key, key); /* Decode message from server */ authentication_name = g_strdup ("XDM-AUTHENTICATION-1"); @@ -474,7 +507,7 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X { if (strcmp (packet->Request.authentication_name, "") == 0) decline_status = g_strdup_printf ("No matching authentication, server does not support unauthenticated connections"); - else if (server->priv->key) + else if (priv->key) decline_status = g_strdup ("No matching authentication, server requires XDM-AUTHENTICATION-1"); else decline_status = g_strdup ("No matching authentication, server only supports unauthenticated connections"); @@ -507,11 +540,11 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X gsize authorization_data_length = 0; g_autofree guint8 *session_authorization_data = NULL; gsize session_authorization_data_length = 0; - if (server->priv->key) + if (priv->key) { /* Setup key */ guint8 key[8]; - decode_key (server->priv->key, key); + decode_key (priv->key, key); /* Generate a private session key */ // FIXME: Pick a good DES key? @@ -544,35 +577,35 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X session_authorization_data_length = x_authority_get_authorization_data_length (auth); } - XDMCPSession *session = add_session (server); - session->priv->address = connection_to_address (connection); - session->priv->display_number = packet->Request.display_number; - g_autofree gchar *display_number = g_strdup_printf ("%d", packet->Request.display_number); - /* We need to check if this is the loopback address and set the authority * for a local connection if this is so as XCB treats "127.0.0.1" as local * always */ - if (g_inet_address_get_is_loopback (session->priv->address)) + g_autoptr(GInetAddress) session_address = connection_to_address (connection); + g_autofree gchar *display_number = g_strdup_printf ("%d", packet->Request.display_number); + g_autoptr(XAuthority) authority = NULL; + if (g_inet_address_get_is_loopback (session_address)) { gchar hostname[1024]; gethostname (hostname, 1024); - session->priv->authority = x_authority_new (XAUTH_FAMILY_LOCAL, - (guint8 *) hostname, - strlen (hostname), - display_number, - authorization_name, - session_authorization_data, - session_authorization_data_length); + authority = x_authority_new (XAUTH_FAMILY_LOCAL, + (guint8 *) hostname, + strlen (hostname), + display_number, + authorization_name, + session_authorization_data, + session_authorization_data_length); } else - session->priv->authority = x_authority_new (connection->type, - connection->address.data, - connection->address.length, - display_number, - authorization_name, - session_authorization_data, - session_authorization_data_length); + authority = x_authority_new (connection->type, + connection->address.data, + connection->address.length, + display_number, + authorization_name, + session_authorization_data, + session_authorization_data_length); + + XDMCPSession *session = add_session (server, session_address, packet->Request.display_number, authority); XDMCPPacket *response = xdmcp_packet_alloc (XDMCP_Accept); response->Accept.session_id = xdmcp_session_get_id (session); @@ -589,8 +622,8 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X static void handle_manage (XDMCPServer *server, GSocket *socket, GSocketAddress *address, XDMCPPacket *packet) { - XDMCPSession *session = get_session (server, packet->Manage.session_id); - if (!session) + SessionData *data = get_session_data (server, packet->Manage.session_id); + if (!data->session) { XDMCPPacket *response = xdmcp_packet_alloc (XDMCP_Refuse); response->Refuse.session_id = packet->Manage.session_id; @@ -600,37 +633,36 @@ handle_manage (XDMCPServer *server, GSocket *socket, GSocketAddress *address, XD } /* Ignore duplicate requests */ - if (session->priv->started) + if (data->timeout_source == 0) { - if (session->priv->display_number != packet->Manage.display_number || - strcmp (session->priv->display_class, packet->Manage.display_class) != 0) + if (xdmcp_session_get_display_number (data->session) != packet->Manage.display_number || + strcmp (xdmcp_session_get_display_class (data->session), packet->Manage.display_class) != 0) g_debug ("Ignoring duplicate Manage with different data"); return; } /* Reject if has changed display number */ - if (packet->Manage.display_number != session->priv->display_number) + if (packet->Manage.display_number != xdmcp_session_get_display_number (data->session)) { XDMCPPacket *response; - g_debug ("Received Manage for display number %d, but Request was %d", packet->Manage.display_number, session->priv->display_number); + g_debug ("Received Manage for display number %d, but Request was %d", packet->Manage.display_number, xdmcp_session_get_display_number (data->session)); response = xdmcp_packet_alloc (XDMCP_Refuse); response->Refuse.session_id = packet->Manage.session_id; send_packet (socket, address, response); xdmcp_packet_free (response); } - session->priv->display_class = g_strdup (packet->Manage.display_class); + xdmcp_session_set_display_class (data->session, packet->Manage.display_class); gboolean result = FALSE; - g_signal_emit (server, signals[NEW_SESSION], 0, session, &result); + g_signal_emit (server, signals[NEW_SESSION], 0, data->session, &result); if (result) { /* Cancel the inactive timer */ - if (session->priv->inactive_timeout) - g_source_remove (session->priv->inactive_timeout); - - session->priv->started = TRUE; + if (data->timeout_source != 0) + g_source_remove (data->timeout_source); + data->timeout_source = 0; } else { @@ -647,15 +679,12 @@ handle_manage (XDMCPServer *server, GSocket *socket, GSocketAddress *address, XD static void handle_keep_alive (XDMCPServer *server, GSocket *socket, GSocketAddress *address, XDMCPPacket *packet) { - XDMCPPacket *response; - XDMCPSession *session; + SessionData *data = get_session_data (server, packet->KeepAlive.session_id); gboolean alive = FALSE; - - session = get_session (server, packet->KeepAlive.session_id); - if (session) + if (data) alive = TRUE; // FIXME: xdmcp_session_get_alive (session); - response = xdmcp_packet_alloc (XDMCP_Alive); + XDMCPPacket *response = xdmcp_packet_alloc (XDMCP_Alive); response->Alive.session_running = alive; response->Alive.session_id = alive ? packet->KeepAlive.session_id : 0; send_packet (socket, address, response); @@ -752,33 +781,35 @@ open_udp_socket (GSocketFamily family, guint port, const gchar *listen_address, gboolean xdmcp_server_start (XDMCPServer *server) { + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (server); + g_return_val_if_fail (server != NULL, FALSE); g_autoptr(GError) ipv4_error = NULL; - server->priv->socket = open_udp_socket (G_SOCKET_FAMILY_IPV4, server->priv->port, server->priv->listen_address, &ipv4_error); + priv->socket = open_udp_socket (G_SOCKET_FAMILY_IPV4, priv->port, priv->listen_address, &ipv4_error); if (ipv4_error) g_warning ("Failed to create IPv4 XDMCP socket: %s", ipv4_error->message); - if (server->priv->socket) + if (priv->socket) { - GSource *source = g_socket_create_source (server->priv->socket, G_IO_IN, NULL); + GSource *source = g_socket_create_source (priv->socket, G_IO_IN, NULL); g_source_set_callback (source, (GSourceFunc) read_cb, server, NULL); g_source_attach (source, NULL); } g_autoptr(GError) ipv6_error = NULL; - server->priv->socket6 = open_udp_socket (G_SOCKET_FAMILY_IPV6, server->priv->port, server->priv->listen_address, &ipv6_error); + priv->socket6 = open_udp_socket (G_SOCKET_FAMILY_IPV6, priv->port, priv->listen_address, &ipv6_error); if (ipv6_error) g_warning ("Failed to create IPv6 XDMCP socket: %s", ipv6_error->message); - if (server->priv->socket6) + if (priv->socket6) { - GSource *source = g_socket_create_source (server->priv->socket6, G_IO_IN, NULL); + GSource *source = g_socket_create_source (priv->socket6, G_IO_IN, NULL); g_source_set_callback (source, (GSourceFunc) read_cb, server, NULL); g_source_attach (source, NULL); } - if (!server->priv->socket && !server->priv->socket6) + if (!priv->socket && !priv->socket6) return FALSE; return TRUE; @@ -787,26 +818,27 @@ xdmcp_server_start (XDMCPServer *server) static void xdmcp_server_init (XDMCPServer *server) { - server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, XDMCP_SERVER_TYPE, XDMCPServerPrivate); + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (server); - server->priv->port = XDM_UDP_PORT; - server->priv->hostname = g_strdup (""); - server->priv->status = g_strdup (""); - server->priv->sessions = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_object_unref); + priv->port = XDM_UDP_PORT; + priv->hostname = g_strdup (""); + priv->status = g_strdup (""); + priv->sessions = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) session_data_free); } static void xdmcp_server_finalize (GObject *object) { XDMCPServer *self = XDMCP_SERVER (object); - - g_clear_object (&self->priv->socket); - g_clear_object (&self->priv->socket6); - g_clear_pointer (&self->priv->listen_address, g_free); - g_clear_pointer (&self->priv->hostname, g_free); - g_clear_pointer (&self->priv->status, g_free); - g_clear_pointer (&self->priv->key, g_free); - g_clear_pointer (&self->priv->sessions, g_hash_table_unref); + XDMCPServerPrivate *priv = xdmcp_server_get_instance_private (self); + + g_clear_object (&priv->socket); + g_clear_object (&priv->socket6); + g_clear_pointer (&priv->listen_address, g_free); + g_clear_pointer (&priv->hostname, g_free); + g_clear_pointer (&priv->status, g_free); + g_clear_pointer (&priv->key, g_free); + g_clear_pointer (&priv->sessions, g_hash_table_unref); G_OBJECT_CLASS (xdmcp_server_parent_class)->finalize (object); } diff --git a/src/xdmcp-server.h b/src/xdmcp-server.h index d3b824b9..1bc554a1 100644 --- a/src/xdmcp-server.h +++ b/src/xdmcp-server.h @@ -23,12 +23,9 @@ G_BEGIN_DECLS #define XDMCP_SERVER_SIGNAL_NEW_SESSION "new-session" -typedef struct XDMCPServerPrivate XDMCPServerPrivate; - typedef struct { - GObject parent_instance; - XDMCPServerPrivate *priv; + GObject parent_instance; } XDMCPServer; typedef struct diff --git a/src/xdmcp-session-private.h b/src/xdmcp-session-private.h deleted file mode 100644 index a40568a1..00000000 --- a/src/xdmcp-session-private.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2010-2011 Robert Ancell. - * Author: Robert Ancell - * - * 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 3 of the License, or (at your option) any later - * version. See http://www.gnu.org/copyleft/gpl.html the full text of the - * license. - */ - -#ifndef XDMCP_SESSION_PRIVATE_H_ -#define XDMCP_SESSION_PRIVATE_H_ - -#include "xdmcp-server.h" -#include "x-authority.h" - -struct XDMCPSessionPrivate -{ - XDMCPServer *server; - - guint16 id; - - gchar *manufacturer_display_id; - - GInetAddress *address; - - guint inactive_timeout; - - XAuthority *authority; - - gboolean started; - - guint16 display_number; - - gchar *display_class; -}; - -#endif /* XDMCP_SESSION_PRIVATE_H_ */ diff --git a/src/xdmcp-session.c b/src/xdmcp-session.c index 10724119..54b90d99 100644 --- a/src/xdmcp-session.c +++ b/src/xdmcp-session.c @@ -10,16 +10,35 @@ */ #include "xdmcp-session.h" -#include "xdmcp-session-private.h" +#include "x-authority.h" + +typedef struct +{ + guint16 id; + + GInetAddress *address; + + guint inactive_timeout; + + XAuthority *authority; + + guint16 display_number; + + gchar *display_class; +} XDMCPSessionPrivate; G_DEFINE_TYPE_WITH_PRIVATE (XDMCPSession, xdmcp_session, G_TYPE_OBJECT) XDMCPSession * -xdmcp_session_new (guint16 id) +xdmcp_session_new (guint16 id, GInetAddress *address, guint16 display_number, XAuthority *authority) { XDMCPSession *self = g_object_new (XDMCP_SESSION_TYPE, NULL); + XDMCPSessionPrivate *priv = xdmcp_session_get_instance_private (self); - self->priv->id = id; + priv->id = id; + priv->address = g_object_ref (address); + priv->display_number = display_number; + priv->authority = g_object_ref (authority); return self; } @@ -27,62 +46,69 @@ xdmcp_session_new (guint16 id) guint16 xdmcp_session_get_id (XDMCPSession *session) { + XDMCPSessionPrivate *priv = xdmcp_session_get_instance_private (session); g_return_val_if_fail (session != NULL, 0); - return session->priv->id; + return priv->id; } -const gchar * -xdmcp_session_get_manufacturer_display_id (XDMCPSession *session) +GInetAddress * +xdmcp_session_get_address (XDMCPSession *session) { + XDMCPSessionPrivate *priv = xdmcp_session_get_instance_private (session); g_return_val_if_fail (session != NULL, NULL); - return session->priv->manufacturer_display_id; + return priv->address; } -GInetAddress * -xdmcp_session_get_address (XDMCPSession *session) +guint16 +xdmcp_session_get_display_number (XDMCPSession *session) { - g_return_val_if_fail (session != NULL, NULL); - return session->priv->address; + XDMCPSessionPrivate *priv = xdmcp_session_get_instance_private (session); + g_return_val_if_fail (session != NULL, 0); + return priv->display_number; } XAuthority * xdmcp_session_get_authority (XDMCPSession *session) { + XDMCPSessionPrivate *priv = xdmcp_session_get_instance_private (session); g_return_val_if_fail (session != NULL, NULL); - return session->priv->authority; + return priv->authority; } -guint16 -xdmcp_session_get_display_number (XDMCPSession *session) +void +xdmcp_session_set_display_class (XDMCPSession *session, const gchar *display_class) { - g_return_val_if_fail (session != NULL, 0); - return session->priv->display_number; + XDMCPSessionPrivate *priv = xdmcp_session_get_instance_private (session); + g_return_if_fail (session != NULL); + g_free (priv->display_class); + priv->display_class = g_strdup (display_class); } const gchar * xdmcp_session_get_display_class (XDMCPSession *session) { + XDMCPSessionPrivate *priv = xdmcp_session_get_instance_private (session); g_return_val_if_fail (session != NULL, NULL); - return session->priv->display_class; + return priv->display_class; } static void xdmcp_session_init (XDMCPSession *session) { - session->priv = G_TYPE_INSTANCE_GET_PRIVATE (session, XDMCP_SESSION_TYPE, XDMCPSessionPrivate); - session->priv->manufacturer_display_id = g_strdup (""); - session->priv->display_class = g_strdup (""); + XDMCPSessionPrivate *priv = xdmcp_session_get_instance_private (session); + + priv->display_class = g_strdup (""); } static void xdmcp_session_finalize (GObject *object) { XDMCPSession *self = XDMCP_SESSION (object); + XDMCPSessionPrivate *priv = xdmcp_session_get_instance_private (self); - g_clear_pointer (&self->priv->manufacturer_display_id, g_free); - g_clear_object (&self->priv->address); - g_clear_object (&self->priv->authority); - g_clear_pointer (&self->priv->display_class, g_free); + g_clear_object (&priv->address); + g_clear_object (&priv->authority); + g_clear_pointer (&priv->display_class, g_free); G_OBJECT_CLASS (xdmcp_session_parent_class)->finalize (object); } diff --git a/src/xdmcp-session.h b/src/xdmcp-session.h index 63b3f367..c9edb2c0 100644 --- a/src/xdmcp-session.h +++ b/src/xdmcp-session.h @@ -22,12 +22,9 @@ G_BEGIN_DECLS #define XDMCP_SESSION_TYPE (xdmcp_session_get_type()) #define XDMCP_SESSION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XDMCP_SESSION_TYPE, XDMCPSession)); -typedef struct XDMCPSessionPrivate XDMCPSessionPrivate; - typedef struct { - GObject parent_instance; - XDMCPSessionPrivate *priv; + GObject parent_instance; } XDMCPSession; typedef struct @@ -37,17 +34,17 @@ typedef struct GType xdmcp_session_get_type (void); -XDMCPSession *xdmcp_session_new (guint16 id); +XDMCPSession *xdmcp_session_new (guint16 id, GInetAddress *address, guint16 display_number, XAuthority *authority); guint16 xdmcp_session_get_id (XDMCPSession *session); -const gchar *xdmcp_session_get_manufacturer_display_id (XDMCPSession *session); - GInetAddress *xdmcp_session_get_address (XDMCPSession *session); +guint16 xdmcp_session_get_display_number (XDMCPSession *session); + XAuthority *xdmcp_session_get_authority (XDMCPSession *session); -guint16 xdmcp_session_get_display_number (XDMCPSession *session); +void xdmcp_session_set_display_class (XDMCPSession *session, const gchar *display_class); const gchar *xdmcp_session_get_display_class (XDMCPSession *session); diff --git a/tests/src/x-authority.c b/tests/src/x-authority.c index 8c0aa508..e63a051f 100644 --- a/tests/src/x-authority.c +++ b/tests/src/x-authority.c @@ -3,12 +3,12 @@ #include "x-authority.h" #include "x-common.h" -struct XAuthorityPrivate +typedef struct { GList *records; -}; +} XAuthorityPrivate; -struct XAuthorityRecordPrivate +typedef struct { guint16 family; guint16 address_length; @@ -17,7 +17,7 @@ struct XAuthorityRecordPrivate gchar *authorization_name; guint16 authorization_data_length; guint8 *authorization_data; -}; +} XAuthorityRecordPrivate; G_DEFINE_TYPE_WITH_PRIVATE (XAuthority, x_authority, G_TYPE_OBJECT) G_DEFINE_TYPE_WITH_PRIVATE (XAuthorityRecord, x_authority_record, G_TYPE_OBJECT) @@ -31,6 +31,8 @@ x_authority_new (void) gboolean x_authority_load (XAuthority *authority, const gchar *filename, GError **error) { + XAuthorityPrivate *priv = x_authority_get_instance_private (authority); + guint8 *xauth_data; gsize xauth_length; if (!g_file_get_contents (filename, (gchar **) &xauth_data, &xauth_length, error)) @@ -40,17 +42,19 @@ x_authority_load (XAuthority *authority, const gchar *filename, GError **error) while (offset < xauth_length) { XAuthorityRecord *record = g_object_new (x_authority_record_get_type (), NULL); - record->priv->family = read_card16 (xauth_data, xauth_length, X_BYTE_ORDER_MSB, &offset); - record->priv->address_length = read_card16 (xauth_data, xauth_length, X_BYTE_ORDER_MSB, &offset); - record->priv->address = read_string8 (xauth_data, xauth_length, record->priv->address_length, &offset); + XAuthorityRecordPrivate *r_priv = x_authority_record_get_instance_private (record); + + r_priv->family = read_card16 (xauth_data, xauth_length, X_BYTE_ORDER_MSB, &offset); + r_priv->address_length = read_card16 (xauth_data, xauth_length, X_BYTE_ORDER_MSB, &offset); + r_priv->address = read_string8 (xauth_data, xauth_length, r_priv->address_length, &offset); guint16 length = read_card16 (xauth_data, xauth_length, X_BYTE_ORDER_MSB, &offset); - record->priv->number = (gchar *) read_string8 (xauth_data, xauth_length, length, &offset); + r_priv->number = (gchar *) read_string8 (xauth_data, xauth_length, length, &offset); length = read_card16 (xauth_data, xauth_length, X_BYTE_ORDER_MSB, &offset); - record->priv->authorization_name = (gchar *) read_string8 (xauth_data, xauth_length, length, &offset); - record->priv->authorization_data_length = read_card16 (xauth_data, xauth_length, X_BYTE_ORDER_MSB, &offset); - record->priv->authorization_data = read_string8 (xauth_data, xauth_length, record->priv->authorization_data_length, &offset); + r_priv->authorization_name = (gchar *) read_string8 (xauth_data, xauth_length, length, &offset); + r_priv->authorization_data_length = read_card16 (xauth_data, xauth_length, X_BYTE_ORDER_MSB, &offset); + r_priv->authorization_data = read_string8 (xauth_data, xauth_length, r_priv->authorization_data_length, &offset); - authority->priv->records = g_list_append (authority->priv->records, record); + priv->records = g_list_append (priv->records, record); } return TRUE; @@ -59,14 +63,17 @@ x_authority_load (XAuthority *authority, const gchar *filename, GError **error) XAuthorityRecord * x_authority_match_local (XAuthority *authority, const gchar *authorization_name) { - for (GList *link = authority->priv->records; link; link = link->next) + XAuthorityPrivate *priv = x_authority_get_instance_private (authority); + + for (GList *link = priv->records; link; link = link->next) { XAuthorityRecord *record = link->data; + XAuthorityRecordPrivate *r_priv = x_authority_record_get_instance_private (record); - if (strcmp (record->priv->authorization_name, authorization_name) != 0) + if (strcmp (r_priv->authorization_name, authorization_name) != 0) continue; - if (record->priv->family == XAUTH_FAMILY_WILD || record->priv->family == XAUTH_FAMILY_LOCAL) + if (r_priv->family == XAUTH_FAMILY_WILD || r_priv->family == XAUTH_FAMILY_LOCAL) return record; } @@ -76,14 +83,17 @@ x_authority_match_local (XAuthority *authority, const gchar *authorization_name) XAuthorityRecord * x_authority_match_localhost (XAuthority *authority, const gchar *authorization_name) { - for (GList *link = authority->priv->records; link; link = link->next) + XAuthorityPrivate *priv = x_authority_get_instance_private (authority); + + for (GList *link = priv->records; link; link = link->next) { XAuthorityRecord *record = link->data; + XAuthorityRecordPrivate *r_priv = x_authority_record_get_instance_private (record); - if (strcmp (record->priv->authorization_name, authorization_name) != 0) + if (strcmp (r_priv->authorization_name, authorization_name) != 0) continue; - if (record->priv->family == XAUTH_FAMILY_WILD || record->priv->family == XAUTH_FAMILY_LOCALHOST) + if (r_priv->family == XAUTH_FAMILY_WILD || r_priv->family == XAUTH_FAMILY_LOCALHOST) return record; } @@ -93,6 +103,8 @@ x_authority_match_localhost (XAuthority *authority, const gchar *authorization_n XAuthorityRecord * x_authority_match_inet (XAuthority *authority, GInetAddress *address, const gchar *authorization_name) { + XAuthorityPrivate *priv = x_authority_get_instance_private (authority); + guint16 family; switch (g_inet_address_get_family (address)) { @@ -108,26 +120,27 @@ x_authority_match_inet (XAuthority *authority, GInetAddress *address, const gcha gssize address_data_length = g_inet_address_get_native_size (address); const guint8 *address_data = g_inet_address_to_bytes (address); - for (GList *link = authority->priv->records; link; link = link->next) + for (GList *link = priv->records; link; link = link->next) { XAuthorityRecord *record = link->data; + XAuthorityRecordPrivate *r_priv = x_authority_record_get_instance_private (record); - if (strcmp (record->priv->authorization_name, authorization_name) != 0) + if (strcmp (r_priv->authorization_name, authorization_name) != 0) continue; - if (record->priv->family == XAUTH_FAMILY_WILD) + if (r_priv->family == XAUTH_FAMILY_WILD) return record; - if (record->priv->family != family) + if (r_priv->family != family) continue; - if (record->priv->address_length != address_data_length) + if (r_priv->address_length != address_data_length) continue; gboolean matches = TRUE; for (int i = 0; i < address_data_length; i++) { - if (address_data[i] != record->priv->address[i]) + if (address_data[i] != r_priv->address[i]) { matches = FALSE; break; @@ -143,14 +156,15 @@ x_authority_match_inet (XAuthority *authority, GInetAddress *address, const gcha static void x_authority_init (XAuthority *authority) { - authority->priv = G_TYPE_INSTANCE_GET_PRIVATE (authority, x_authority_get_type (), XAuthorityPrivate); } static void x_authority_finalize (GObject *object) { XAuthority *authority = (XAuthority *) object; - g_list_free_full (authority->priv->records, g_object_unref); + XAuthorityPrivate *priv = x_authority_get_instance_private (authority); + + g_list_free_full (priv->records, g_object_unref); } static void @@ -163,26 +177,30 @@ x_authority_class_init (XAuthorityClass *klass) guint16 x_authority_record_get_authorization_data_length (XAuthorityRecord *record) { - return record->priv->authorization_data_length; + XAuthorityRecordPrivate *priv = x_authority_record_get_instance_private (record); + return priv->authorization_data_length; } const guint8 * x_authority_record_get_authorization_data (XAuthorityRecord *record) { - return record->priv->authorization_data; + XAuthorityRecordPrivate *priv = x_authority_record_get_instance_private (record); + return priv->authorization_data; } gboolean x_authority_record_check_cookie (XAuthorityRecord *record, const guint8 *cookie_data, guint16 cookie_data_length) { - if (strcmp (record->priv->authorization_name, "MIT-MAGIC-COOKIE-1") != 0) + XAuthorityRecordPrivate *priv = x_authority_record_get_instance_private (record); + + if (strcmp (priv->authorization_name, "MIT-MAGIC-COOKIE-1") != 0) return FALSE; - if (cookie_data_length != record->priv->authorization_data_length) + if (cookie_data_length != priv->authorization_data_length) return FALSE; for (guint16 i = 0; i < cookie_data_length; i++) - if (cookie_data[i] != record->priv->authorization_data[i]) + if (cookie_data[i] != priv->authorization_data[i]) return FALSE; return TRUE; @@ -191,17 +209,18 @@ x_authority_record_check_cookie (XAuthorityRecord *record, const guint8 *cookie_ static void x_authority_record_init (XAuthorityRecord *record) { - record->priv = G_TYPE_INSTANCE_GET_PRIVATE (record, x_authority_record_get_type (), XAuthorityRecordPrivate); } static void x_authority_record_finalize (GObject *object) { XAuthorityRecord *record = (XAuthorityRecord *) object; - g_free (record->priv->address); - g_free (record->priv->number); - g_free (record->priv->authorization_name); - g_free (record->priv->authorization_data); + XAuthorityRecordPrivate *priv = x_authority_record_get_instance_private (record); + + g_free (priv->address); + g_free (priv->number); + g_free (priv->authorization_name); + g_free (priv->authorization_data); } static void diff --git a/tests/src/x-authority.h b/tests/src/x-authority.h index 9f329f31..f3a57e83 100644 --- a/tests/src/x-authority.h +++ b/tests/src/x-authority.h @@ -20,12 +20,9 @@ enum XAUTH_FAMILY_WILD = 65535 }; -typedef struct XAuthorityPrivate XAuthorityPrivate; - typedef struct { GObjectClass parent_instance; - XAuthorityPrivate *priv; } XAuthority; typedef struct @@ -33,12 +30,9 @@ typedef struct GObjectClass parent_class; } XAuthorityClass; -typedef struct XAuthorityRecordPrivate XAuthorityRecordPrivate; - typedef struct { GObjectClass parent_instance; - XAuthorityRecordPrivate *priv; } XAuthorityRecord; typedef struct diff --git a/tests/src/x-server.c b/tests/src/x-server.c index e603fc03..cdfcbd32 100644 --- a/tests/src/x-server.c +++ b/tests/src/x-server.c @@ -22,7 +22,7 @@ enum { }; static guint x_server_signals[X_SERVER_LAST_SIGNAL] = { 0 }; -struct XServerPrivate +typedef struct { gint display_number; @@ -30,16 +30,16 @@ struct XServerPrivate GSocket *socket; GIOChannel *channel; GHashTable *clients; -}; +} XServerPrivate; G_DEFINE_TYPE_WITH_PRIVATE (XServer, x_server, G_TYPE_OBJECT) -struct XClientPrivate +typedef struct { XServer *server; GSocket *socket; GIOChannel *channel; -}; +} XClientPrivate; G_DEFINE_TYPE_WITH_PRIVATE (XClient, x_client, G_TYPE_OBJECT) @@ -53,31 +53,33 @@ static guint x_client_signals[X_CLIENT_LAST_SIGNAL] = { 0 }; void x_client_send_failed (XClient *client, const gchar *reason) { + XClientPrivate *priv = x_client_get_instance_private (client); g_autofree gchar *message = g_strdup_printf ("FAILED:%s", reason); errno = 0; - if (send (g_io_channel_unix_get_fd (client->priv->channel), message, strlen (message), 0) != strlen (message)) + if (send (g_io_channel_unix_get_fd (priv->channel), message, strlen (message), 0) != strlen (message)) g_printerr ("Failed to send FAILED: %s\n", strerror (errno)); } void x_client_send_success (XClient *client) { + XClientPrivate *priv = x_client_get_instance_private (client); g_autofree gchar *message = g_strdup ("SUCCESS"); errno = 0; - if (send (g_io_channel_unix_get_fd (client->priv->channel), message, strlen (message), 0) != strlen (message)) + if (send (g_io_channel_unix_get_fd (priv->channel), message, strlen (message), 0) != strlen (message)) g_printerr ("Failed to send SUCCESS: %s\n", strerror (errno)); } void x_client_disconnect (XClient *client) { - g_io_channel_shutdown (client->priv->channel, TRUE, NULL); + XClientPrivate *priv = x_client_get_instance_private (client); + g_io_channel_shutdown (priv->channel, TRUE, NULL); } static void x_client_init (XClient *client) { - client->priv = G_TYPE_INSTANCE_GET_PRIVATE (client, x_client_get_type (), XClientPrivate); } static void @@ -97,7 +99,8 @@ XServer * x_server_new (gint display_number) { XServer *server = g_object_new (x_server_get_type (), NULL); - server->priv->display_number = display_number; + XServerPrivate *priv = x_server_get_instance_private (server); + priv->display_number = display_number; return server; } @@ -105,19 +108,21 @@ static gboolean client_read_cb (GIOChannel *channel, GIOCondition condition, gpointer data) { XClient *client = data; + XClientPrivate *priv = x_client_get_instance_private (client); g_autofree gchar *d = NULL; gsize d_length; if (g_io_channel_read_to_end (channel, &d, &d_length, NULL) == G_IO_STATUS_NORMAL && d_length == 0) { - XServer *server = client->priv->server; + XServer *server = priv->server; + XServerPrivate *s_priv = x_server_get_instance_private (server); g_signal_emit (client, x_client_signals[X_CLIENT_DISCONNECTED], 0); g_signal_emit (server, x_server_signals[X_SERVER_CLIENT_DISCONNECTED], 0, client); - g_hash_table_remove (server->priv->clients, client->priv->channel); + g_hash_table_remove (s_priv->clients, priv->channel); - if (g_hash_table_size (server->priv->clients) == 0) + if (g_hash_table_size (s_priv->clients) == 0) g_signal_emit (server, x_server_signals[X_SERVER_RESET], 0); return G_SOURCE_REMOVE; @@ -130,20 +135,22 @@ static gboolean socket_connect_cb (GIOChannel *channel, GIOCondition condition, gpointer data) { XServer *server = data; + XServerPrivate *priv = x_server_get_instance_private (server); g_autoptr(GError) error = NULL; - g_autoptr(GSocket) data_socket = g_socket_accept (server->priv->socket, NULL, &error); + g_autoptr(GSocket) data_socket = g_socket_accept (priv->socket, NULL, &error); if (error) g_warning ("Error accepting connection: %s", strerror (errno)); if (!data_socket) return FALSE; XClient *client = g_object_new (x_client_get_type (), NULL); - client->priv->server = server; - client->priv->socket = g_steal_pointer (&data_socket); - client->priv->channel = g_io_channel_unix_new (g_socket_get_fd (client->priv->socket)); - g_io_add_watch (client->priv->channel, G_IO_IN | G_IO_HUP, client_read_cb, client); - g_hash_table_insert (server->priv->clients, client->priv->channel, client); + XClientPrivate *c_priv = x_client_get_instance_private (client); + c_priv->server = server; + c_priv->socket = g_steal_pointer (&data_socket); + c_priv->channel = g_io_channel_unix_new (g_socket_get_fd (c_priv->socket)); + g_io_add_watch (c_priv->channel, G_IO_IN | G_IO_HUP, client_read_cb, client); + g_hash_table_insert (priv->clients, c_priv->channel, client); g_signal_emit (server, x_server_signals[X_SERVER_CLIENT_CONNECTED], 0, client); @@ -153,20 +160,22 @@ socket_connect_cb (GIOChannel *channel, GIOCondition condition, gpointer data) gboolean x_server_start (XServer *server) { - g_autofree gchar *name = g_strdup_printf (".x:%d", server->priv->display_number); - server->priv->socket_path = g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), name, NULL); + XServerPrivate *priv = x_server_get_instance_private (server); + + g_autofree gchar *name = g_strdup_printf (".x:%d", priv->display_number); + priv->socket_path = g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), name, NULL); g_autoptr(GError) error = NULL; - server->priv->socket = g_socket_new (G_SOCKET_FAMILY_UNIX, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_DEFAULT, &error); - if (!server->priv->socket || - !g_socket_bind (server->priv->socket, g_unix_socket_address_new (server->priv->socket_path), TRUE, &error) || - !g_socket_listen (server->priv->socket, &error)) + priv->socket = g_socket_new (G_SOCKET_FAMILY_UNIX, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_DEFAULT, &error); + if (!priv->socket || + !g_socket_bind (priv->socket, g_unix_socket_address_new (priv->socket_path), TRUE, &error) || + !g_socket_listen (priv->socket, &error)) { g_warning ("Error creating Unix X socket: %s", error->message); return FALSE; } - server->priv->channel = g_io_channel_unix_new (g_socket_get_fd (server->priv->socket)); - g_io_add_watch (server->priv->channel, G_IO_IN, socket_connect_cb, server); + priv->channel = g_io_channel_unix_new (g_socket_get_fd (priv->socket)); + g_io_add_watch (priv->channel, G_IO_IN, socket_connect_cb, server); return TRUE; } @@ -174,22 +183,25 @@ x_server_start (XServer *server) gsize x_server_get_n_clients (XServer *server) { - return g_hash_table_size (server->priv->clients); + XServerPrivate *priv = x_server_get_instance_private (server); + return g_hash_table_size (priv->clients); } static void x_server_init (XServer *server) { - server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, x_server_get_type (), XServerPrivate); - server->priv->clients = g_hash_table_new_full (g_direct_hash, g_direct_equal, (GDestroyNotify) g_io_channel_unref, g_object_unref); + XServerPrivate *priv = x_server_get_instance_private (server); + priv->clients = g_hash_table_new_full (g_direct_hash, g_direct_equal, (GDestroyNotify) g_io_channel_unref, g_object_unref); } static void x_server_finalize (GObject *object) { - XServer *server = (XServer *) object; - if (server->priv->socket_path) - unlink (server->priv->socket_path); + XServer *server = X_SERVER (object); + XServerPrivate *priv = x_server_get_instance_private (server); + + if (priv->socket_path) + unlink (priv->socket_path); G_OBJECT_CLASS (x_server_parent_class)->finalize (object); } diff --git a/tests/src/x-server.h b/tests/src/x-server.h index 32f00da9..46fcc35a 100644 --- a/tests/src/x-server.h +++ b/tests/src/x-server.h @@ -6,18 +6,18 @@ G_BEGIN_DECLS +#define X_SERVER_TYPE (x_server_get_type()) +#define X_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), X_SERVER_TYPE, XServer)) + #define X_CLIENT_SIGNAL_DISCONNECTED "disconnected" #define X_SERVER_SIGNAL_CLIENT_CONNECTED "client-connected" #define X_SERVER_SIGNAL_CLIENT_DISCONNECTED "client-disconnected" #define X_SERVER_SIGNAL_RESET "reset" -typedef struct XClientPrivate XClientPrivate; - typedef struct { - GObject parent_instance; - XClientPrivate *priv; + GObject parent_instance; } XClient; typedef struct @@ -26,12 +26,9 @@ typedef struct void (*disconnected)(XClient *client); } XClientClass; -typedef struct XServerPrivate XServerPrivate; - typedef struct { - GObject parent_instance; - XServerPrivate *priv; + GObject parent_instance; } XServer; typedef struct diff --git a/tests/src/xdmcp-client.c b/tests/src/xdmcp-client.c index de40702b..49040e05 100644 --- a/tests/src/xdmcp-client.c +++ b/tests/src/xdmcp-client.c @@ -29,7 +29,7 @@ typedef enum XDMCP_Alive = 14 } XDMCPOpcode; -struct XDMCPClientPrivate +typedef struct { gchar *host; gint port; @@ -38,7 +38,7 @@ struct XDMCPClientPrivate gchar *authorization_name; gint authorization_data_length; guint8 *authorization_data; -}; +} XDMCPClientPrivate; G_DEFINE_TYPE_WITH_PRIVATE (XDMCPClient, xdmcp_client, G_TYPE_OBJECT) @@ -56,8 +56,10 @@ static guint xdmcp_client_signals[XDMCP_CLIENT_LAST_SIGNAL] = { 0 }; static void xdmcp_write (XDMCPClient *client, const guint8 *buffer, gssize buffer_length) { + XDMCPClientPrivate *priv = xdmcp_client_get_instance_private (client); + g_autoptr(GError) error = NULL; - gssize n_written = g_socket_send (client->priv->socket, (const gchar *) buffer, buffer_length, NULL, &error); + gssize n_written = g_socket_send (priv->socket, (const gchar *) buffer, buffer_length, NULL, &error); if (n_written < 0) g_warning ("Failed to send XDMCP request: %s", error->message); else if (n_written != buffer_length) @@ -256,30 +258,34 @@ xdmcp_client_new (void) void xdmcp_client_set_hostname (XDMCPClient *client, const gchar *hostname) { - g_free (client->priv->host); - client->priv->host = g_strdup (hostname); + XDMCPClientPrivate *priv = xdmcp_client_get_instance_private (client); + g_free (priv->host); + priv->host = g_strdup (hostname); } void xdmcp_client_set_port (XDMCPClient *client, guint16 port) { - client->priv->port = port; + XDMCPClientPrivate *priv = xdmcp_client_get_instance_private (client); + priv->port = port; } gboolean xdmcp_client_start (XDMCPClient *client) { - if (client->priv->socket) + XDMCPClientPrivate *priv = xdmcp_client_get_instance_private (client); + + if (priv->socket) return TRUE; g_autoptr(GError) error = NULL; - client->priv->socket = g_socket_new (G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, &error); + priv->socket = g_socket_new (G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, &error); if (error) g_warning ("Error creating XDMCP socket: %s", error->message); - if (!client->priv->socket) + if (!priv->socket) return FALSE; - GSocketConnectable *address = g_network_address_new (client->priv->host, client->priv->port); + GSocketConnectable *address = g_network_address_new (priv->host, priv->port); GSocketAddressEnumerator *enumerator = g_socket_connectable_enumerate (address); while (TRUE) { @@ -290,13 +296,13 @@ xdmcp_client_start (XDMCPClient *client) if (!socket_address) return FALSE; - if (!g_socket_connect (client->priv->socket, socket_address, NULL, &e)) + if (!g_socket_connect (priv->socket, socket_address, NULL, &e)) { g_warning ("Unable to connect XDMCP socket: %s", error->message); continue; } - g_io_add_watch (g_io_channel_unix_new (g_socket_get_fd (client->priv->socket)), G_IO_IN, xdmcp_data_cb, client); + g_io_add_watch (g_io_channel_unix_new (g_socket_get_fd (priv->socket)), G_IO_IN, xdmcp_data_cb, client); return TRUE; } @@ -305,18 +311,20 @@ xdmcp_client_start (XDMCPClient *client) GInetAddress * xdmcp_client_get_local_address (XDMCPClient *client) { - if (!client->priv->socket) + XDMCPClientPrivate *priv = xdmcp_client_get_instance_private (client); + + if (!priv->socket) return NULL; - GSocketAddress *socket_address = g_socket_get_local_address (client->priv->socket, NULL); + GSocketAddress *socket_address = g_socket_get_local_address (priv->socket, NULL); return g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (socket_address)); } static void xdmcp_client_init (XDMCPClient *client) { - client->priv = G_TYPE_INSTANCE_GET_PRIVATE (client, xdmcp_client_get_type (), XDMCPClientPrivate); - client->priv->port = XDMCP_PORT; + XDMCPClientPrivate *priv = xdmcp_client_get_instance_private (client); + priv->port = XDMCP_PORT; } static void @@ -458,11 +466,13 @@ xdmcp_client_send_keep_alive (XDMCPClient *client, guint16 display_number, guint static void xdmcp_client_finalize (GObject *object) { - XDMCPClient *client = (XDMCPClient *) object; - g_clear_pointer (&client->priv->host, g_free); - g_clear_object (&client->priv->socket); - g_clear_pointer (&client->priv->authorization_name, g_free); - g_clear_pointer (&client->priv->authorization_data, g_free); + XDMCPClient *self = XDMCP_CLIENT (object); + XDMCPClientPrivate *priv = xdmcp_client_get_instance_private (self); + + g_clear_pointer (&priv->host, g_free); + g_clear_object (&priv->socket); + g_clear_pointer (&priv->authorization_name, g_free); + g_clear_pointer (&priv->authorization_data, g_free); } static void diff --git a/tests/src/xdmcp-client.h b/tests/src/xdmcp-client.h index 89e97b7b..44f1f387 100644 --- a/tests/src/xdmcp-client.h +++ b/tests/src/xdmcp-client.h @@ -4,6 +4,11 @@ #include #include +G_BEGIN_DECLS + +#define XDMCP_CLIENT_TYPE (xdmcp_client_get_type()) +#define XDMCP_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XDMCP_CLIENT_TYPE, XDMCPClient)) + #define XDMCP_VERSION 1 #define XDMCP_PORT 177 @@ -58,12 +63,9 @@ typedef struct guint32 session_id; } XDMCPAlive; -typedef struct XDMCPClientPrivate XDMCPClientPrivate; - typedef struct { - GObject parent_instance; - XDMCPClientPrivate *priv; + GObject parent_instance; } XDMCPClient; typedef struct -- cgit v1.2.1