diff options
41 files changed, 1219 insertions, 2003 deletions
diff --git a/src/accounts.c b/src/accounts.c index 91f05cab..968bd235 100644 --- a/src/accounts.c +++ b/src/accounts.c @@ -27,18 +27,14 @@ G_DEFINE_TYPE (User, user, G_TYPE_OBJECT) User * accounts_get_user_by_name (const gchar *username) { - User *user = NULL; - CommonUser *common_user; - g_return_val_if_fail (username != NULL, NULL); - common_user = common_user_list_get_user_by_name (common_user_list_get_instance (), username); - if (common_user != NULL) - { - user = g_object_new (USER_TYPE, NULL); - user->priv->common_user = common_user; - } + CommonUser *common_user = common_user_list_get_user_by_name (common_user_list_get_instance (), username); + if (common_user == NULL) + return NULL; + User *user = g_object_new (USER_TYPE, NULL); + user->priv->common_user = common_user; return user; } diff --git a/src/console-kit.c b/src/console-kit.c index 093bf118..bd01de7d 100644 --- a/src/console-kit.c +++ b/src/console-kit.c @@ -17,35 +17,32 @@ gchar * ck_open_session (GVariantBuilder *parameters) { - g_autoptr(GDBusConnection) bus = NULL; - g_autoptr(GVariant) result = NULL; - g_autofree gchar *cookie = NULL; - g_autoptr(GError) error = NULL; - g_return_val_if_fail (parameters != NULL, NULL); - bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); + g_autoptr(GError) error = NULL; + g_autoptr(GDBusConnection) bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (error) g_warning ("Failed to get system bus: %s", error->message); if (!bus) return NULL; - result = g_dbus_connection_call_sync (bus, - "org.freedesktop.ConsoleKit", - "/org/freedesktop/ConsoleKit/Manager", - "org.freedesktop.ConsoleKit.Manager", - "OpenSessionWithParameters", - g_variant_new ("(a(sv))", parameters), - G_VARIANT_TYPE ("(s)"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); + g_autoptr(GVariant) result = g_dbus_connection_call_sync (bus, + "org.freedesktop.ConsoleKit", + "/org/freedesktop/ConsoleKit/Manager", + "org.freedesktop.ConsoleKit.Manager", + "OpenSessionWithParameters", + g_variant_new ("(a(sv))", parameters), + G_VARIANT_TYPE ("(s)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); if (error) g_warning ("Failed to open CK session: %s", error->message); if (!result) return NULL; + g_autofree gchar *cookie = NULL; g_variant_get (result, "(s)", &cookie); g_debug ("Opened ConsoleKit session %s", cookie); @@ -55,27 +52,24 @@ ck_open_session (GVariantBuilder *parameters) static gchar * get_ck_session (GDBusConnection *bus, const gchar *cookie) { - g_autoptr(GVariant) result = NULL; - g_autofree gchar *session_path = NULL; g_autoptr(GError) error = NULL; - - bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); - result = g_dbus_connection_call_sync (bus, - "org.freedesktop.ConsoleKit", - "/org/freedesktop/ConsoleKit/Manager", - "org.freedesktop.ConsoleKit.Manager", - "GetSessionForCookie", - g_variant_new ("(s)", cookie), - G_VARIANT_TYPE ("(o)"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); + g_autoptr(GVariant) result = g_dbus_connection_call_sync (bus, + "org.freedesktop.ConsoleKit", + "/org/freedesktop/ConsoleKit/Manager", + "org.freedesktop.ConsoleKit.Manager", + "GetSessionForCookie", + g_variant_new ("(s)", cookie), + G_VARIANT_TYPE ("(o)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); if (error) g_warning ("Error getting ConsoleKit session: %s", error->message); if (!result) return NULL; + g_autofree gchar *session_path = NULL; g_variant_get (result, "(o)", &session_path); return g_steal_pointer (&session_path); @@ -84,36 +78,32 @@ get_ck_session (GDBusConnection *bus, const gchar *cookie) void ck_lock_session (const gchar *cookie) { - g_autoptr(GDBusConnection) bus = NULL; - g_autofree gchar *session_path = NULL; - g_autoptr(GVariant) result = NULL; - g_autoptr(GError) error = NULL; - g_return_if_fail (cookie != NULL); g_debug ("Locking ConsoleKit session %s", cookie); - bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); + g_autoptr(GError) error = NULL; + g_autoptr(GDBusConnection) bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (error) g_warning ("Failed to get system bus: %s", error->message); if (!bus) return; - session_path = get_ck_session (bus, cookie); + g_autofree gchar *session_path = get_ck_session (bus, cookie); if (!session_path) return; - result = g_dbus_connection_call_sync (bus, - "org.freedesktop.ConsoleKit", - session_path, - "org.freedesktop.ConsoleKit.Session", - "Lock", - g_variant_new ("()"), - G_VARIANT_TYPE ("()"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); + g_autoptr(GVariant) result = g_dbus_connection_call_sync (bus, + "org.freedesktop.ConsoleKit", + session_path, + "org.freedesktop.ConsoleKit.Session", + "Lock", + g_variant_new ("()"), + G_VARIANT_TYPE ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); if (error) g_warning ("Error locking ConsoleKit session: %s", error->message); } @@ -121,36 +111,32 @@ ck_lock_session (const gchar *cookie) void ck_unlock_session (const gchar *cookie) { - g_autoptr(GDBusConnection) bus = NULL; - g_autofree gchar *session_path = NULL; - g_autoptr(GVariant) result = NULL; - g_autoptr(GError) error = NULL; - g_return_if_fail (cookie != NULL); g_debug ("Unlocking ConsoleKit session %s", cookie); - bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); + g_autoptr(GError) error = NULL; + g_autoptr(GDBusConnection) bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (error) g_warning ("Failed to get system bus: %s", error->message); if (!bus) return; - session_path = get_ck_session (bus, cookie); + g_autofree gchar *session_path = get_ck_session (bus, cookie); if (!session_path) return; - result = g_dbus_connection_call_sync (bus, - "org.freedesktop.ConsoleKit", - session_path, - "org.freedesktop.ConsoleKit.Session", - "Unlock", - g_variant_new ("()"), - G_VARIANT_TYPE ("()"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); + g_autoptr(GVariant) result = g_dbus_connection_call_sync (bus, + "org.freedesktop.ConsoleKit", + session_path, + "org.freedesktop.ConsoleKit.Session", + "Unlock", + g_variant_new ("()"), + G_VARIANT_TYPE ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); if (error) g_warning ("Error unlocking ConsoleKit session: %s", error->message); } @@ -158,36 +144,32 @@ ck_unlock_session (const gchar *cookie) void ck_activate_session (const gchar *cookie) { - g_autoptr(GDBusConnection) bus = NULL; - g_autofree gchar *session_path = NULL; - g_autoptr(GVariant) result = NULL; - g_autoptr(GError) error = NULL; - g_return_if_fail (cookie != NULL); g_debug ("Activating ConsoleKit session %s", cookie); - bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); + g_autoptr(GError) error = NULL; + g_autoptr(GDBusConnection) bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (error) g_warning ("Failed to get system bus: %s", error->message); if (!bus) return; - session_path = get_ck_session (bus, cookie); + g_autofree gchar *session_path = get_ck_session (bus, cookie); if (!session_path) return; - result = g_dbus_connection_call_sync (bus, - "org.freedesktop.ConsoleKit", - session_path, - "org.freedesktop.ConsoleKit.Session", - "Activate", - g_variant_new ("()"), - G_VARIANT_TYPE ("()"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); + g_autoptr(GVariant) result = g_dbus_connection_call_sync (bus, + "org.freedesktop.ConsoleKit", + session_path, + "org.freedesktop.ConsoleKit.Session", + "Activate", + g_variant_new ("()"), + G_VARIANT_TYPE ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); if (error) g_warning ("Error activating ConsoleKit session: %s", error->message); } @@ -195,37 +177,34 @@ ck_activate_session (const gchar *cookie) void ck_close_session (const gchar *cookie) { - g_autoptr(GDBusConnection) bus = NULL; - g_autoptr(GVariant) result = NULL; - gboolean is_closed; - g_autoptr(GError) error = NULL; - g_return_if_fail (cookie != NULL); g_debug ("Ending ConsoleKit session %s", cookie); - bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); + g_autoptr(GError) error = NULL; + g_autoptr(GDBusConnection) bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (error) g_warning ("Failed to get system bus: %s", error->message); if (!bus) return; - result = g_dbus_connection_call_sync (bus, - "org.freedesktop.ConsoleKit", - "/org/freedesktop/ConsoleKit/Manager", - "org.freedesktop.ConsoleKit.Manager", - "CloseSession", - g_variant_new ("(s)", cookie), - G_VARIANT_TYPE ("(b)"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); + g_autoptr(GVariant) result = g_dbus_connection_call_sync (bus, + "org.freedesktop.ConsoleKit", + "/org/freedesktop/ConsoleKit/Manager", + "org.freedesktop.ConsoleKit.Manager", + "CloseSession", + g_variant_new ("(s)", cookie), + G_VARIANT_TYPE ("(b)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); if (error) g_warning ("Error ending ConsoleKit session: %s", error->message); if (!result) return; + gboolean is_closed; g_variant_get (result, "(b)", &is_closed); if (!is_closed) g_warning ("ConsoleKit.Manager.CloseSession() returned false"); @@ -234,44 +213,40 @@ ck_close_session (const gchar *cookie) gchar * ck_get_xdg_runtime_dir (const gchar *cookie) { - g_autoptr(GDBusConnection) bus = NULL; - g_autofree gchar *session_path = NULL; - g_autoptr(GVariant) result = NULL; - g_autofree gchar *runtime_dir = NULL; - g_autoptr(GError) error = NULL; - g_return_val_if_fail (cookie != NULL, NULL); g_debug ("Getting XDG_RUNTIME_DIR from ConsoleKit for session %s", cookie); - bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); + g_autoptr(GError) error = NULL; + g_autoptr(GDBusConnection) bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (error) g_warning ("Failed to get system bus: %s", error->message); if (!bus) return NULL; - session_path = get_ck_session (bus, cookie); + g_autofree gchar *session_path = get_ck_session (bus, cookie); if (!session_path) return NULL; - result = g_dbus_connection_call_sync (bus, - "org.freedesktop.ConsoleKit", - session_path, - "org.freedesktop.ConsoleKit.Session", - "GetXDGRuntimeDir", - g_variant_new ("()"), - G_VARIANT_TYPE ("(s)"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); + g_autoptr(GVariant) result = g_dbus_connection_call_sync (bus, + "org.freedesktop.ConsoleKit", + session_path, + "org.freedesktop.ConsoleKit.Session", + "GetXDGRuntimeDir", + g_variant_new ("()"), + G_VARIANT_TYPE ("(s)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); if (error) g_warning ("Error getting XDG_RUNTIME_DIR from ConsoleKit: %s", error->message); if (!result) return NULL; - g_variant_get (result, "(s)", &runtime_dir); + const gchar *runtime_dir; + g_variant_get (result, "(&s)", &runtime_dir); g_debug ("ConsoleKit XDG_RUNTIME_DIR is %s", runtime_dir); - return g_steal_pointer (&runtime_dir); + return g_strdup (runtime_dir); } diff --git a/src/display-manager-service.c b/src/display-manager-service.c index 9fbf4413..6e3e1c5c 100644 --- a/src/display-manager-service.c +++ b/src/display-manager-service.c @@ -70,9 +70,7 @@ typedef struct DisplayManagerService * display_manager_service_new (DisplayManager *manager) { - DisplayManagerService *service; - - service = g_object_new (DISPLAY_MANAGER_SERVICE_TYPE, NULL); + DisplayManagerService *service = g_object_new (DISPLAY_MANAGER_SERVICE_TYPE, NULL); service->priv->manager = g_object_ref (manager); return service; @@ -81,9 +79,7 @@ display_manager_service_new (DisplayManager *manager) static SeatBusEntry * seat_bus_entry_new (DisplayManagerService *service, Seat *seat, const gchar *path) { - SeatBusEntry *entry; - - entry = g_malloc0 (sizeof (SeatBusEntry)); + SeatBusEntry *entry = g_malloc0 (sizeof (SeatBusEntry)); entry->service = service; entry->seat = seat; entry->path = g_strdup (path); @@ -94,9 +90,7 @@ seat_bus_entry_new (DisplayManagerService *service, Seat *seat, const gchar *pat static SessionBusEntry * session_bus_entry_new (DisplayManagerService *service, Session *session, const gchar *path, const gchar *seat_path) { - SessionBusEntry *entry; - - entry = g_malloc0 (sizeof (SessionBusEntry)); + SessionBusEntry *entry = g_malloc0 (sizeof (SessionBusEntry)); entry->service = service; entry->session = session; entry->path = g_strdup (path); @@ -109,11 +103,10 @@ static void emit_object_value_changed (GDBusConnection *bus, const gchar *path, const gchar *interface_name, const gchar *property_name, GVariant *property_value) { GVariantBuilder builder; - g_autoptr(GError) error = NULL; - g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY); g_variant_builder_add (&builder, "{sv}", property_name, property_value); + g_autoptr(GError) error = NULL; if (!g_dbus_connection_emit_signal (bus, NULL, path, @@ -128,7 +121,6 @@ static void emit_object_signal (GDBusConnection *bus, const gchar *path, const gchar *signal_name, const gchar *object_path) { g_autoptr(GError) error = NULL; - if (!g_dbus_connection_emit_signal (bus, NULL, path, @@ -162,11 +154,11 @@ static GVariant * get_seat_list (DisplayManagerService *service) { GVariantBuilder builder; - GHashTableIter iter; - gpointer value; - g_variant_builder_init (&builder, G_VARIANT_TYPE ("ao")); + + GHashTableIter iter; g_hash_table_iter_init (&iter, service->priv->seat_bus_entries); + gpointer value; while (g_hash_table_iter_next (&iter, NULL, &value)) { SeatBusEntry *entry = value; @@ -180,12 +172,11 @@ static GVariant * get_session_list (DisplayManagerService *service, const gchar *seat_path) { GVariantBuilder builder; - GHashTableIter iter; - gpointer value; - g_variant_builder_init (&builder, G_VARIANT_TYPE ("ao")); + GHashTableIter iter; g_hash_table_iter_init (&iter, service->priv->session_bus_entries); + gpointer value; while (g_hash_table_iter_next (&iter, NULL, &value)) { SessionBusEntry *entry = value; @@ -231,18 +222,16 @@ handle_display_manager_call (GDBusConnection *connection, g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "AddSeat is deprecated"); else if (g_strcmp0 (method_name, "AddLocalXSeat") == 0) { - gint display_number; - Seat *seat; - SeatBusEntry *entry; - if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(i)"))) { g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "Invalid arguments"); return; } + gint display_number; g_variant_get (parameters, "(i)", &display_number); + g_autoptr(Seat) seat = NULL; g_signal_emit (service, signals[ADD_XLOCAL_SEAT], 0, display_number, &seat); if (!seat) @@ -250,9 +239,8 @@ 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; } - entry = g_hash_table_lookup (service->priv->seat_bus_entries, seat); + SeatBusEntry *entry = g_hash_table_lookup (service->priv->seat_bus_entries, seat); g_dbus_method_invocation_return_value (invocation, g_variant_new ("(o)", entry->path)); - g_object_unref (seat); } else g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Unknown method"); @@ -303,11 +291,10 @@ handle_seat_call (GDBusConnection *connection, } else if (g_strcmp0 (method_name, "SwitchToUser") == 0) { - const gchar *username, *session_name; - if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(ss)"))) g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "Invalid arguments"); + const gchar *username, *session_name; g_variant_get (parameters, "(&s&s)", &username, &session_name); if (g_strcmp0 (session_name, "") == 0) session_name = NULL; @@ -319,11 +306,10 @@ handle_seat_call (GDBusConnection *connection, } else if (g_strcmp0 (method_name, "SwitchToGuest") == 0) { - const gchar *session_name; - if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(s)"))) g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "Invalid arguments"); + const gchar *session_name; g_variant_get (parameters, "(&s)", &session_name); if (g_strcmp0 (session_name, "") == 0) session_name = NULL; @@ -351,14 +337,11 @@ handle_seat_call (GDBusConnection *connection, static Seat * get_seat_for_session (DisplayManagerService *service, Session *session) { - GList *seat_link; - - for (seat_link = display_manager_get_seats (service->priv->manager); seat_link; seat_link = seat_link->next) + for (GList *seat_link = display_manager_get_seats (service->priv->manager); seat_link; seat_link = seat_link->next) { Seat *seat = seat_link->data; - GList *session_link; - for (session_link = seat_get_sessions (seat); session_link; session_link = session_link->next) + for (GList *session_link = seat_get_sessions (seat); session_link; session_link = session_link->next) { Session *s = session_link->data; @@ -403,12 +386,10 @@ handle_session_call (GDBusConnection *connection, if (g_strcmp0 (method_name, "Lock") == 0) { - Seat *seat; - if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("()"))) g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "Invalid arguments"); - seat = get_seat_for_session (entry->service, entry->session); + Seat *seat = get_seat_for_session (entry->service, entry->session); /* FIXME: Should only allow locks if have a session on this seat */ seat_lock (seat, session_get_username (entry->session)); g_dbus_method_invocation_return_value (invocation, NULL); @@ -420,29 +401,25 @@ handle_session_call (GDBusConnection *connection, static void running_user_session_cb (Seat *seat, Session *session, DisplayManagerService *service) { - static const GDBusInterfaceVTable session_vtable = - { - handle_session_call, - handle_session_get_property - }; - SeatBusEntry *seat_entry; - SessionBusEntry *session_entry; - gchar *path; - g_autoptr(GError) error = NULL; - /* Set environment variables when session runs */ - seat_entry = g_hash_table_lookup (service->priv->seat_bus_entries, seat); + SeatBusEntry *seat_entry = g_hash_table_lookup (service->priv->seat_bus_entries, seat); session_set_env (session, "XDG_SEAT_PATH", seat_entry->path); - path = g_strdup_printf ("/org/freedesktop/DisplayManager/Session%d", service->priv->session_index); + g_autofree gchar *path = g_strdup_printf ("/org/freedesktop/DisplayManager/Session%d", service->priv->session_index); service->priv->session_index++; session_set_env (session, "XDG_SESSION_PATH", path); - g_object_set_data_full (G_OBJECT (session), "XDG_SESSION_PATH", path, g_free); + g_object_set_data_full (G_OBJECT (session), "XDG_SESSION_PATH", g_steal_pointer (&path), g_free); - session_entry = session_bus_entry_new (service, session, g_object_get_data (G_OBJECT (session), "XDG_SESSION_PATH"), seat_entry ? seat_entry->path : NULL); + 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_debug ("Registering session with bus path %s", session_entry->path); + static const GDBusInterfaceVTable session_vtable = + { + handle_session_call, + handle_session_get_property + }; + g_autoptr(GError) error = NULL; session_entry->bus_id = g_dbus_connection_register_object (service->priv->bus, session_entry->path, service->priv->session_info->interfaces[0], @@ -462,12 +439,10 @@ running_user_session_cb (Seat *seat, Session *session, DisplayManagerService *se static void session_removed_cb (Seat *seat, Session *session, DisplayManagerService *service) { - SessionBusEntry *entry; - g_autofree gchar *seat_path = NULL; - g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); - entry = g_hash_table_lookup (service->priv->session_bus_entries, session); + SessionBusEntry *entry = g_hash_table_lookup (service->priv->session_bus_entries, session); + g_autofree gchar *seat_path = NULL; if (entry) { g_dbus_connection_unregister_object (service->priv->bus, entry->bus_id); @@ -488,23 +463,20 @@ session_removed_cb (Seat *seat, Session *session, DisplayManagerService *service static void seat_added_cb (DisplayManager *display_manager, Seat *seat, DisplayManagerService *service) { - static const GDBusInterfaceVTable seat_vtable = - { - handle_seat_call, - handle_seat_get_property - }; - g_autofree gchar *path = NULL; - SeatBusEntry *entry; - g_autoptr(GError) error = NULL; - - path = g_strdup_printf ("/org/freedesktop/DisplayManager/Seat%d", service->priv->seat_index); + g_autofree gchar *path = g_strdup_printf ("/org/freedesktop/DisplayManager/Seat%d", service->priv->seat_index); service->priv->seat_index++; - entry = seat_bus_entry_new (service, seat, path); + SeatBusEntry *entry = seat_bus_entry_new (service, seat, path); g_hash_table_insert (service->priv->seat_bus_entries, g_object_ref (seat), entry); g_debug ("Registering seat with bus path %s", entry->path); + static const GDBusInterfaceVTable seat_vtable = + { + handle_seat_call, + handle_seat_get_property + }; + g_autoptr(GError) error = NULL; entry->bus_id = g_dbus_connection_register_object (service->priv->bus, entry->path, service->priv->seat_info->interfaces[0], @@ -524,9 +496,7 @@ seat_added_cb (DisplayManager *display_manager, Seat *seat, DisplayManagerServic static void seat_removed_cb (DisplayManager *display_manager, Seat *seat, DisplayManagerService *service) { - SeatBusEntry *entry; - - entry = g_hash_table_lookup (service->priv->seat_bus_entries, seat); + SeatBusEntry *entry = g_hash_table_lookup (service->priv->seat_bus_entries, seat); if (entry) { g_dbus_connection_unregister_object (service->priv->bus, entry->bus_id); @@ -534,7 +504,7 @@ seat_removed_cb (DisplayManager *display_manager, Seat *seat, DisplayManagerServ } g_hash_table_remove (service->priv->seat_bus_entries, seat); - + emit_object_value_changed (service->priv->bus, "/org/freedesktop/DisplayManager", "org.freedesktop.DisplayManager", "Seats", get_seat_list (service)); } @@ -543,6 +513,12 @@ bus_acquired_cb (GDBusConnection *connection, const gchar *name, gpointer user_data) { + DisplayManagerService *service = user_data; + + g_debug ("Acquired bus name %s", name); + + service->priv->bus = g_object_ref (connection); + const gchar *display_manager_interface = "<node>" " <interface name='org.freedesktop.DisplayManager'>" @@ -571,11 +547,9 @@ bus_acquired_cb (GDBusConnection *connection, " </signal>" " </interface>" "</node>"; - static const GDBusInterfaceVTable display_manager_vtable = - { - handle_display_manager_call, - handle_display_manager_get_property - }; + GDBusNodeInfo *display_manager_info = g_dbus_node_info_new_for_xml (display_manager_interface, NULL); + g_assert (display_manager_info != NULL); + const gchar *seat_interface = "<node>" " <interface name='org.freedesktop.DisplayManager.Seat'>" @@ -599,6 +573,9 @@ bus_acquired_cb (GDBusConnection *connection, " </signal>" " </interface>" "</node>"; + service->priv->seat_info = g_dbus_node_info_new_for_xml (seat_interface, NULL); + g_assert (service->priv->seat_info != NULL); + const gchar *session_interface = "<node>" " <interface name='org.freedesktop.DisplayManager.Session'>" @@ -607,22 +584,15 @@ bus_acquired_cb (GDBusConnection *connection, " <method name='Lock'/>" " </interface>" "</node>"; - DisplayManagerService *service = user_data; - GDBusNodeInfo *display_manager_info; - GList *link; - g_autoptr(GError) error = NULL; - - g_debug ("Acquired bus name %s", name); - - service->priv->bus = g_object_ref (connection); - - display_manager_info = g_dbus_node_info_new_for_xml (display_manager_interface, NULL); - g_assert (display_manager_info != NULL); - service->priv->seat_info = g_dbus_node_info_new_for_xml (seat_interface, NULL); - g_assert (service->priv->seat_info != NULL); service->priv->session_info = g_dbus_node_info_new_for_xml (session_interface, NULL); g_assert (service->priv->session_info != NULL); + static const GDBusInterfaceVTable display_manager_vtable = + { + handle_display_manager_call, + 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], @@ -636,7 +606,7 @@ bus_acquired_cb (GDBusConnection *connection, /* 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 (link = display_manager_get_seats (service->priv->manager); link; link = link->next) + 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_emit (service, signals[READY], 0); @@ -686,12 +656,12 @@ 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_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_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); diff --git a/src/display-manager.c b/src/display-manager.c index 87a857e6..8f3dd320 100644 --- a/src/display-manager.c +++ b/src/display-manager.c @@ -59,9 +59,7 @@ display_manager_get_seats (DisplayManager *manager) Seat * display_manager_get_seat (DisplayManager *manager, const gchar *name) { - GList *link; - - for (link = manager->priv->seats; link; link = link->next) + for (GList *link = manager->priv->seats; link; link = link->next) { Seat *seat = link->data; @@ -133,8 +131,6 @@ display_manager_start (DisplayManager *manager) void display_manager_stop (DisplayManager *manager) { - GList *seats, *link; - g_return_if_fail (manager != NULL); if (manager->priv->stopping) @@ -145,8 +141,8 @@ display_manager_stop (DisplayManager *manager) manager->priv->stopping = TRUE; /* Stop all the seats. Copy the list as it might be modified if a seat stops during this loop */ - seats = g_list_copy (manager->priv->seats); - for (link = seats; link; link = link->next) + GList *seats = g_list_copy (manager->priv->seats); + for (GList *link = seats; link; link = link->next) { Seat *seat = link->data; seat_stop (seat); @@ -171,9 +167,8 @@ static void display_manager_finalize (GObject *object) { DisplayManager *self = DISPLAY_MANAGER (object); - GList *link; - for (link = self->priv->seats; link; link = link->next) + for (GList *link = self->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); diff --git a/src/dm-tool.c b/src/dm-tool.c index 9493df21..5060109f 100644 --- a/src/dm-tool.c +++ b/src/dm-tool.c @@ -39,17 +39,14 @@ xephyr_setup_cb (gpointer user_data) static void xephyr_signal_cb (int signum) { - g_autofree gchar *path = NULL; - g_autoptr(GVariant) result = NULL; g_autoptr(GError) error = NULL; - - result = g_dbus_proxy_call_sync (dm_proxy, - "AddLocalXSeat", - g_variant_new ("(i)", xephyr_display_number), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); + g_autoptr(GVariant) result = g_dbus_proxy_call_sync (dm_proxy, + "AddLocalXSeat", + g_variant_new ("(i)", xephyr_display_number), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); if (!result) { g_printerr ("Unable to add seat: %s\n", error->message); @@ -63,6 +60,7 @@ xephyr_signal_cb (int signum) exit (EXIT_FAILURE); } + const gchar *path = NULL; g_variant_get (result, "(&o)", &path); g_print ("%s\n", path); @@ -72,8 +70,6 @@ xephyr_signal_cb (int signum) static GDBusProxy * get_seat_proxy (void) { - g_autoptr(GError) error = NULL; - if (seat_proxy) return seat_proxy; @@ -83,6 +79,7 @@ get_seat_proxy (void) exit (EXIT_FAILURE); } + g_autoptr(GError) error = NULL; seat_proxy = g_dbus_proxy_new_for_bus_sync (bus_type, G_DBUS_PROXY_FLAGS_NONE, NULL, @@ -103,16 +100,11 @@ get_seat_proxy (void) int main (int argc, char **argv) { - gchar *command; - gint n_options; - gchar **options; - g_autoptr(GError) error = NULL; - gint arg_index; - #if !defined(GLIB_VERSION_2_36) g_type_init (); #endif + gint arg_index; for (arg_index = 1; arg_index < argc; arg_index++) { gchar *arg = argv[arg_index]; @@ -164,6 +156,7 @@ main (int argc, char **argv) return EXIT_FAILURE; } + g_autoptr(GError) error = NULL; dm_proxy = g_dbus_proxy_new_for_bus_sync (bus_type, G_DBUS_PROXY_FLAGS_NONE, NULL, @@ -178,10 +171,10 @@ main (int argc, char **argv) return EXIT_FAILURE; } - command = argv[arg_index]; + const gchar *command = argv[arg_index]; arg_index++; - n_options = argc - arg_index; - options = argv + arg_index; + gint n_options = argc - arg_index; + gchar **options = argv + arg_index; if (strcmp (command, "switch-to-greeter") == 0) { if (n_options != 0) @@ -206,8 +199,6 @@ main (int argc, char **argv) } else if (strcmp (command, "switch-to-user") == 0) { - gchar *username, *session = ""; - if (n_options < 1 || n_options > 2) { g_printerr ("Usage switch-to-user USERNAME [SESSION]\n"); @@ -215,7 +206,8 @@ main (int argc, char **argv) return EXIT_FAILURE; } - username = options[0]; + const gchar *username = options[0]; + const gchar *session = ""; if (n_options == 2) session = options[1]; @@ -234,8 +226,6 @@ main (int argc, char **argv) } else if (strcmp (command, "switch-to-guest") == 0) { - gchar *session = ""; - if (n_options > 1) { g_printerr ("Usage switch-to-guest [SESSION]\n"); @@ -243,6 +233,7 @@ main (int argc, char **argv) return EXIT_FAILURE; } + const gchar *session = ""; if (n_options == 1) session = options[0]; @@ -283,27 +274,20 @@ main (int argc, char **argv) } else if (strcmp (command, "list-seats") == 0) { - GVariant *seats; - GVariantIter *seat_iter; - gchar *seat_path; - if (!g_dbus_proxy_get_name_owner (dm_proxy)) { g_printerr ("Unable to contact display manager\n"); return EXIT_FAILURE; } - seats = g_dbus_proxy_get_cached_property (dm_proxy, "Seats"); + g_autoptr(GVariant) seats = g_dbus_proxy_get_cached_property (dm_proxy, "Seats"); + g_autoptr(GVariantIter) seat_iter = NULL; g_variant_get (seats, "ao", &seat_iter); + gchar *seat_path; while (g_variant_iter_loop (seat_iter, "&o", &seat_path)) { gchar *seat_name; g_autoptr(GDBusProxy) proxy = NULL; - gchar **property_names; - GVariant *sessions; - GVariantIter *session_iter; - gchar *session_path; - gint i; if (g_str_has_prefix (seat_path, "/org/freedesktop/DisplayManager/")) seat_name = seat_path + strlen ("/org/freedesktop/DisplayManager/"); @@ -322,54 +306,50 @@ main (int argc, char **argv) continue; g_print ("%s\n", seat_name); - property_names = g_dbus_proxy_get_cached_property_names (proxy); - for (i = 0; property_names[i]; i++) + g_auto(GStrv) property_names = g_dbus_proxy_get_cached_property_names (proxy); + for (int i = 0; property_names[i]; i++) { - g_autoptr(GVariant) value = NULL; - if (strcmp (property_names[i], "Sessions") == 0) continue; - value = g_dbus_proxy_get_cached_property (proxy, property_names[i]); + g_autoptr(GVariant) value = g_dbus_proxy_get_cached_property (proxy, property_names[i]); g_print (" %s=%s\n", property_names[i], g_variant_print (value, FALSE)); } - sessions = g_dbus_proxy_get_cached_property (proxy, "Sessions"); + g_autoptr(GVariant) sessions = g_dbus_proxy_get_cached_property (proxy, "Sessions"); if (!sessions) continue; + g_autoptr(GVariantIter) session_iter = NULL; g_variant_get (sessions, "ao", &session_iter); + const gchar *session_path; while (g_variant_iter_loop (session_iter, "&o", &session_path)) { - g_autoptr(GDBusProxy) session_proxy = NULL; const gchar *session_name; - if (g_str_has_prefix (session_path, "/org/freedesktop/DisplayManager/")) session_name = session_path + strlen ("/org/freedesktop/DisplayManager/"); else session_name = session_path; - session_proxy = g_dbus_proxy_new_sync (g_dbus_proxy_get_connection (dm_proxy), - G_DBUS_PROXY_FLAGS_NONE, - NULL, - "org.freedesktop.DisplayManager", - session_path, - "org.freedesktop.DisplayManager.Session", - NULL, - NULL); + g_autoptr(GDBusProxy) session_proxy = g_dbus_proxy_new_sync (g_dbus_proxy_get_connection (dm_proxy), + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.freedesktop.DisplayManager", + session_path, + "org.freedesktop.DisplayManager.Session", + NULL, + NULL); if (!session_proxy || !g_dbus_proxy_get_name_owner (session_proxy)) continue; g_print (" %s\n", session_name); - property_names = g_dbus_proxy_get_cached_property_names (session_proxy); - for (i = 0; property_names[i]; i++) + g_auto(GStrv) property_names = g_dbus_proxy_get_cached_property_names (session_proxy); + for (int i = 0; property_names[i]; i++) { - g_autoptr(GVariant) value = NULL; - if (strcmp (property_names[i], "Seat") == 0) continue; - value = g_dbus_proxy_get_cached_property (session_proxy, property_names[i]); + g_autoptr(GVariant) value = g_dbus_proxy_get_cached_property (session_proxy, property_names[i]); g_print (" %s=%s\n", property_names[i], g_variant_print (value, FALSE)); } } @@ -381,17 +361,14 @@ main (int argc, char **argv) } else if (strcmp (command, "add-nested-seat") == 0) { - gchar *path, *xephyr_command, **xephyr_argv; - gchar *dimensions = NULL; - GMainLoop *loop; - - path = g_find_program_in_path ("Xephyr"); + const gchar *path = g_find_program_in_path ("Xephyr"); if (!path) { g_printerr ("Unable to find Xephyr, please install it\n"); return EXIT_FAILURE; } + const gchar *dimensions = NULL; if (n_options > 0) { /* Parse the given options */ @@ -415,11 +392,8 @@ main (int argc, char **argv) xephyr_display_number = 0; while (TRUE) { - g_autofree gchar *lock_name = NULL; - gboolean has_lock; - - lock_name = g_strdup_printf ("/tmp/.X%d-lock", xephyr_display_number); - has_lock = g_file_test (lock_name, G_FILE_TEST_EXISTS); + g_autofree gchar *lock_name = g_strdup_printf ("/tmp/.X%d-lock", xephyr_display_number); + gboolean has_lock = g_file_test (lock_name, G_FILE_TEST_EXISTS); if (has_lock) xephyr_display_number++; @@ -430,6 +404,7 @@ main (int argc, char **argv) /* Wait for signal from Xephyr is ready */ signal (SIGUSR1, xephyr_signal_cb); + g_autofree gchar *xephyr_command; if (dimensions == NULL) { xephyr_command = g_strdup_printf ("Xephyr :%d ", xephyr_display_number); @@ -442,6 +417,7 @@ main (int argc, char **argv) { xephyr_command = g_strdup_printf ("Xephyr :%d -screen %s", xephyr_display_number, dimensions); } + g_auto(GStrv) xephyr_argv = NULL; if (!g_shell_parse_argv (xephyr_command, NULL, &xephyr_argv, &error) || !g_spawn_async (NULL, xephyr_argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL, @@ -453,15 +429,11 @@ main (int argc, char **argv) } /* Block until ready */ - loop = g_main_loop_new (NULL, FALSE); + g_autoptr(GMainLoop) loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (loop); } else if (strcmp (command, "add-local-x-seat") == 0) { - GVariant *result; - gint display_number; - const gchar *path; - if (n_options != 1) { g_printerr ("Usage add-seat DISPLAY_NUMBER\n"); @@ -469,15 +441,14 @@ main (int argc, char **argv) return EXIT_FAILURE; } - display_number = atoi (options[0]); - - result = g_dbus_proxy_call_sync (dm_proxy, - "AddLocalXSeat", - g_variant_new ("(i)", display_number), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); + gint display_number = atoi (options[0]); + g_autoptr(GVariant) result = g_dbus_proxy_call_sync (dm_proxy, + "AddLocalXSeat", + g_variant_new ("(i)", display_number), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); if (!result) { g_printerr ("Unable to add local X seat: %s\n", error->message); @@ -490,6 +461,7 @@ main (int argc, char **argv) return EXIT_FAILURE; } + const gchar *path; g_variant_get (result, "(&o)", &path); g_print ("%s\n", path); @@ -497,11 +469,6 @@ main (int argc, char **argv) } else if (strcmp (command, "add-seat") == 0) { - GVariant *result; - gchar *type, *path; - GVariantBuilder *properties; - gint i; - if (n_options < 1) { g_printerr ("Usage add-seat TYPE [NAME=VALUE...]\n"); @@ -509,17 +476,14 @@ main (int argc, char **argv) return EXIT_FAILURE; } - type = options[0]; - properties = g_variant_builder_new (G_VARIANT_TYPE ("a(ss)")); + const gchar *type = options[0]; + g_autoptr(GVariantBuilder) properties = g_variant_builder_new (G_VARIANT_TYPE ("a(ss)")); - for (i = 1; i < n_options; i++) + for (gint i = 1; i < n_options; i++) { - g_autofree gchar *property = NULL; - gchar *name, *value; - - property = g_strdup (options[i]); - name = property; - value = strchr (property, '='); + g_autofree gchar *property = g_strdup (options[i]); + gchar *name = property; + gchar *value = strchr (property, '='); if (value) { *value = '\0'; @@ -531,14 +495,13 @@ main (int argc, char **argv) g_variant_builder_add_value (properties, g_variant_new ("(ss)", name, value)); } - result = g_dbus_proxy_call_sync (dm_proxy, - "AddSeat", - g_variant_new ("(sa(ss))", type, properties), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); - g_variant_builder_unref (properties); + g_autoptr(GVariant) result = g_dbus_proxy_call_sync (dm_proxy, + "AddSeat", + g_variant_new ("(sa(ss))", type, properties), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); if (!result) { g_printerr ("Unable to add seat: %s\n", error->message); @@ -551,6 +514,7 @@ main (int argc, char **argv) return EXIT_FAILURE; } + const gchar *path; g_variant_get (result, "(&o)", &path); g_print ("%s\n", path); diff --git a/src/greeter-session.c b/src/greeter-session.c index ace766f1..ac637c0d 100644 --- a/src/greeter-session.c +++ b/src/greeter-session.c @@ -42,23 +42,19 @@ static gboolean greeter_session_start (Session *session) { GreeterSession *s = GREETER_SESSION (session); - int to_greeter_pipe[2], from_greeter_pipe[2]; - int to_greeter_input, to_greeter_output, from_greeter_input, from_greeter_output; - g_autofree gchar *to_server_value = NULL; - g_autofree gchar *from_server_value = NULL; - gboolean result; /* Create a pipe to talk with the greeter */ + int to_greeter_pipe[2], from_greeter_pipe[2]; if (pipe (to_greeter_pipe) != 0 || pipe (from_greeter_pipe) != 0) { g_warning ("Failed to create pipes: %s", strerror (errno)); return FALSE; } - to_greeter_input = to_greeter_pipe[1]; - to_greeter_output = to_greeter_pipe[0]; - from_greeter_input = from_greeter_pipe[1]; - from_greeter_output = from_greeter_pipe[0]; + int to_greeter_input = to_greeter_pipe[1]; + 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); /* Don't allow the daemon end of the pipes to be accessed in child processes */ @@ -66,12 +62,12 @@ greeter_session_start (Session *session) fcntl (from_greeter_output, F_SETFD, FD_CLOEXEC); /* Let the greeter session know how to communicate with the daemon */ - to_server_value = g_strdup_printf ("%d", from_greeter_input); + g_autofree gchar *to_server_value = g_strdup_printf ("%d", from_greeter_input); session_set_env (session, "LIGHTDM_TO_SERVER_FD", to_server_value); - from_server_value = g_strdup_printf ("%d", to_greeter_output); + g_autofree gchar *from_server_value = g_strdup_printf ("%d", to_greeter_output); session_set_env (session, "LIGHTDM_FROM_SERVER_FD", from_server_value); - result = SESSION_CLASS (greeter_session_parent_class)->start (session); + gboolean result = SESSION_CLASS (greeter_session_parent_class)->start (session); /* Close the session ends of the pipe */ close (from_greeter_input); @@ -114,7 +110,7 @@ greeter_session_class_init (GreeterSessionClass *klass) GObjectClass *object_class = G_OBJECT_CLASS (klass); session_class->start = greeter_session_start; - session_class->stop = greeter_session_stop; + session_class->stop = greeter_session_stop; object_class->finalize = greeter_session_finalize; g_type_class_add_private (klass, sizeof (GreeterSessionPrivate)); diff --git a/src/greeter-socket.c b/src/greeter-socket.c index 1b0147a2..34793640 100644 --- a/src/greeter-socket.c +++ b/src/greeter-socket.c @@ -46,9 +46,7 @@ G_DEFINE_TYPE (GreeterSocket, greeter_socket, G_TYPE_OBJECT) GreeterSocket * greeter_socket_new (const gchar *path) { - GreeterSocket *socket; - - socket = g_object_new (GREETER_SOCKET_TYPE, NULL); + GreeterSocket *socket = g_object_new (GREETER_SOCKET_TYPE, NULL); socket->priv->path = g_strdup (path); return socket; @@ -67,10 +65,8 @@ greeter_disconnected_cb (Greeter *greeter, GreeterSocket *socket) static gboolean greeter_connect_cb (GSocket *s, GIOCondition condition, GreeterSocket *socket) { - g_autoptr(GSocket) new_socket = NULL; g_autoptr(GError) error = NULL; - - new_socket = g_socket_accept (socket->priv->socket, NULL, &error); + g_autoptr(GSocket) new_socket = g_socket_accept (socket->priv->socket, NULL, &error); if (error) g_warning ("Failed to accept greeter connection: %s", error->message); if (!new_socket) @@ -94,9 +90,6 @@ greeter_connect_cb (GSocket *s, GIOCondition condition, GreeterSocket *socket) gboolean greeter_socket_start (GreeterSocket *socket, GError **error) { - g_autoptr(GSocketAddress) address = NULL; - gboolean result; - g_return_val_if_fail (socket != NULL, FALSE); g_return_val_if_fail (socket->priv->socket == NULL, FALSE); @@ -105,8 +98,8 @@ greeter_socket_start (GreeterSocket *socket, GError **error) return FALSE; unlink (socket->priv->path); - address = g_unix_socket_address_new (socket->priv->path); - result = g_socket_bind (socket->priv->socket, address, FALSE, error); + g_autoptr(GSocketAddress) address = g_unix_socket_address_new (socket->priv->path); + gboolean result = g_socket_bind (socket->priv->socket, address, FALSE, error); if (!result) return FALSE; if (!g_socket_listen (socket->priv->socket, error)) diff --git a/src/greeter.c b/src/greeter.c index 1bbed854..bf725ac3 100644 --- a/src/greeter.c +++ b/src/greeter.c @@ -24,7 +24,7 @@ enum { enum { CONNECTED, - DISCONNECTED, + DISCONNECTED, CREATE_SESSION, START_SESSION, LAST_SIGNAL @@ -111,7 +111,7 @@ typedef enum SERVER_MESSAGE_SHARED_DIR_RESULT, SERVER_MESSAGE_IDLE, SERVER_MESSAGE_RESET, - SERVER_MESSAGE_CONNECTED_V2, + SERVER_MESSAGE_CONNECTED_V2, } ServerMessage; static gboolean read_cb (GIOChannel *source, GIOCondition condition, gpointer data); @@ -125,24 +125,25 @@ greeter_new (void) void greeter_set_file_descriptors (Greeter *greeter, int to_greeter_fd, int from_greeter_fd) { - g_autoptr(GError) to_error = NULL; - g_autoptr(GError) from_error = NULL; - 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); - greeter->priv->to_greeter_input = to_greeter_fd; + greeter->priv->to_greeter_input = to_greeter_fd; greeter->priv->to_greeter_channel = g_io_channel_unix_new (greeter->priv->to_greeter_input); + g_autoptr(GError) to_error = NULL; g_io_channel_set_encoding (greeter->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); + g_autoptr(GError) from_error = NULL; g_io_channel_set_encoding (greeter->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); + greeter->priv->from_greeter_watch = g_io_add_watch (greeter->priv->from_greeter_channel, G_IO_IN | G_IO_HUP, read_cb, greeter); } @@ -167,7 +168,7 @@ greeter_set_pam_services (Greeter *greeter, const gchar *pam_service, const gcha void greeter_set_allow_guest (Greeter *greeter, gboolean allow_guest) { - g_return_if_fail (greeter != NULL); + g_return_if_fail (greeter != NULL); greeter->priv->allow_guest = allow_guest; } @@ -215,9 +216,7 @@ secure_free (Greeter *greeter, void *ptr) static void secure_freev (Greeter *greeter, gchar **v) { - int i; - - for (i = 0; v[i]; i++) + for (int i = 0; v[i]; i++) secure_free (greeter, v[i]); g_free (v); } @@ -234,17 +233,14 @@ int_length (void) static void write_message (Greeter *greeter, guint8 *message, gsize message_length) { - gchar *data; - gsize data_length; - g_autoptr(GError) error = NULL; - - data = (gchar *) message; - data_length = message_length; + gchar *data = (gchar *) message; + gsize data_length = message_length; while (data_length > 0) { GIOStatus status; 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); if (error) g_warning ("Error writing to greeter: %s", error->message); @@ -254,6 +250,7 @@ write_message (Greeter *greeter, guint8 *message, gsize message_length) data += n_written; } + g_autoptr(GError) error = NULL; g_io_channel_flush (greeter->priv->to_greeter_channel, &error); if (error) g_warning ("Failed to flush data to greeter: %s", error->message); @@ -275,7 +272,6 @@ static void write_string (guint8 *buffer, gint buffer_length, const gchar *value, gsize *offset) { gint length; - if (value) length = strlen (value); else @@ -309,21 +305,20 @@ string_length (const gchar *value) static void handle_connect (Greeter *greeter, const gchar *version, gboolean resettable, guint32 api_version) { - guint8 message[MAX_MESSAGE_LENGTH]; - gsize offset = 0; - guint32 env_length = 0; - GHashTableIter iter; - gpointer key, value; - 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; + guint32 env_length = 0; + GHashTableIter iter; g_hash_table_iter_init (&iter, greeter->priv->hints); + gpointer key, value; while (g_hash_table_iter_next (&iter, &key, &value)) env_length += string_length (key) + string_length (value); + guint8 message[MAX_MESSAGE_LENGTH]; + gsize offset = 0; if (api_version == 0) { write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_CONNECTED, string_length (VERSION) + env_length, &offset); @@ -356,28 +351,23 @@ handle_connect (Greeter *greeter, const gchar *version, gboolean resettable, gui static void pam_messages_cb (Session *session, Greeter *greeter) { - int i; - guint32 size; - guint8 message[MAX_MESSAGE_LENGTH]; - const struct pam_message *messages; - int messages_length; - gsize offset = 0; - int n_prompts = 0; - - messages = session_get_messages (session); - messages_length = session_get_messages_length (session); + const struct pam_message *messages = session_get_messages (session); + int messages_length = session_get_messages_length (session); /* Respond to d-bus query with messages */ g_debug ("Prompt greeter with %d message(s)", messages_length); - size = int_length () + string_length (session_get_username (session)) + int_length (); - for (i = 0; i < messages_length; i++) + guint32 size = int_length () + string_length (session_get_username (session)) + int_length (); + for (int i = 0; i < messages_length; i++) size += int_length () + string_length (messages[i].msg); + 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_string (message, MAX_MESSAGE_LENGTH, session_get_username (session), &offset); write_int (message, MAX_MESSAGE_LENGTH, messages_length, &offset); - for (i = 0; i < messages_length; i++) + int n_prompts = 0; + for (int i = 0; i < messages_length; i++) { write_int (message, MAX_MESSAGE_LENGTH, messages[i].msg_style, &offset); write_string (message, MAX_MESSAGE_LENGTH, messages[i].msg, &offset); @@ -403,7 +393,6 @@ send_end_authentication (Greeter *greeter, guint32 sequence_number, const gchar { guint8 message[MAX_MESSAGE_LENGTH]; gsize offset = 0; - write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_END_AUTHENTICATION, int_length () + string_length (username) + int_length (), &offset); write_int (message, MAX_MESSAGE_LENGTH, sequence_number, &offset); write_string (message, MAX_MESSAGE_LENGTH, username, &offset); @@ -416,7 +405,6 @@ greeter_idle (Greeter *greeter) { guint8 message[MAX_MESSAGE_LENGTH]; gsize offset = 0; - write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_IDLE, 0, &offset); write_message (greeter, message, offset); } @@ -424,18 +412,17 @@ greeter_idle (Greeter *greeter) void greeter_reset (Greeter *greeter) { - guint8 message[MAX_MESSAGE_LENGTH]; - gsize offset = 0; - guint32 length = 0; - GHashTableIter iter; - gpointer key, value; - g_return_if_fail (greeter != NULL); + GHashTableIter iter; g_hash_table_iter_init (&iter, greeter->priv->hints); + gpointer key, value; + guint32 length = 0; while (g_hash_table_iter_next (&iter, &key, &value)) length += string_length (key) + string_length (value); + 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); while (g_hash_table_iter_next (&iter, &key, &value)) @@ -449,11 +436,9 @@ greeter_reset (Greeter *greeter) static void authentication_complete_cb (Session *session, Greeter *greeter) { - int result; - g_debug ("Authenticate result for user %s: %s", session_get_username (session), session_get_authentication_result_string (session)); - result = session_get_authentication_result (session); + int result = session_get_authentication_result (session); if (session_get_is_authenticated (session)) { if (session_get_user (session)) @@ -486,9 +471,6 @@ reset_session (Greeter *greeter) static void handle_authenticate (Greeter *greeter, guint32 sequence_number, const gchar *username) { - const gchar *autologin_username, *service; - gboolean is_interactive; - if (username[0] == '\0') { g_debug ("Greeter start authentication"); @@ -516,7 +498,9 @@ handle_authenticate (Greeter *greeter, guint32 sequence_number, const gchar *use g_signal_connect (G_OBJECT (greeter->priv->authentication_session), SESSION_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (authentication_complete_cb), greeter); /* Use non-interactive service for autologin user */ - autologin_username = g_hash_table_lookup (greeter->priv->hints, "autologin-user"); + const gchar *autologin_username = g_hash_table_lookup (greeter->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; @@ -557,27 +541,20 @@ handle_authenticate_as_guest (Greeter *greeter, guint32 sequence_number) static gchar * get_remote_session_service (const gchar *session_name) { - g_autoptr(GKeyFile) session_desktop_file = NULL; - gboolean result; - const gchar *c; - g_autofree gchar *remote_sessions_dir = NULL; - g_autofree gchar *filename = NULL; - g_autofree gchar *path = NULL; - g_autoptr(GError) error = NULL; - /* Validate session name doesn't contain directory separators */ - for (c = session_name; *c; c++) + for (const gchar *c = session_name; *c; c++) { if (*c == '/') return NULL; } /* Load the session file */ - session_desktop_file = g_key_file_new (); - filename = g_strdup_printf ("%s.desktop", session_name); - remote_sessions_dir = config_get_string (config_get_instance (), "LightDM", "remote-sessions-directory"); - path = g_build_filename (remote_sessions_dir, filename, NULL); - result = g_key_file_load_from_file (session_desktop_file, path, G_KEY_FILE_NONE, &error); + g_autoptr(GKeyFile) session_desktop_file = g_key_file_new (); + g_autofree gchar *filename = g_strdup_printf ("%s.desktop", session_name); + g_autofree gchar *remote_sessions_dir = config_get_string (config_get_instance (), "LightDM", "remote-sessions-directory"); + g_autofree gchar *path = g_build_filename (remote_sessions_dir, filename, NULL); + g_autoptr(GError) error = NULL; + gboolean result = g_key_file_load_from_file (session_desktop_file, path, G_KEY_FILE_NONE, &error); if (error) g_debug ("Failed to load session file %s: %s", path, error->message); if (!result) @@ -589,8 +566,6 @@ 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) { - g_autofree gchar *service = NULL; - if (username[0] == '\0') { g_debug ("Greeter start authentication for remote session %s", session_name); @@ -601,7 +576,7 @@ handle_authenticate_remote (Greeter *greeter, const gchar *session_name, const g reset_session (greeter); - service = get_remote_session_service (session_name); + g_autofree gchar *service = get_remote_session_service (session_name); if (!service) { send_end_authentication (greeter, sequence_number, "", PAM_SYSTEM_ERR); @@ -635,20 +610,16 @@ handle_authenticate_remote (Greeter *greeter, const gchar *session_name, const g static void handle_continue_authentication (Greeter *greeter, gchar **secrets) { - int messages_length; - const struct pam_message *messages; - struct pam_response *response; - int i, j, n_prompts = 0; - /* Not in authentication */ if (greeter->priv->authentication_session == NULL) return; - messages_length = session_get_messages_length (greeter->priv->authentication_session); - messages = session_get_messages (greeter->priv->authentication_session); + int messages_length = session_get_messages_length (greeter->priv->authentication_session); + const struct pam_message *messages = session_get_messages (greeter->priv->authentication_session); /* Check correct number of responses */ - for (i = 0; i < messages_length; i++) + int n_prompts = 0; + for (int i = 0; i < messages_length; i++) { int msg_style = messages[i].msg_style; if (msg_style == PAM_PROMPT_ECHO_OFF || msg_style == PAM_PROMPT_ECHO_ON) @@ -663,8 +634,8 @@ handle_continue_authentication (Greeter *greeter, gchar **secrets) g_debug ("Continue authentication"); /* Build response */ - response = calloc (messages_length, sizeof (struct pam_response)); - for (i = 0, j = 0; i < messages_length; i++) + struct pam_response *response = calloc (messages_length, sizeof (struct pam_response)); + for (int i = 0, j = 0; i < messages_length; i++) { int msg_style = messages[i].msg_style; if (msg_style == PAM_PROMPT_ECHO_OFF || msg_style == PAM_PROMPT_ECHO_ON) @@ -678,7 +649,7 @@ handle_continue_authentication (Greeter *greeter, gchar **secrets) session_respond (greeter->priv->authentication_session, response); - for (i = 0; i < messages_length; i++) + for (int i = 0; i < messages_length; i++) secure_free (greeter, response[i].resp); free (response); } @@ -697,21 +668,18 @@ handle_cancel_authentication (Greeter *greeter) static void handle_start_session (Greeter *greeter, const gchar *session) { - gboolean result; - guint8 message[MAX_MESSAGE_LENGTH]; - gsize offset = 0; - SessionType session_type = SESSION_TYPE_LOCAL; - if (strcmp (session, "") == 0) session = NULL; /* Use session type chosen in remote session */ + SessionType session_type = SESSION_TYPE_LOCAL; if (greeter->priv->remote_session) { session_type = SESSION_TYPE_REMOTE; session = greeter->priv->remote_session; } + gboolean result; if (greeter->priv->guest_account_authenticated || session_get_is_authenticated (greeter->priv->authentication_session)) { if (session) @@ -727,6 +695,8 @@ handle_start_session (Greeter *greeter, const gchar *session) result = FALSE; } + guint8 message[MAX_MESSAGE_LENGTH]; + gsize offset = 0; write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_SESSION_RESULT, int_length (), &offset); write_int (message, MAX_MESSAGE_LENGTH, result ? 0 : 1, &offset); write_message (greeter, message, offset); @@ -735,8 +705,6 @@ handle_start_session (Greeter *greeter, const gchar *session) static void handle_set_language (Greeter *greeter, const gchar *language) { - User *user; - if (!greeter->priv->guest_account_authenticated && !session_get_is_authenticated (greeter->priv->authentication_session)) { g_debug ("Ignoring set language request, user is not authorized"); @@ -751,21 +719,19 @@ handle_set_language (Greeter *greeter, const gchar *language) } g_debug ("Greeter sets language %s", language); - user = session_get_user (greeter->priv->authentication_session); + User *user = session_get_user (greeter->priv->authentication_session); user_set_language (user, language); } static void handle_ensure_shared_dir (Greeter *greeter, const gchar *username) { - g_autofree gchar *dir = NULL; - guint8 message[MAX_MESSAGE_LENGTH]; - gsize offset = 0; - g_debug ("Greeter requests data directory for user %s", username); - dir = shared_data_manager_ensure_user_dir (shared_data_manager_get_instance (), username); + g_autofree gchar *dir = shared_data_manager_ensure_user_dir (shared_data_manager_get_instance (), username); + guint8 message[MAX_MESSAGE_LENGTH]; + gsize offset = 0; write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_SHARED_DIR_RESULT, string_length (dir), &offset); write_string (message, MAX_MESSAGE_LENGTH, dir, &offset); write_message (greeter, message, offset); @@ -774,15 +740,13 @@ handle_ensure_shared_dir (Greeter *greeter, const gchar *username) static guint32 read_int (Greeter *greeter, gsize *offset) { - guint32 value; - guint8 *buffer; if (greeter->priv->n_read - *offset < sizeof (guint32)) { g_warning ("Not enough space for int, need %zu, got %zu", sizeof (guint32), greeter->priv->n_read - *offset); return 0; } - buffer = greeter->priv->read_buffer + *offset; - value = buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3]; + guint8 *buffer = greeter->priv->read_buffer + *offset; + guint32 value = buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3]; *offset += int_length (); return value; } @@ -808,17 +772,14 @@ get_message_length (Greeter *greeter) static gchar * read_string_full (Greeter *greeter, gsize *offset, void* (*alloc_fn)(size_t n)) { - guint32 length; - gchar *value; - - length = read_int (greeter, offset); + guint32 length = read_int (greeter, offset); if (greeter->priv->n_read - *offset < length) { g_warning ("Not enough space for string, need %u, got %zu", length, greeter->priv->n_read - *offset); return g_strdup (""); } - value = (*alloc_fn) (sizeof (gchar) * (length + 1)); + gchar *value = (*alloc_fn) (sizeof (gchar) * (length + 1)); memcpy (value, greeter->priv->read_buffer + *offset, length); value[length] = '\0'; *offset += length; @@ -845,18 +806,6 @@ static gboolean read_cb (GIOChannel *source, GIOCondition condition, gpointer data) { Greeter *greeter = data; - gsize n_to_read, n_read, offset; - GIOStatus status; - int id, length, i; - guint32 sequence_number, n_secrets, max_secrets; - g_autofree gchar *version = NULL; - g_autofree gchar *username = NULL; - g_autofree gchar *session_name = NULL; - g_autofree gchar *language = NULL; - gchar **secrets; - gboolean resettable = FALSE; - guint32 api_version = 0; - g_autoptr(GError) error = NULL; if (condition == G_IO_HUP) { @@ -866,7 +815,7 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) return FALSE; } - n_to_read = HEADER_SIZE; + gsize n_to_read = HEADER_SIZE; if (greeter->priv->n_read >= HEADER_SIZE) { n_to_read = get_message_length (greeter); @@ -877,11 +826,13 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) } } - 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, - &n_read, - &error); + 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, + &n_read, + &error); if (error) g_warning ("Error reading from greeter: %s", error->message); if (status == G_IO_STATUS_EOF) @@ -910,64 +861,83 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) } } - offset = 0; - id = read_int (greeter, &offset); - length = HEADER_SIZE + read_int (greeter, &offset); + gsize offset = 0; + int id = read_int (greeter, &offset); + int length = HEADER_SIZE + read_int (greeter, &offset); switch (id) { case GREETER_MESSAGE_CONNECT: - version = read_string (greeter, &offset); - if (offset < length) - resettable = read_int (greeter, &offset) != 0; - if (offset < length) - api_version = read_int (greeter, &offset); - handle_connect (greeter, version, resettable, api_version); + { + g_autofree gchar *version = read_string (greeter, &offset); + gboolean resettable = FALSE; + if (offset < length) + resettable = read_int (greeter, &offset) != 0; + guint32 api_version = 0; + if (offset < length) + api_version = read_int (greeter, &offset); + handle_connect (greeter, version, resettable, api_version); + } break; case GREETER_MESSAGE_AUTHENTICATE: - sequence_number = read_int (greeter, &offset); - username = read_string (greeter, &offset); - handle_authenticate (greeter, sequence_number, username); + { + guint32 sequence_number = read_int (greeter, &offset); + g_autofree gchar *username = read_string (greeter, &offset); + handle_authenticate (greeter, sequence_number, username); + } break; case GREETER_MESSAGE_AUTHENTICATE_AS_GUEST: - sequence_number = read_int (greeter, &offset); - handle_authenticate_as_guest (greeter, sequence_number); + { + guint32 sequence_number = read_int (greeter, &offset); + handle_authenticate_as_guest (greeter, sequence_number); + } break; case GREETER_MESSAGE_AUTHENTICATE_REMOTE: - sequence_number = read_int (greeter, &offset); - session_name = read_string (greeter, &offset); - username = read_string (greeter, &offset); - handle_authenticate_remote (greeter, session_name, username, sequence_number); + { + guint32 sequence_number = read_int (greeter, &offset); + g_autofree gchar *session_name = read_string (greeter, &offset); + g_autofree gchar *username = read_string (greeter, &offset); + handle_authenticate_remote (greeter, session_name, username, sequence_number); + } break; case GREETER_MESSAGE_CONTINUE_AUTHENTICATION: - n_secrets = read_int (greeter, &offset); - max_secrets = (G_MAXUINT32 - 1) / sizeof (gchar *); - if (n_secrets > max_secrets) { - g_warning ("Array length of %u elements too long", n_secrets); - greeter->priv->from_greeter_watch = 0; - return FALSE; + guint32 n_secrets = read_int (greeter, &offset); + guint32 max_secrets = (G_MAXUINT32 - 1) / sizeof (gchar *); + if (n_secrets > max_secrets) + { + g_warning ("Array length of %u elements too long", n_secrets); + greeter->priv->from_greeter_watch = 0; + return FALSE; + } + gchar **secrets = g_malloc (sizeof (gchar *) * (n_secrets + 1)); + guint32 i; + for (i = 0; i < n_secrets; i++) + secrets[i] = read_secret (greeter, &offset); + secrets[i] = NULL; + handle_continue_authentication (greeter, secrets); + secure_freev (greeter, secrets); } - secrets = g_malloc (sizeof (gchar *) * (n_secrets + 1)); - for (i = 0; i < n_secrets; i++) - secrets[i] = read_secret (greeter, &offset); - secrets[i] = NULL; - handle_continue_authentication (greeter, secrets); - secure_freev (greeter, secrets); break; case GREETER_MESSAGE_CANCEL_AUTHENTICATION: handle_cancel_authentication (greeter); break; case GREETER_MESSAGE_START_SESSION: - session_name = read_string (greeter, &offset); - handle_start_session (greeter, session_name); + { + g_autofree gchar *session_name = read_string (greeter, &offset); + handle_start_session (greeter, session_name); + } break; case GREETER_MESSAGE_SET_LANGUAGE: - language = read_string (greeter, &offset); - handle_set_language (greeter, language); + { + g_autofree gchar *language = read_string (greeter, &offset); + handle_set_language (greeter, language); + } break; case GREETER_MESSAGE_ENSURE_SHARED_DIR: - username = read_string (greeter, &offset); - handle_ensure_shared_dir (greeter, username); + { + g_autofree gchar *username = read_string (greeter, &offset); + handle_ensure_shared_dir (greeter, username); + } break; default: g_warning ("Unknown message from greeter: %d", id); @@ -989,11 +959,9 @@ greeter_get_guest_authenticated (Greeter *greeter) Session * greeter_take_authentication_session (Greeter *greeter) { - Session *session; - g_return_val_if_fail (greeter != NULL, NULL); - session = greeter->priv->authentication_session; + 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; diff --git a/src/greeter.h b/src/greeter.h index a8ba6c7c..5cba26ef 100644 --- a/src/greeter.h +++ b/src/greeter.h @@ -49,6 +49,8 @@ typedef struct gboolean (*start_session)(Greeter *greeter, SessionType type, const gchar *session); } GreeterClass; +G_DEFINE_AUTOPTR_CLEANUP_FUNC (Greeter, g_object_unref) + GType greeter_get_type (void); Greeter *greeter_new (void); diff --git a/src/guest-account.c b/src/guest-account.c index 1011ec6a..8cef4d42 100644 --- a/src/guest-account.c +++ b/src/guest-account.c @@ -18,13 +18,12 @@ static gchar * get_setup_script (void) { - g_autofree gchar *script = NULL; static gchar *setup_script = NULL; if (setup_script) return setup_script; - script = config_get_string (config_get_instance (), "LightDM", "guest-account-script"); + g_autofree gchar *script = config_get_string (config_get_instance (), "LightDM", "guest-account-script"); if (!script) return NULL; @@ -44,15 +43,13 @@ run_script (const gchar *script, gchar **stdout_text, gint *exit_status, GError { gint argc; g_auto(GStrv) argv = NULL; - gboolean result; - if (!g_shell_parse_argv (script, &argc, &argv, error)) return FALSE; - result = g_spawn_sync (NULL, argv, NULL, - G_SPAWN_SEARCH_PATH, - NULL, NULL, - stdout_text, NULL, exit_status, error); + gboolean result = g_spawn_sync (NULL, argv, NULL, + G_SPAWN_SEARCH_PATH, + NULL, NULL, + stdout_text, NULL, exit_status, error); return result; } @@ -60,17 +57,12 @@ run_script (const gchar *script, gchar **stdout_text, gint *exit_status, GError gchar * guest_account_setup (void) { - g_autofree gchar *command = NULL; + g_autofree gchar *command = g_strdup_printf ("%s add", get_setup_script ()); + g_debug ("Opening guest account with command '%s'", command); g_autofree gchar *stdout_text = NULL; - g_autofree gchar *username = NULL; - g_auto(GStrv) lines = NULL; gint exit_status; - gboolean result; g_autoptr(GError) error = NULL; - - command = g_strdup_printf ("%s add", get_setup_script ()); - g_debug ("Opening guest account with command '%s'", command); - result = run_script (command, &stdout_text, &exit_status, &error); + gboolean result = run_script (command, &stdout_text, &exit_status, &error); if (error) g_warning ("Error running guest account setup script '%s': %s", get_setup_script (), error->message); if (!result) @@ -83,7 +75,8 @@ guest_account_setup (void) } /* Use the last line and trim whitespace */ - lines = g_strsplit (g_strstrip (stdout_text), "\n", -1); + g_auto(GStrv) lines = g_strsplit (g_strstrip (stdout_text), "\n", -1); + g_autofree gchar *username = NULL; if (lines) username = g_strdup (g_strstrip (lines[g_strv_length (lines) - 1])); else @@ -103,15 +96,12 @@ guest_account_setup (void) void guest_account_cleanup (const gchar *username) { - g_autofree gchar *command = NULL; - gboolean result; - gint exit_status; - g_autoptr(GError) error = NULL; - - command = g_strdup_printf ("%s remove %s", get_setup_script (), username); + g_autofree gchar *command = g_strdup_printf ("%s remove %s", get_setup_script (), username); g_debug ("Closing guest account %s with command '%s'", username, command); - result = run_script (command, NULL, &exit_status, &error); + gint exit_status; + g_autoptr(GError) error = NULL; + gboolean result = run_script (command, NULL, &exit_status, &error); if (error) g_warning ("Error running guest account cleanup script '%s': %s", get_setup_script (), error->message); diff --git a/src/lightdm.c b/src/lightdm.c index ac46ab3f..c54f1bab 100644 --- a/src/lightdm.c +++ b/src/lightdm.c @@ -56,8 +56,6 @@ static void log_cb (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer data) { const gchar *prefix; - g_autofree gchar *text = NULL; - switch (log_level & G_LOG_LEVEL_MASK) { case G_LOG_LEVEL_ERROR: @@ -83,13 +81,12 @@ log_cb (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, break; } - text = g_strdup_printf ("[%+.2fs] %s %s\n", g_timer_elapsed (log_timer, NULL), prefix, message); + g_autofree gchar *text = g_strdup_printf ("[%+.2fs] %s %s\n", g_timer_elapsed (log_timer, NULL), prefix, message); /* Log everything to a file */ if (log_fd >= 0) { - ssize_t n_written; - n_written = write (log_fd, text, strlen (text)); + ssize_t n_written = write (log_fd, text, strlen (text)); if (n_written < 0) ; /* Check result so compiler doesn't warn about it */ } @@ -104,17 +101,13 @@ log_cb (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, static void log_init (void) { - g_autofree gchar *log_dir = NULL; - g_autofree gchar *path = NULL; - gboolean backup_logs; - log_timer = g_timer_new (); /* Log to a file */ - log_dir = config_get_string (config_get_instance (), "LightDM", "log-directory"); - path = g_build_filename (log_dir, "lightdm.log", NULL); + g_autofree gchar *log_dir = config_get_string (config_get_instance (), "LightDM", "log-directory"); + g_autofree gchar *path = g_build_filename (log_dir, "lightdm.log", NULL); - backup_logs = config_get_boolean (config_get_instance (), "LightDM", "backup-logs"); + gboolean backup_logs = config_get_boolean (config_get_instance (), "LightDM", "backup-logs"); log_fd = log_file_open (path, backup_logs ? LOG_MODE_BACKUP_AND_TRUNCATE : LOG_MODE_APPEND); fcntl (log_fd, F_SETFD, FD_CLOEXEC); g_log_set_default_handler (log_cb, NULL); @@ -125,15 +118,11 @@ log_init (void) static GList* get_config_sections (const gchar *seat_name) { - g_auto(GStrv) groups = NULL; - gchar **i; - GList *config_sections = NULL; - /* Load seat defaults first */ - config_sections = g_list_append (config_sections, g_strdup ("Seat:*")); + GList *config_sections = g_list_append (NULL, g_strdup ("Seat:*")); - groups = config_get_groups (config_get_instance ()); - for (i = groups; *i; i++) + g_auto(GStrv) groups = config_get_groups (config_get_instance ()); + for (gchar **i = groups; *i; i++) { if (g_str_has_prefix (*i, "Seat:") && strcmp (*i, "Seat:*") != 0) { @@ -149,11 +138,8 @@ get_config_sections (const gchar *seat_name) static void set_seat_properties (Seat *seat, const gchar *seat_name) { - GList *sections, *link; - gint i; - - sections = get_config_sections (seat_name); - for (link = sections; link; link = link->next) + GList *sections = get_config_sections (seat_name); + for (GList *link = sections; link; link = link->next) { const gchar *section = link->data; g_auto(GStrv) keys = NULL; @@ -161,7 +147,7 @@ set_seat_properties (Seat *seat, const gchar *seat_name) keys = config_get_keys (config_get_instance (), section); l_debug (seat, "Loading properties from config section %s", section); - for (i = 0; keys && keys[i]; i++) + for (gint i = 0; keys && keys[i]; i++) { g_autofree gchar *value = config_get_string (config_get_instance (), section, keys[i]); seat_set_property (seat, keys[i], value); @@ -198,14 +184,12 @@ display_manager_stopped_cb (DisplayManager *display_manager) static Seat * create_seat (const gchar *module_name, const gchar *name) { - Seat *seat; - if (strcmp (module_name, "xlocal") == 0) { g_warning ("Seat type 'xlocal' is deprecated, use 'type=local' instead"); module_name = "local"; } - seat = seat_new (module_name); + Seat *seat = seat_new (module_name); if (!seat) return NULL; @@ -216,17 +200,14 @@ create_seat (const gchar *module_name, const gchar *name) static Seat * service_add_xlocal_seat_cb (DisplayManagerService *service, gint display_number) { - g_autoptr(Seat) seat = NULL; - g_autofree gchar *display_number_string = NULL; - g_debug ("Adding local X seat :%d", display_number); - seat = create_seat ("xremote", "xremote0"); // FIXME: What to use for a name? + g_autoptr(Seat) seat = create_seat ("xremote", "xremote0"); // FIXME: What to use for a name? if (!seat) return NULL; set_seat_properties (seat, NULL); - display_number_string = g_strdup_printf ("%d", display_number); + g_autofree gchar *display_number_string = g_strdup_printf ("%d", display_number); seat_set_property (seat, "xserver-display-number", display_number_string); if (!display_manager_add_seat (display_manager, seat)) @@ -238,16 +219,12 @@ service_add_xlocal_seat_cb (DisplayManagerService *service, gint display_number) static void display_manager_seat_removed_cb (DisplayManager *display_manager, Seat *seat) { - g_auto(GStrv) types = NULL; - gchar **iter; - g_autoptr(Seat) next_seat = NULL; - g_autoptr(GString) next_types = NULL; - /* If we have fallback types registered for the seat, let's try them before giving up. */ - types = seat_get_string_list_property (seat, "type"); - next_types = g_string_new (""); - for (iter = types; iter && *iter; iter++) + g_auto(GStrv) types = seat_get_string_list_property (seat, "type"); + g_autoptr(GString) next_types = g_string_new (""); + g_autoptr(Seat) next_seat = NULL; + for (gchar **iter = types; iter && *iter; iter++) { if (iter == types) continue; // skip first one, that is our current seat type @@ -288,12 +265,9 @@ display_manager_seat_removed_cb (DisplayManager *display_manager, Seat *seat) static gboolean xdmcp_session_cb (XDMCPServer *server, XDMCPSession *session) { - g_autoptr(SeatXDMCPSession) seat = NULL; - g_autofree gchar *name = NULL; - - seat = seat_xdmcp_session_new (session); + g_autoptr(SeatXDMCPSession) seat = seat_xdmcp_session_new (session); - name = g_strdup_printf ("xdmcp%d", xdmcp_client_count); + g_autofree gchar *name = g_strdup_printf ("xdmcp%d", xdmcp_client_count); xdmcp_client_count++; seat_set_name (SEAT (seat), name); @@ -304,12 +278,9 @@ xdmcp_session_cb (XDMCPServer *server, XDMCPSession *session) static void vnc_connection_cb (VNCServer *server, GSocket *connection) { - g_autoptr(SeatXVNC) seat = NULL; - g_autofree gchar *name = NULL; + g_autoptr(SeatXVNC) seat = seat_xvnc_new (connection); - seat = seat_xvnc_new (connection); - - name = g_strdup_printf ("vnc%d", vnc_client_count); + g_autofree gchar *name = g_strdup_printf ("vnc%d", vnc_client_count); vnc_client_count++; seat_set_name (SEAT (seat), name); @@ -325,11 +296,6 @@ start_display_manager (void) /* Start the XDMCP server */ if (config_get_boolean (config_get_instance (), "XDMCPServer", "enabled")) { - g_autofree gchar *hostname = NULL; - g_autofree gchar *key_name = NULL; - g_autofree gchar *key = NULL; - g_autofree gchar *listen_address = NULL; - xdmcp_server = xdmcp_server_new (); if (config_has_key (config_get_instance (), "XDMCPServer", "port")) { @@ -338,24 +304,21 @@ start_display_manager (void) if (port > 0) xdmcp_server_set_port (xdmcp_server, port); } - listen_address = config_get_string (config_get_instance (), "XDMCPServer", "listen-address"); + g_autofree gchar *listen_address = config_get_string (config_get_instance (), "XDMCPServer", "listen-address"); xdmcp_server_set_listen_address (xdmcp_server, listen_address); - hostname = config_get_string (config_get_instance (), "XDMCPServer", "hostname"); + g_autofree gchar *hostname = config_get_string (config_get_instance (), "XDMCPServer", "hostname"); xdmcp_server_set_hostname (xdmcp_server, hostname); g_signal_connect (xdmcp_server, XDMCP_SERVER_SIGNAL_NEW_SESSION, G_CALLBACK (xdmcp_session_cb), NULL); - key_name = config_get_string (config_get_instance (), "XDMCPServer", "key"); + g_autofree gchar *key_name = config_get_string (config_get_instance (), "XDMCPServer", "key"); + g_autofree gchar *key = NULL; if (key_name) { - g_autofree gchar *path = NULL; - g_autoptr(GKeyFile) keys = NULL; - gboolean result; - g_autoptr(GError) error = NULL; - - path = g_build_filename (config_get_directory (config_get_instance ()), "keys.conf", NULL); + g_autofree gchar *path = g_build_filename (config_get_directory (config_get_instance ()), "keys.conf", NULL); - keys = g_key_file_new (); - result = g_key_file_load_from_file (keys, path, G_KEY_FILE_NONE, &error); + g_autoptr(GKeyFile) keys = g_key_file_new (); + g_autoptr(GError) error = NULL; + gboolean result = g_key_file_load_from_file (keys, path, G_KEY_FILE_NONE, &error); if (error) g_warning ("Unable to load keys from %s: %s", path, error->message); @@ -369,7 +332,7 @@ start_display_manager (void) } if (key) xdmcp_server_set_key (xdmcp_server, key); - + if (key_name && !key) { exit_code = EXIT_FAILURE; @@ -386,22 +349,17 @@ start_display_manager (void) /* Start the VNC server */ if (config_get_boolean (config_get_instance (), "VNCServer", "enabled")) { - g_autofree gchar *path = NULL; - - path = g_find_program_in_path ("Xvnc"); + g_autofree gchar *path = g_find_program_in_path ("Xvnc"); if (path) { - g_autofree gchar *listen_address = NULL; - vnc_server = vnc_server_new (); if (config_has_key (config_get_instance (), "VNCServer", "port")) { - gint port; - port = config_get_integer (config_get_instance (), "VNCServer", "port"); + gint port = config_get_integer (config_get_instance (), "VNCServer", "port"); if (port > 0) vnc_server_set_port (vnc_server, port); } - listen_address = config_get_string (config_get_instance (), "VNCServer", "listen-address"); + g_autofree gchar *listen_address = config_get_string (config_get_instance (), "VNCServer", "listen-address"); vnc_server_set_listen_address (vnc_server, listen_address); g_signal_connect (vnc_server, VNC_SERVER_SIGNAL_NEW_CONNECTION, G_CALLBACK (vnc_connection_cb), NULL); @@ -428,17 +386,12 @@ static gboolean add_login1_seat (Login1Seat *login1_seat) { const gchar *seat_name = login1_seat_get_id (login1_seat); - g_auto(GStrv) types = NULL; - gchar **type; - GList *config_sections = NULL, *link; - g_autoptr(Seat) seat = NULL; - gboolean is_seat0, started = FALSE; - g_debug ("New seat added from logind: %s", seat_name); - is_seat0 = strcmp (seat_name, "seat0") == 0; + gboolean is_seat0 = strcmp (seat_name, "seat0") == 0; - config_sections = get_config_sections (seat_name); - for (link = g_list_last (config_sections); link; link = link->prev) + GList *config_sections = get_config_sections (seat_name); + g_auto(GStrv) types = NULL; + for (GList *link = g_list_last (config_sections); link; link = link->prev) { gchar *config_section = link->data; types = config_get_string_list (config_get_instance (), config_section, "type"); @@ -447,7 +400,8 @@ add_login1_seat (Login1Seat *login1_seat) } g_list_free_full (config_sections, g_free); - for (type = types; !seat && type && *type; type++) + g_autoptr(Seat) seat = NULL; + for (gchar **type = types; !seat && type && *type; type++) seat = create_seat (*type, seat_name); if (seat) @@ -470,7 +424,7 @@ add_login1_seat (Login1Seat *login1_seat) return FALSE; } - started = display_manager_add_seat (display_manager, seat); + gboolean started = display_manager_add_seat (display_manager, seat); if (!started) g_debug ("Failed to start seat: %s", seat_name); @@ -480,9 +434,7 @@ add_login1_seat (Login1Seat *login1_seat) static void remove_login1_seat (Login1Seat *login1_seat) { - Seat *seat; - - seat = display_manager_get_seat (display_manager, login1_seat_get_id (login1_seat)); + Seat *seat = display_manager_get_seat (display_manager, login1_seat_get_id (login1_seat)); if (seat) seat_stop (seat); } @@ -500,10 +452,8 @@ update_login1_seat (Login1Seat *login1_seat) if (!config_get_boolean (config_get_instance (), "LightDM", "logind-check-graphical") || login1_seat_get_can_graphical (login1_seat)) { - Seat *seat; - /* Wait for existing seat to stop or ignore if we already have a valid seat */ - seat = display_manager_get_seat (display_manager, login1_seat_get_id (login1_seat)); + Seat *seat = display_manager_get_seat (display_manager, login1_seat_get_id (login1_seat)); if (seat) { if (seat_get_is_stopping (seat)) @@ -532,14 +482,10 @@ login1_active_session_changed_cb (Login1Seat *login1_seat, const gchar *login1_s { g_debug ("Seat %s changes active session to %s", login1_seat_get_id (login1_seat), login1_session_id); - Seat *seat; - seat = display_manager_get_seat (display_manager, login1_seat_get_id (login1_seat)); - + Seat *seat = display_manager_get_seat (display_manager, login1_seat_get_id (login1_seat)); if (seat) { - Session *active_session; - - active_session = seat_get_expected_active_session (seat); + Session *active_session = seat_get_expected_active_session (seat); if (active_session != NULL && g_strcmp0 (login1_session_id, session_get_login1_session_id (active_session)) == 0) { @@ -593,21 +539,39 @@ login1_service_seat_removed_cb (Login1Service *service, Login1Seat *login1_seat) int main (int argc, char **argv) { + /* Disable the SIGPIPE handler - this is a stupid Unix hangover behaviour. + * We will handle pipes / sockets being closed instead of having the whole daemon be killed... + * http://stackoverflow.com/questions/8369506/why-does-sigpipe-exist + * Similar case for SIGHUP. + */ struct sigaction action; - FILE *pid_file; - GOptionContext *option_context; - gboolean result; - gchar *dir; + action.sa_handler = SIG_IGN; + sigemptyset (&action.sa_mask); + action.sa_flags = SA_RESTART; + sigaction (SIGPIPE, &action, NULL); + sigaction (SIGHUP, &action, NULL); + + /* When lightdm starts sessions it needs to run itself in a new mode */ + if (argc >= 2 && strcmp (argv[1], "--session-child") == 0) + return session_child_run (argc, argv); + +#if !defined(GLIB_VERSION_2_36) + g_type_init (); +#endif + loop = g_main_loop_new (NULL, FALSE); + + GList *messages = g_list_append (NULL, g_strdup_printf ("Starting Light Display Manager %s, UID=%i PID=%i", VERSION, getuid (), getpid ())); + + g_signal_connect (process_get_current (), PROCESS_SIGNAL_GOT_SIGNAL, G_CALLBACK (signal_cb), NULL); + + g_autoptr(GOptionContext) option_context = g_option_context_new (/* Arguments and description for --help test */ + _("- Display Manager")); gboolean test_mode = FALSE; gchar *pid_path = "/var/run/lightdm.pid"; gchar *log_dir = NULL; gchar *run_dir = NULL; gchar *cache_dir = NULL; - gchar *default_log_dir = g_strdup (LOG_DIR); - gchar *default_run_dir = g_strdup (RUN_DIR); - gchar *default_cache_dir = g_strdup (CACHE_DIR); gboolean show_config = FALSE, show_version = FALSE; - GList *link, *messages = NULL; GOptionEntry options[] = { { "config", 'c', 0, G_OPTION_ARG_STRING, &config_path, @@ -639,39 +603,11 @@ main (int argc, char **argv) N_("Show release version"), NULL }, { NULL } }; - g_autoptr(GError) error = NULL; - - /* Disable the SIGPIPE handler - this is a stupid Unix hangover behaviour. - * We will handle pipes / sockets being closed instead of having the whole daemon be killed... - * http://stackoverflow.com/questions/8369506/why-does-sigpipe-exist - * Similar case for SIGHUP. - */ - action.sa_handler = SIG_IGN; - sigemptyset (&action.sa_mask); - action.sa_flags = SA_RESTART; - sigaction (SIGPIPE, &action, NULL); - sigaction (SIGHUP, &action, NULL); - - /* When lightdm starts sessions it needs to run itself in a new mode */ - if (argc >= 2 && strcmp (argv[1], "--session-child") == 0) - return session_child_run (argc, argv); - -#if !defined(GLIB_VERSION_2_36) - g_type_init (); -#endif - loop = g_main_loop_new (NULL, FALSE); - - messages = g_list_append (messages, g_strdup_printf ("Starting Light Display Manager %s, UID=%i PID=%i", VERSION, getuid (), getpid ())); - - g_signal_connect (process_get_current (), PROCESS_SIGNAL_GOT_SIGNAL, G_CALLBACK (signal_cb), NULL); - - option_context = g_option_context_new (/* Arguments and description for --help test */ - _("- Display Manager")); g_option_context_add_main_entries (option_context, options, GETTEXT_PACKAGE); - result = g_option_context_parse (option_context, &argc, &argv, &error); + g_autoptr(GError) error = NULL; + gboolean result = g_option_context_parse (option_context, &argc, &argv, &error); if (error) g_printerr ("%s\n", error->message); - g_option_context_free (option_context); if (!result) { g_printerr (/* Text printed out when an unknown command-line argument provided */ @@ -683,24 +619,18 @@ main (int argc, char **argv) /* Show combined configuration if user requested it */ if (show_config) { - GList *sources, *link; - g_auto(GStrv) groups = NULL; - gchar *last_source, *empty_source; - GHashTable *source_ids; - int i; - if (!config_load_from_standard_locations (config_get_instance (), config_path, NULL)) return EXIT_FAILURE; /* Number sources */ - sources = config_get_sources (config_get_instance ()); - source_ids = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - last_source = ""; - for (i = 0, link = sources; link; i++, link = link->next) + GList *sources = config_get_sources (config_get_instance ()); + g_autoptr(GHashTable) source_ids = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + const gchar *last_source = ""; + int i = 0; + for (GList *link = sources; link; i++, link = link->next) { - gchar *path, *id; - - path = link->data; + const gchar *path = link->data; + gchar *id; if (i < 26) id = g_strdup_printf ("%c", 'A' + i); else @@ -708,23 +638,20 @@ main (int argc, char **argv) g_hash_table_insert (source_ids, g_strdup (path), id); last_source = id; } - empty_source = g_strdup (last_source); + g_autofree gchar *empty_source = g_strdup (last_source); for (i = 0; empty_source[i] != '\0'; i++) empty_source[i] = ' '; /* Print out keys */ - groups = config_get_groups (config_get_instance ()); + g_auto(GStrv) groups = config_get_groups (config_get_instance ()); for (i = 0; groups[i]; i++) { - g_auto(GStrv) keys = NULL; - int j; - if (i != 0) g_printerr ("\n"); g_printerr ("%s [%s]\n", empty_source, groups[i]); - keys = config_get_keys (config_get_instance (), groups[i]); - for (j = 0; keys && keys[j]; j++) + g_auto(GStrv) keys = config_get_keys (config_get_instance (), groups[i]); + for (int j = 0; keys && keys[j]; j++) { const gchar *source, *id; g_autofree gchar *value = NULL; @@ -740,17 +667,13 @@ main (int argc, char **argv) /* Show mapping from source number to path */ g_printerr ("\n"); g_printerr ("Sources:\n"); - for (link = sources; link; link = link->next) + for (GList *link = sources; link; link = link->next) { const gchar *path = link->data; - const gchar *source; - - source = g_hash_table_lookup (source_ids, path); + const gchar *source = g_hash_table_lookup (source_ids, path); g_printerr ("%s %s\n", source, path); } - g_hash_table_destroy (source_ids); - return EXIT_SUCCESS; } @@ -770,9 +693,7 @@ main (int argc, char **argv) /* If running inside an X server use Xephyr for display */ if (getenv ("DISPLAY") && getuid () != 0) { - g_autofree gchar *x_server_path = NULL; - - x_server_path = g_find_program_in_path ("Xephyr"); + g_autofree gchar *x_server_path = g_find_program_in_path ("Xephyr"); if (!x_server_path) { g_printerr ("Running inside an X server requires Xephyr to be installed but it cannot be found. Please install it or update your PATH environment variable.\n"); @@ -785,7 +706,6 @@ main (int argc, char **argv) { const gchar *path = g_getenv ("PATH"); g_autofree gchar *new_path = NULL; - if (path) new_path = g_strdup_printf ("%s:%s", path, SBIN_DIR); else @@ -794,7 +714,7 @@ main (int argc, char **argv) } /* Write PID file */ - pid_file = fopen (pid_path, "w"); + FILE *pid_file = fopen (pid_path, "w"); if (pid_file) { fprintf (pid_file, "%d\n", getpid ()); @@ -802,15 +722,21 @@ main (int argc, char **argv) } /* If not running as root write output to directories we control */ + g_autofree gchar *default_log_dir = NULL; + g_autofree gchar *default_run_dir = NULL; + g_autofree gchar *default_cache_dir = NULL; if (getuid () != 0) { - g_free (default_log_dir); default_log_dir = g_build_filename (g_get_user_cache_dir (), "lightdm", "log", NULL); - g_free (default_run_dir); default_run_dir = g_build_filename (g_get_user_cache_dir (), "lightdm", "run", NULL); - g_free (default_cache_dir); default_cache_dir = g_build_filename (g_get_user_cache_dir (), "lightdm", "cache", NULL); } + else + { + default_log_dir = g_strdup (LOG_DIR); + default_run_dir = g_strdup (RUN_DIR); + default_cache_dir = g_strdup (CACHE_DIR); + } /* Load config file(s) */ if (!config_load_from_standard_locations (config_get_instance (), config_path, &messages)) @@ -866,32 +792,24 @@ main (int argc, char **argv) config_set_string (config_get_instance (), "Seat:*", "session-wrapper", "lightdm-session"); if (!config_has_key (config_get_instance (), "LightDM", "log-directory")) config_set_string (config_get_instance (), "LightDM", "log-directory", default_log_dir); - g_free (default_log_dir); if (!config_has_key (config_get_instance (), "LightDM", "run-directory")) config_set_string (config_get_instance (), "LightDM", "run-directory", default_run_dir); - g_free (default_run_dir); if (!config_has_key (config_get_instance (), "LightDM", "cache-directory")) config_set_string (config_get_instance (), "LightDM", "cache-directory", default_cache_dir); - g_free (default_cache_dir); if (!config_has_key (config_get_instance (), "LightDM", "sessions-directory")) config_set_string (config_get_instance (), "LightDM", "sessions-directory", SESSIONS_DIR); if (!config_has_key (config_get_instance (), "LightDM", "remote-sessions-directory")) config_set_string (config_get_instance (), "LightDM", "remote-sessions-directory", REMOTE_SESSIONS_DIR); if (!config_has_key (config_get_instance (), "LightDM", "greeters-directory")) { - g_autoptr(GPtrArray) dirs = NULL; - const gchar * const *data_dirs; - g_autofree gchar *value = NULL; - int i; - - dirs = g_ptr_array_new_with_free_func (g_free); - data_dirs = g_get_system_data_dirs (); - for (i = 0; data_dirs[i]; i++) + g_autoptr(GPtrArray) dirs = g_ptr_array_new_with_free_func (g_free); + const gchar * const *data_dirs = g_get_system_data_dirs (); + for (int i = 0; data_dirs[i]; i++) g_ptr_array_add (dirs, g_build_filename (data_dirs[i], "lightdm/greeters", NULL)); - for (i = 0; data_dirs[i]; i++) + for (int i = 0; data_dirs[i]; i++) g_ptr_array_add (dirs, g_build_filename (data_dirs[i], "xgreeters", NULL)); g_ptr_array_add (dirs, NULL); - value = g_strjoinv (":", (gchar **) dirs->pdata); + g_autofree gchar *value = g_strjoinv (":", (gchar **) dirs->pdata); config_set_string (config_get_instance (), "LightDM", "greeters-directory", value); } if (!config_has_key (config_get_instance (), "XDMCPServer", "hostname")) @@ -909,23 +827,20 @@ main (int argc, char **argv) g_free (cache_dir); /* Create run and cache directories */ - dir = config_get_string (config_get_instance (), "LightDM", "log-directory"); - if (g_mkdir_with_parents (dir, S_IRWXU | S_IXGRP | S_IXOTH) < 0) - g_warning ("Failed to make log directory %s: %s", dir, strerror (errno)); - g_free (dir); - dir = config_get_string (config_get_instance (), "LightDM", "run-directory"); - if (g_mkdir_with_parents (dir, S_IRWXU | S_IXGRP | S_IXOTH) < 0) - g_warning ("Failed to make run directory %s: %s", dir, strerror (errno)); - g_free (dir); - dir = config_get_string (config_get_instance (), "LightDM", "cache-directory"); - if (g_mkdir_with_parents (dir, S_IRWXU | S_IXGRP | S_IXOTH) < 0) - g_warning ("Failed to make cache directory %s: %s", dir, strerror (errno)); - g_free (dir); + g_autofree gchar *log_dir_path = config_get_string (config_get_instance (), "LightDM", "log-directory"); + if (g_mkdir_with_parents (log_dir_path, S_IRWXU | S_IXGRP | S_IXOTH) < 0) + g_warning ("Failed to make log directory %s: %s", log_dir_path, strerror (errno)); + g_autofree gchar *run_dir_path = config_get_string (config_get_instance (), "LightDM", "run-directory"); + if (g_mkdir_with_parents (run_dir_path, S_IRWXU | S_IXGRP | S_IXOTH) < 0) + g_warning ("Failed to make run directory %s: %s", run_dir_path, strerror (errno)); + g_autofree gchar *cache_dir_path = config_get_string (config_get_instance (), "LightDM", "cache-directory"); + if (g_mkdir_with_parents (cache_dir_path, S_IRWXU | S_IXGRP | S_IXOTH) < 0) + g_warning ("Failed to make cache directory %s: %s", cache_dir_path, strerror (errno)); log_init (); /* Show queued messages once logging is complete */ - for (link = messages; link; link = link->next) + for (GList *link = messages; link; link = link->next) g_debug ("%s", (gchar *)link->data); g_list_free_full (messages, g_free); @@ -962,7 +877,7 @@ main (int argc, char **argv) g_signal_connect (login1_service_get_instance (), LOGIN1_SERVICE_SIGNAL_SEAT_ADDED, G_CALLBACK (login1_service_seat_added_cb), NULL); g_signal_connect (login1_service_get_instance (), LOGIN1_SERVICE_SIGNAL_SEAT_REMOVED, G_CALLBACK (login1_service_seat_removed_cb), NULL); - for (link = login1_service_get_seats (login1_service_get_instance ()); link; link = link->next) + for (GList *link = login1_service_get_seats (login1_service_get_instance ()); link; link = link->next) { Login1Seat *login1_seat = link->data; if (!login1_add_seat (login1_seat)) @@ -974,14 +889,11 @@ main (int argc, char **argv) { if (config_get_boolean (config_get_instance (), "LightDM", "start-default-seat")) { - g_auto(GStrv) types = NULL; - gchar **type; - g_autoptr(Seat) seat = NULL; - g_debug ("Adding default seat"); - types = config_get_string_list (config_get_instance (), "Seat:*", "type"); - for (type = types; type && *type; type++) + g_auto(GStrv) types = config_get_string_list (config_get_instance (), "Seat:*", "type"); + g_autoptr(Seat) seat = NULL; + for (gchar **type = types; type && *type; type++) { seat = create_seat (*type, "seat0"); if (seat) diff --git a/src/log-file.c b/src/log-file.c index edf5ac85..6a04e059 100644 --- a/src/log-file.c +++ b/src/log-file.c @@ -19,8 +19,6 @@ int log_file_open (const gchar *log_filename, LogMode log_mode) { int open_flags = O_WRONLY | O_CREAT; - int log_fd; - if (log_mode == LOG_MODE_BACKUP_AND_TRUNCATE) { /* Move old file out of the way */ @@ -44,7 +42,7 @@ log_file_open (const gchar *log_filename, LogMode log_mode) } /* Open file and log to it */ - log_fd = open (log_filename, open_flags, 0600); + int log_fd = open (log_filename, open_flags, 0600); if (log_fd < 0) g_warning ("Failed to open log file %s: %s", log_filename, g_strerror (errno)); diff --git a/src/logger.c b/src/logger.c index 839882a6..c5eb4a7c 100644 --- a/src/logger.c +++ b/src/logger.c @@ -28,11 +28,8 @@ logger_logv (Logger *self, GLogLevelFlags log_level, const gchar *format, va_lis void logger_logv_default (Logger *self, GLogLevelFlags log_level, const gchar *format, va_list ap) { - va_list ap_copy; - gint tmp; - /* figure out how long the prefix is */ - tmp = logger_logprefix (self, NULL, 0); + gint tmp = logger_logprefix (self, NULL, 0); if (tmp < 0) { g_error ("failed to get log prefix"); @@ -49,6 +46,7 @@ logger_logv_default (Logger *self, GLogLevelFlags log_level, const gchar *format } /* figure out how long the formatted message is */ + va_list ap_copy; va_copy (ap_copy, ap); tmp = g_vsnprintf (NULL, 0, format, ap_copy); va_end (ap_copy); diff --git a/src/login1.c b/src/login1.c index ef690cec..d00031e4 100644 --- a/src/login1.c +++ b/src/login1.c @@ -110,31 +110,31 @@ seat_properties_changed_cb (GDBusConnection *connection, gpointer user_data) { Login1Seat *seat = user_data; + GVariantIter *iter; GVariantIter *invalidated_properties; + g_variant_get (parameters, "(sa{sv}as)", NULL, &iter, &invalidated_properties); + const gchar *name; GVariant *value; - - g_variant_get (parameters, "(sa{sv}as)", NULL, &iter, &invalidated_properties); while (g_variant_iter_loop (iter, "{&sv}", &name, &value)) update_property (seat, name, value); g_variant_iter_free (iter); + while (g_variant_iter_loop (invalidated_properties, "&s", &name)) { - g_autoptr(GVariant) result = NULL; g_autoptr(GError) error = NULL; - - result = g_dbus_connection_call_sync (connection, - LOGIN1_SERVICE_NAME, - seat->priv->path, - "org.freedesktop.DBus.Properties", - "Get", - g_variant_new ("(ss)", "org.freedesktop.login1.Seat", name), - G_VARIANT_TYPE ("(v)"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); + g_autoptr(GVariant) result = g_dbus_connection_call_sync (connection, + LOGIN1_SERVICE_NAME, + seat->priv->path, + "org.freedesktop.DBus.Properties", + "Get", + g_variant_new ("(ss)", "org.freedesktop.login1.Seat", name), + G_VARIANT_TYPE ("(v)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); if (error) g_warning ("Error updating seat property %s: %s", name, error->message); if (result) @@ -150,11 +150,7 @@ seat_properties_changed_cb (GDBusConnection *connection, static Login1Seat * add_seat (Login1Service *service, const gchar *id, const gchar *path) { - Login1Seat *seat; - g_autoptr(GVariant) result = NULL; - g_autoptr(GError) error = NULL; - - seat = g_object_new (LOGIN1_SEAT_TYPE, NULL); + 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); @@ -171,26 +167,27 @@ add_seat (Login1Service *service, const gchar *id, const gchar *path) g_object_unref); /* Get properties for this seat */ - result = g_dbus_connection_call_sync (seat->priv->connection, - LOGIN1_SERVICE_NAME, - path, - "org.freedesktop.DBus.Properties", - "GetAll", - g_variant_new ("(s)", "org.freedesktop.login1.Seat"), - G_VARIANT_TYPE ("(a{sv})"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); + g_autoptr(GError) error = NULL; + g_autoptr(GVariant) result = g_dbus_connection_call_sync (seat->priv->connection, + LOGIN1_SERVICE_NAME, + path, + "org.freedesktop.DBus.Properties", + "GetAll", + g_variant_new ("(s)", "org.freedesktop.login1.Seat"), + G_VARIANT_TYPE ("(a{sv})"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); if (error) g_warning ("Failed to get seat properties: %s", error->message); if (result) { GVariantIter *properties; + g_variant_get (result, "(a{sv})", &properties); + const gchar *name; GVariant *value; - - g_variant_get (result, "(a{sv})", &properties); while (g_variant_iter_loop (properties, "{&sv}", &name, &value)) { if (strcmp (name, "CanGraphical") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN)) @@ -220,10 +217,9 @@ signal_cb (GDBusConnection *connection, if (strcmp (signal_name, "SeatNew") == 0) { const gchar *id, *path; - Login1Seat *seat; - g_variant_get (parameters, "(&s&o)", &id, &path); - seat = login1_service_get_seat (service, id); + + Login1Seat *seat = login1_service_get_seat (service, id); if (!seat) { seat = add_seat (service, id, path); @@ -233,10 +229,9 @@ signal_cb (GDBusConnection *connection, else if (strcmp (signal_name, "SeatRemoved") == 0) { const gchar *id, *path; - g_autoptr(Login1Seat) seat = NULL; - g_variant_get (parameters, "(&s&o)", &id, &path); - seat = login1_service_get_seat (service, id); + + g_autoptr(Login1Seat) seat = login1_service_get_seat (service, id); if (seat) { service->priv->seats = g_list_remove (service->priv->seats, seat); @@ -248,16 +243,12 @@ signal_cb (GDBusConnection *connection, gboolean login1_service_connect (Login1Service *service) { - g_autoptr(GVariant) result = NULL; - GVariantIter *seat_iter; - const gchar *id, *path; - g_autoptr(GError) error = NULL; - g_return_val_if_fail (service != NULL, FALSE); if (service->priv->connected) return TRUE; + g_autoptr(GError) error = NULL; service->priv->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (error) g_warning ("Failed to get system bus: %s", error->message); @@ -275,23 +266,26 @@ login1_service_connect (Login1Service *service) g_object_ref (service), g_object_unref); - result = g_dbus_connection_call_sync (service->priv->connection, - LOGIN1_SERVICE_NAME, - LOGIN1_OBJECT_NAME, - LOGIN1_MANAGER_INTERFACE_NAME, - "ListSeats", - g_variant_new ("()"), - G_VARIANT_TYPE ("(a(so))"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); + g_autoptr(GVariant) result = g_dbus_connection_call_sync (service->priv->connection, + LOGIN1_SERVICE_NAME, + LOGIN1_OBJECT_NAME, + LOGIN1_MANAGER_INTERFACE_NAME, + "ListSeats", + g_variant_new ("()"), + G_VARIANT_TYPE ("(a(so))"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); if (error) g_warning ("Failed to get list of logind seats: %s", error->message); if (!result) return FALSE; + GVariantIter *seat_iter; g_variant_get (result, "(a(so))", &seat_iter); + + const gchar *id, *path; while (g_variant_iter_loop (seat_iter, "(&s&o)", &id, &path)) add_seat (service, id, path); g_variant_iter_free (seat_iter); @@ -318,11 +312,9 @@ login1_service_get_seats (Login1Service *service) Login1Seat * login1_service_get_seat (Login1Service *service, const gchar *id) { - GList *link; - g_return_val_if_fail (service != NULL, NULL); - for (link = service->priv->seats; link; link = link->next) + for (GList *link = service->priv->seats; link; link = link->next) { Login1Seat *seat = link->data; if (strcmp (seat->priv->id, id) == 0) @@ -335,9 +327,6 @@ login1_service_get_seat (Login1Service *service, const gchar *id) void login1_service_lock_session (Login1Service *service, const gchar *session_id) { - g_autoptr(GVariant) result = NULL; - g_autoptr(GError) error = NULL; - g_return_if_fail (service != NULL); g_return_if_fail (session_id != NULL); @@ -346,17 +335,18 @@ login1_service_lock_session (Login1Service *service, const gchar *session_id) if (!session_id) return; - result = g_dbus_connection_call_sync (service->priv->connection, - LOGIN1_SERVICE_NAME, - LOGIN1_OBJECT_NAME, - LOGIN1_MANAGER_INTERFACE_NAME, - "LockSession", - g_variant_new ("(s)", session_id), - G_VARIANT_TYPE ("()"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); + g_autoptr(GError) error = NULL; + g_autoptr(GVariant) result = g_dbus_connection_call_sync (service->priv->connection, + LOGIN1_SERVICE_NAME, + LOGIN1_OBJECT_NAME, + LOGIN1_MANAGER_INTERFACE_NAME, + "LockSession", + g_variant_new ("(s)", session_id), + G_VARIANT_TYPE ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); if (error) g_warning ("Error locking login1 session: %s", error->message); } @@ -364,9 +354,6 @@ login1_service_lock_session (Login1Service *service, const gchar *session_id) void login1_service_unlock_session (Login1Service *service, const gchar *session_id) { - g_autoptr(GVariant) result = NULL; - g_autoptr(GError) error = NULL; - g_return_if_fail (service != NULL); g_return_if_fail (session_id != NULL); @@ -375,17 +362,18 @@ login1_service_unlock_session (Login1Service *service, const gchar *session_id) if (!session_id) return; - result = g_dbus_connection_call_sync (service->priv->connection, - LOGIN1_SERVICE_NAME, - LOGIN1_OBJECT_NAME, - LOGIN1_MANAGER_INTERFACE_NAME, - "UnlockSession", - g_variant_new ("(s)", session_id), - G_VARIANT_TYPE ("()"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); + g_autoptr(GError) error = NULL; + g_autoptr(GVariant) result = g_dbus_connection_call_sync (service->priv->connection, + LOGIN1_SERVICE_NAME, + LOGIN1_OBJECT_NAME, + LOGIN1_MANAGER_INTERFACE_NAME, + "UnlockSession", + g_variant_new ("(s)", session_id), + G_VARIANT_TYPE ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); if (error) g_warning ("Error unlocking login1 session: %s", error->message); } @@ -393,9 +381,6 @@ login1_service_unlock_session (Login1Service *service, const gchar *session_id) void login1_service_activate_session (Login1Service *service, const gchar *session_id) { - g_autoptr(GVariant) result = NULL; - g_autoptr(GError) error = NULL; - g_return_if_fail (service != NULL); g_return_if_fail (session_id != NULL); @@ -404,17 +389,18 @@ login1_service_activate_session (Login1Service *service, const gchar *session_id if (!session_id) return; - result = g_dbus_connection_call_sync (service->priv->connection, - LOGIN1_SERVICE_NAME, - LOGIN1_OBJECT_NAME, - LOGIN1_MANAGER_INTERFACE_NAME, - "ActivateSession", - g_variant_new ("(s)", session_id), - G_VARIANT_TYPE ("()"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); + g_autoptr(GError) error = NULL; + g_autoptr(GVariant) result = g_dbus_connection_call_sync (service->priv->connection, + LOGIN1_SERVICE_NAME, + LOGIN1_OBJECT_NAME, + LOGIN1_MANAGER_INTERFACE_NAME, + "ActivateSession", + g_variant_new ("(s)", session_id), + G_VARIANT_TYPE ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); if (error) g_warning ("Error activating login1 session: %s", error->message); } @@ -422,9 +408,6 @@ login1_service_activate_session (Login1Service *service, const gchar *session_id void login1_service_terminate_session (Login1Service *service, const gchar *session_id) { - g_autoptr(GVariant) result = NULL; - g_autoptr(GError) error = NULL; - g_return_if_fail (service != NULL); g_return_if_fail (session_id != NULL); @@ -433,17 +416,18 @@ login1_service_terminate_session (Login1Service *service, const gchar *session_i if (!session_id) return; - result = g_dbus_connection_call_sync (service->priv->connection, - LOGIN1_SERVICE_NAME, - LOGIN1_OBJECT_NAME, - LOGIN1_MANAGER_INTERFACE_NAME, - "TerminateSession", - g_variant_new ("(s)", session_id), - G_VARIANT_TYPE ("()"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); + g_autoptr(GError) error = NULL; + g_autoptr(GVariant) result = g_dbus_connection_call_sync (service->priv->connection, + LOGIN1_SERVICE_NAME, + LOGIN1_OBJECT_NAME, + LOGIN1_MANAGER_INTERFACE_NAME, + "TerminateSession", + g_variant_new ("(s)", session_id), + G_VARIANT_TYPE ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); if (error) g_warning ("Error terminating login1 session: %s", error->message); } diff --git a/src/plymouth.c b/src/plymouth.c index ec9377c8..d1ed91f4 100644 --- a/src/plymouth.c +++ b/src/plymouth.c @@ -24,12 +24,9 @@ static gboolean has_active_vt = FALSE; static gboolean plymouth_run_command (const gchar *command, gint *exit_status) { - g_autofree gchar *command_line = NULL; - gboolean result; + g_autofree gchar *command_line = g_strdup_printf ("plymouth %s", command); g_autoptr(GError) error = NULL; - - command_line = g_strdup_printf ("plymouth %s", command); - result = g_spawn_command_line_sync (command_line, NULL, NULL, exit_status, &error); + gboolean result = g_spawn_command_line_sync (command_line, NULL, NULL, exit_status, &error); if (error) g_debug ("Could not run %s: %s", command_line, error->message); diff --git a/src/process.c b/src/process.c index ec0ecb5b..549ccd94 100644 --- a/src/process.c +++ b/src/process.c @@ -176,42 +176,37 @@ process_watch_cb (GPid pid, gint status, gpointer data) gboolean process_start (Process *process, gboolean block) { - gint argc; - g_auto(GStrv) argv = NULL; - g_autofree gchar **env_keys = NULL; - g_autofree gchar **env_values = NULL; - guint i, env_length; - GList *keys, *link; - pid_t pid; - int log_fd = -1; - g_autoptr(GError) error = NULL; - 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); + gint argc; + g_auto(GStrv) argv = NULL; + g_autoptr(GError) error = NULL; if (!g_shell_parse_argv (process->priv->command, &argc, &argv, &error)) { g_warning ("Error parsing command %s: %s", process->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); /* Work out variables to set */ - env_length = g_hash_table_size (process->priv->env); - env_keys = g_malloc (sizeof (gchar *) * env_length); - env_values = g_malloc (sizeof (gchar *) * env_length); - keys = g_hash_table_get_keys (process->priv->env); - for (i = 0, link = keys; i < env_length; i++, link = link->next) + guint env_length = g_hash_table_size (process->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); + 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]); } g_list_free (keys); - pid = fork (); + pid_t pid = fork (); if (pid == 0) { /* Do custom setup */ @@ -234,7 +229,7 @@ process_start (Process *process, gboolean block) #else environ = NULL; #endif - for (i = 0; i < env_length; i++) + for (guint i = 0; i < env_length; i++) setenv (env_keys[i], env_values[i], TRUE); /* Reset SIGPIPE handler so the child has default behaviour (we disabled it at LightDM start) */ @@ -387,11 +382,9 @@ signal_cb (int signum, siginfo_t *info, void *data) static gboolean handle_signal (GIOChannel *source, GIOCondition condition, gpointer data) { + errno = 0; int signo; pid_t pid; - Process *process; - - errno = 0; if (read (signal_pipe[0], &signo, sizeof (int)) != sizeof (int) || read (signal_pipe[0], &pid, sizeof (pid_t)) != sizeof (pid_t)) { @@ -401,7 +394,7 @@ handle_signal (GIOChannel *source, GIOCondition condition, gpointer data) g_debug ("Got signal %d from process %d", signo, pid); - process = g_hash_table_lookup (processes, GINT_TO_POINTER (pid)); + Process *process = g_hash_table_lookup (processes, GINT_TO_POINTER (pid)); if (process == NULL) process = process_get_current (); if (process) diff --git a/src/seat-local.c b/src/seat-local.c index 3b9d6729..9d83ca97 100644 --- a/src/seat-local.c +++ b/src/seat-local.c @@ -77,45 +77,36 @@ compositor_stopped_cb (UnitySystemCompositor *compositor, SeatLocal *seat) if (seat_get_is_stopping (SEAT (seat))) check_stopped (seat); -} +} static gboolean seat_local_start (Seat *seat) { - const gchar *xdmcp_manager = NULL; - /* If running as an XDMCP client then just start an X server */ - xdmcp_manager = seat_get_string_property (seat, "xdmcp-manager"); + const gchar *xdmcp_manager = seat_get_string_property (seat, "xdmcp-manager"); if (xdmcp_manager) { SeatLocal *s = SEAT_LOCAL (seat); - const gchar *key_name = NULL; - gint port = 0; s->priv->xdmcp_x_server = create_x_server (s); x_server_local_set_xdmcp_server (s->priv->xdmcp_x_server, xdmcp_manager); - port = seat_get_integer_property (seat, "xdmcp-port"); + gint port = seat_get_integer_property (seat, "xdmcp-port"); if (port > 0) x_server_local_set_xdmcp_port (s->priv->xdmcp_x_server, port); - key_name = seat_get_string_property (seat, "xdmcp-key"); + const gchar *key_name = seat_get_string_property (seat, "xdmcp-key"); if (key_name) { - g_autofree gchar *path = NULL; - g_autoptr(GKeyFile) keys = NULL; - gboolean result; - g_autoptr(GError) error = NULL; + g_autofree gchar *path = g_build_filename (config_get_directory (config_get_instance ()), "keys.conf", NULL); - path = g_build_filename (config_get_directory (config_get_instance ()), "keys.conf", NULL); - - keys = g_key_file_new (); - result = g_key_file_load_from_file (keys, path, G_KEY_FILE_NONE, &error); + g_autoptr(GKeyFile) keys = g_key_file_new (); + g_autoptr(GError) error = NULL; + gboolean result = g_key_file_load_from_file (keys, path, G_KEY_FILE_NONE, &error); if (error) l_debug (seat, "Error getting key %s", error->message); if (result) { g_autofree gchar *key = NULL; - if (g_key_file_has_key (keys, "keyring", key_name, NULL)) key = g_key_file_get_string (keys, "keyring", key_name, NULL); else @@ -153,13 +144,11 @@ display_server_transition_plymouth_cb (DisplayServer *display_server, Seat *seat static gint get_vt (SeatLocal *seat, DisplayServer *display_server) { - gint vt = -1; - const gchar *xdg_seat = seat_get_name (SEAT (seat)); - - if (strcmp (xdg_seat, "seat0") != 0) - return vt; + if (strcmp (seat_get_name (SEAT (seat)), "seat0") != 0) + return -1; /* If Plymouth is running, stop it */ + gint vt = -1; if (plymouth_get_is_active () && plymouth_has_active_vt ()) { gint active_vt = vt_get_active (); @@ -184,24 +173,21 @@ get_vt (SeatLocal *seat, DisplayServer *display_server) static UnitySystemCompositor * get_unity_system_compositor (SeatLocal *seat) { - const gchar *command; - gint timeout, vt; - if (seat->priv->compositor) return seat->priv->compositor; seat->priv->compositor = unity_system_compositor_new (); - command = seat_get_string_property (SEAT (seat), "unity-compositor-command"); + const gchar *command = seat_get_string_property (SEAT (seat), "unity-compositor-command"); if (command) unity_system_compositor_set_command (seat->priv->compositor, command); - timeout = seat_get_integer_property (SEAT (seat), "unity-compositor-timeout"); + 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); - vt = get_vt (seat, DISPLAY_SERVER (seat->priv->compositor)); + gint vt = get_vt (seat, DISPLAY_SERVER (seat->priv->compositor)); if (vt >= 0) unity_system_compositor_set_vt (seat->priv->compositor, vt); @@ -214,40 +200,28 @@ get_unity_system_compositor (SeatLocal *seat) static XServerLocal * create_x_server (SeatLocal *seat) { - const gchar *x_server_backend; - XServerLocal *x_server; - g_autofree gchar *number = NULL; - g_autoptr(XAuthority) cookie = NULL; - const gchar *layout = NULL, *config_file = NULL; - gboolean allow_tcp; - gint vt; - - x_server_backend = seat_get_string_property (SEAT (seat), "xserver-backend"); + g_autoptr(XServerLocal) x_server = NULL; + + const gchar *x_server_backend = seat_get_string_property (SEAT (seat), "xserver-backend"); if (g_strcmp0 (x_server_backend, "mir") == 0) { - UnitySystemCompositor *compositor; - const gchar *command; - g_autofree gchar *id = NULL; - - compositor = get_unity_system_compositor (SEAT_LOCAL (seat)); + UnitySystemCompositor *compositor = get_unity_system_compositor (SEAT_LOCAL (seat)); x_server = X_SERVER_LOCAL (x_server_xmir_new (compositor)); - command = seat_get_string_property (SEAT (seat), "xmir-command"); + const gchar *command = seat_get_string_property (SEAT (seat), "xmir-command"); if (command) x_server_local_set_command (x_server, command); - id = g_strdup_printf ("x-%d", seat->priv->next_xmir_id); + g_autofree gchar *id = g_strdup_printf ("x-%d", seat->priv->next_xmir_id); seat->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)); } else { - const gchar *command = NULL; - x_server = x_server_local_new (); - vt = get_vt (seat, DISPLAY_SERVER (x_server)); + gint vt = get_vt (seat, DISPLAY_SERVER (x_server)); if (vt >= 0) x_server_local_set_vt (x_server, vt); @@ -257,6 +231,7 @@ create_x_server (SeatLocal *seat) l_debug (seat, "Starting local X display"); /* If running inside an X server use Xephyr instead */ + const gchar *command = NULL; if (g_getenv ("DISPLAY")) command = "Xephyr"; if (!command) @@ -265,48 +240,44 @@ create_x_server (SeatLocal *seat) x_server_local_set_command (x_server, command); } - number = g_strdup_printf ("%d", x_server_get_display_number (X_SERVER (x_server))); - cookie = x_authority_new_local_cookie (number); + 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); - layout = seat_get_string_property (SEAT (seat), "xserver-layout"); + const gchar *layout = seat_get_string_property (SEAT (seat), "xserver-layout"); if (layout) x_server_local_set_layout (x_server, layout); x_server_local_set_xdg_seat (x_server, seat_get_name (SEAT (seat))); - config_file = seat_get_string_property (SEAT (seat), "xserver-config"); + const gchar *config_file = seat_get_string_property (SEAT (seat), "xserver-config"); if (config_file) x_server_local_set_config (x_server, config_file); - allow_tcp = seat_get_boolean_property (SEAT (seat), "xserver-allow-tcp"); + gboolean allow_tcp = seat_get_boolean_property (SEAT (seat), "xserver-allow-tcp"); x_server_local_set_allow_tcp (x_server, allow_tcp); - return x_server; + return g_steal_pointer (&x_server); } static DisplayServer * create_wayland_session (SeatLocal *seat) { - WaylandSession *session; - gint vt; - - session = wayland_session_new (); + g_autoptr(WaylandSession) session = wayland_session_new (); - vt = get_vt (seat, DISPLAY_SERVER (session)); + gint vt = get_vt (seat, DISPLAY_SERVER (session)); if (vt >= 0) wayland_session_set_vt (session, vt); - return DISPLAY_SERVER (session); + return DISPLAY_SERVER (g_steal_pointer (&session)); } static DisplayServer * seat_local_create_display_server (Seat *s, Session *session) { SeatLocal *seat = SEAT_LOCAL (s); - const gchar *session_type; - session_type = session_get_session_type (session); + 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) @@ -332,9 +303,7 @@ seat_local_display_server_is_used (Seat *seat, DisplayServer *display_server) static GreeterSession * seat_local_create_greeter_session (Seat *seat) { - GreeterSession *greeter_session; - - greeter_session = SEAT_CLASS (seat_local_parent_class)->create_greeter_session (seat); + GreeterSession *greeter_session = SEAT_CLASS (seat_local_parent_class)->create_greeter_session (seat); session_set_env (SESSION (greeter_session), "XDG_SEAT", seat_get_name (seat)); return greeter_session; @@ -343,9 +312,7 @@ seat_local_create_greeter_session (Seat *seat) static Session * seat_local_create_session (Seat *seat) { - Session *session; - - session = SEAT_CLASS (seat_local_parent_class)->create_session (seat); + Session *session = SEAT_CLASS (seat_local_parent_class)->create_session (seat); session_set_env (SESSION (session), "XDG_SEAT", seat_get_name (seat)); return session; @@ -355,9 +322,8 @@ static void seat_local_set_active_session (Seat *s, Session *session) { SeatLocal *seat = SEAT_LOCAL (s); - DisplayServer *display_server; - display_server = session_get_display_server (session); + DisplayServer *display_server = session_get_display_server (session); gint vt = display_server_get_vt (display_server); if (vt >= 0) @@ -382,10 +348,8 @@ static Session * seat_local_get_active_session (Seat *s) { SeatLocal *seat = SEAT_LOCAL (s); - gint vt; - GList *link; - vt = vt_get_active (); + gint vt = vt_get_active (); if (vt < 0) return NULL; @@ -394,7 +358,7 @@ seat_local_get_active_session (Seat *s) return seat->priv->active_compositor_session; /* Otherwise find out which session is on this VT */ - for (link = seat_get_sessions (s); link; link = link->next) + for (GList *link = seat_get_sessions (s); link; link = link->next) { Session *session = link->data; DisplayServer *display_server; @@ -410,14 +374,12 @@ seat_local_get_active_session (Seat *s) static void seat_local_set_next_session (Seat *seat, Session *session) { - DisplayServer *display_server; - const gchar *id = NULL; - if (!session) return; - display_server = session_get_display_server (session); + DisplayServer *display_server = session_get_display_server (session); + const gchar *id = NULL; if (IS_X_SERVER_XMIR (display_server)) id = x_server_xmir_get_mir_id (X_SERVER_XMIR (display_server)); else @@ -437,12 +399,8 @@ seat_local_run_script (Seat *seat, DisplayServer *display_server, Process *scrip { if (IS_X_SERVER_LOCAL (display_server)) { - const gchar *path; - XServerLocal *x_server; - - x_server = X_SERVER_LOCAL (display_server); - path = x_server_local_get_authority_file_path (x_server); - process_set_env (script, "DISPLAY", x_server_get_address (X_SERVER (x_server))); + const gchar *path = x_server_local_get_authority_file_path (X_SERVER_LOCAL (display_server)); + process_set_env (script, "DISPLAY", x_server_get_address (X_SERVER (display_server))); process_set_env (script, "XAUTHORITY", path); } diff --git a/src/seat-unity.c b/src/seat-unity.c index 16dde12b..8563f7ad 100644 --- a/src/seat-unity.c +++ b/src/seat-unity.c @@ -74,48 +74,38 @@ xdmcp_x_server_stopped_cb (DisplayServer *display_server, Seat *seat) static void compositor_ready_cb (UnitySystemCompositor *compositor, SeatUnity *seat) { - const gchar *xdmcp_manager = NULL; - l_debug (seat, "Compositor ready"); /* If running as an XDMCP client then just start an X server */ - xdmcp_manager = seat_get_string_property (SEAT (seat), "xdmcp-manager"); + const gchar *xdmcp_manager = seat_get_string_property (SEAT (seat), "xdmcp-manager"); if (xdmcp_manager) { - const gchar *key_name = NULL; - gint port = 0; - 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); - port = seat_get_integer_property (SEAT (seat), "xdmcp-port"); + 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); - key_name = seat_get_string_property (SEAT (seat), "xdmcp-key"); + const gchar *key_name = seat_get_string_property (SEAT (seat), "xdmcp-key"); if (key_name) { - g_autofree gchar *path = NULL; - g_autoptr(GKeyFile) keys = NULL; - gboolean result; - g_autoptr(GError) error = NULL; + g_autofree gchar *path = g_build_filename (config_get_directory (config_get_instance ()), "keys.conf", NULL); - path = g_build_filename (config_get_directory (config_get_instance ()), "keys.conf", NULL); - - keys = g_key_file_new (); - result = g_key_file_load_from_file (keys, path, G_KEY_FILE_NONE, &error); + g_autoptr(GKeyFile) keys = g_key_file_new (); + g_autoptr(GError) error = NULL; + gboolean result = g_key_file_load_from_file (keys, path, G_KEY_FILE_NONE, &error); if (error) l_debug (seat, "Error getting key %s", error->message); if (result) { - g_autofree gchar *key = NULL; - if (g_key_file_has_key (keys, "keyring", key_name, NULL)) - key = g_key_file_get_string (keys, "keyring", key_name, NULL); + { + 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); + } else l_debug (seat, "Key %s not defined", key_name); - - if (key) - x_server_local_set_xdmcp_key (X_SERVER_LOCAL (seat->priv->xdmcp_x_server), key); } } @@ -143,10 +133,8 @@ compositor_stopped_cb (UnitySystemCompositor *compositor, SeatUnity *seat) static gboolean seat_unity_start (Seat *seat) { - gint vt = -1; - int timeout; - /* Replace Plymouth if it is running */ + gint vt = -1; if (plymouth_get_is_active () && plymouth_has_active_vt ()) { gint active_vt = vt_get_active (); @@ -168,7 +156,7 @@ seat_unity_start (Seat *seat) return FALSE; } - timeout = seat_get_integer_property (SEAT (seat), "unity-compositor-timeout"); + int timeout = seat_get_integer_property (SEAT (seat), "unity-compositor-timeout"); if (timeout <= 0) timeout = 60; @@ -185,51 +173,42 @@ seat_unity_start (Seat *seat) static XServerXmir * create_x_server (Seat *seat) { - XServerXmir *x_server; - g_autoptr(XAuthority) cookie = NULL; - const gchar *command = NULL, *layout = NULL, *config_file = NULL; - g_autofree gchar *id = NULL; - g_autofree gchar *number = NULL; - gboolean allow_tcp; - l_debug (seat, "Starting X server on Unity compositor"); - x_server = x_server_xmir_new (SEAT_UNITY (seat)->priv->compositor); + g_autoptr(XServerXmir) x_server = x_server_xmir_new (SEAT_UNITY (seat)->priv->compositor); - command = seat_get_string_property (seat, "xmir-command"); + const gchar *command = seat_get_string_property (seat, "xmir-command"); x_server_local_set_command (X_SERVER_LOCAL (x_server), command); - id = g_strdup_printf ("x-%d", SEAT_UNITY (seat)->priv->next_x_server_id); + 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++; 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)); - number = g_strdup_printf ("%d", x_server_get_display_number (X_SERVER (x_server))); - cookie = x_authority_new_local_cookie (number); + 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); - layout = seat_get_string_property (seat, "xserver-layout"); + const gchar *layout = seat_get_string_property (seat, "xserver-layout"); if (layout) x_server_local_set_layout (X_SERVER_LOCAL (x_server), layout); x_server_local_set_xdg_seat (X_SERVER_LOCAL (x_server), seat_get_name (seat)); - config_file = seat_get_string_property (seat, "xserver-config"); + const gchar *config_file = seat_get_string_property (seat, "xserver-config"); if (config_file) x_server_local_set_config (X_SERVER_LOCAL (x_server), config_file); - allow_tcp = seat_get_boolean_property (seat, "xserver-allow-tcp"); + gboolean allow_tcp = seat_get_boolean_property (seat, "xserver-allow-tcp"); x_server_local_set_allow_tcp (X_SERVER_LOCAL (x_server), allow_tcp); - return x_server; + return g_steal_pointer (&x_server); } static DisplayServer * seat_unity_create_display_server (Seat *seat, Session *session) { - const gchar *session_type; - - session_type = session_get_session_type (session); + 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) @@ -253,13 +232,10 @@ seat_unity_display_server_is_used (Seat *seat, DisplayServer *display_server) static GreeterSession * seat_unity_create_greeter_session (Seat *seat) { - GreeterSession *greeter_session; - gint vt; - - greeter_session = SEAT_CLASS (seat_unity_parent_class)->create_greeter_session (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)); - vt = display_server_get_vt (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor)); + gint vt = display_server_get_vt (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor)); if (vt >= 0) { g_autofree gchar *value = g_strdup_printf ("%d", vt); @@ -272,13 +248,10 @@ seat_unity_create_greeter_session (Seat *seat) static Session * seat_unity_create_session (Seat *seat) { - Session *session; - gint vt; - - session = SEAT_CLASS (seat_unity_parent_class)->create_session (seat); + Session *session = SEAT_CLASS (seat_unity_parent_class)->create_session (seat); session_set_env (session, "XDG_SEAT", seat_get_name (seat)); - vt = display_server_get_vt (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor)); + gint vt = display_server_get_vt (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor)); if (vt >= 0) { g_autofree gchar *value = g_strdup_printf ("%d", vt); @@ -291,12 +264,10 @@ seat_unity_create_session (Seat *seat) static const gchar * get_mir_id (Session *session) { - DisplayServer *display_server; - if (!session) return NULL; - display_server = session_get_display_server (session); + DisplayServer *display_server = session_get_display_server (session); if (IS_UNITY_SYSTEM_COMPOSITOR (display_server)) return session_get_env (session, "MIR_SERVER_NAME"); if (IS_X_SERVER_XMIR (display_server)) @@ -309,10 +280,9 @@ static void seat_unity_set_active_session (Seat *s, Session *session) { SeatUnity *seat = SEAT_UNITY (s); - const gchar *old_id, *new_id; - old_id = get_mir_id (seat->priv->active_session); - new_id = get_mir_id (session); + const gchar *old_id = get_mir_id (seat->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); @@ -332,14 +302,12 @@ seat_unity_get_active_session (Seat *seat) static void seat_unity_set_next_session (Seat *seat, Session *session) { - DisplayServer *display_server; - const gchar *id = NULL; - if (!session) return; - display_server = session_get_display_server (session); + DisplayServer *display_server = session_get_display_server (session); + const gchar *id = NULL; if (IS_X_SERVER_LOCAL (display_server)) id = x_server_xmir_get_mir_id (X_SERVER_XMIR (display_server)); else @@ -363,11 +331,8 @@ seat_unity_run_script (Seat *seat, DisplayServer *display_server, Process *scrip { if (IS_X_SERVER_XMIR (display_server)) { - XServerXmir *x_server; - const gchar *path; - - x_server = X_SERVER_XMIR (display_server); - path = x_server_local_get_authority_file_path (X_SERVER_LOCAL (x_server)); + XServerXmir *x_server = X_SERVER_XMIR (display_server); + const gchar *path = x_server_local_get_authority_file_path (X_SERVER_LOCAL (x_server)); process_set_env (script, "DISPLAY", x_server_get_address (X_SERVER (x_server))); process_set_env (script, "XAUTHORITY", path); } diff --git a/src/seat-xdmcp-session.c b/src/seat-xdmcp-session.c index ebcdb706..903a26ff 100644 --- a/src/seat-xdmcp-session.c +++ b/src/seat-xdmcp-session.c @@ -28,9 +28,7 @@ G_DEFINE_TYPE (SeatXDMCPSession, seat_xdmcp_session, SEAT_TYPE) SeatXDMCPSession * seat_xdmcp_session_new (XDMCPSession *session) { - SeatXDMCPSession *seat; - - seat = g_object_new (SEAT_XDMCP_SESSION_TYPE, NULL); + SeatXDMCPSession *seat = g_object_new (SEAT_XDMCP_SESSION_TYPE, NULL); seat->priv->session = g_object_ref (session); return seat; @@ -39,9 +37,6 @@ seat_xdmcp_session_new (XDMCPSession *session) static DisplayServer * seat_xdmcp_session_create_display_server (Seat *seat, Session *session) { - XAuthority *authority; - g_autofree gchar *host = NULL; - if (strcmp (session_get_session_type (session), "x") != 0) return NULL; @@ -49,8 +44,8 @@ seat_xdmcp_session_create_display_server (Seat *seat, Session *session) if (SEAT_XDMCP_SESSION (seat)->priv->x_server) return NULL; - authority = xdmcp_session_get_authority (SEAT_XDMCP_SESSION (seat)->priv->session); - host = g_inet_address_to_string (xdmcp_session_get_address (SEAT_XDMCP_SESSION (seat)->priv->session)); + 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)); SEAT_XDMCP_SESSION (seat)->priv->x_server = x_server_remote_new (host, xdmcp_session_get_display_number (SEAT_XDMCP_SESSION (seat)->priv->session), authority); diff --git a/src/seat-xremote.c b/src/seat-xremote.c index e337b14d..876ee29e 100644 --- a/src/seat-xremote.c +++ b/src/seat-xremote.c @@ -27,34 +27,25 @@ seat_xremote_setup (Seat *seat) static DisplayServer * seat_xremote_create_display_server (Seat *seat, Session *session) { - const gchar *session_type; - XServerRemote *x_server; - const gchar *hostname; - gint number; - - session_type = session_get_session_type (session); + const gchar *session_type = session_get_session_type (session); if (strcmp (session_type, "x") != 0) { l_warning (seat, "X remote seat only supports X display servers, not '%s'", session_type); return NULL; } - hostname = seat_get_string_property (seat, "xserver-hostname"); - number = seat_get_integer_property (seat, "xserver-display-number"); + const gchar *hostname = seat_get_string_property (seat, "xserver-hostname"); + gint number = seat_get_integer_property (seat, "xserver-display-number"); l_debug (seat, "Starting remote X display %s:%d", hostname ? hostname : "", number); - x_server = x_server_remote_new (hostname, number, NULL); - - return DISPLAY_SERVER (x_server); + return DISPLAY_SERVER (x_server_remote_new (hostname, number, NULL)); } static GreeterSession * seat_xremote_create_greeter_session (Seat *seat) { - GreeterSession *greeter_session; - - greeter_session = SEAT_CLASS (seat_xremote_parent_class)->create_greeter_session (seat); + GreeterSession *greeter_session = SEAT_CLASS (seat_xremote_parent_class)->create_greeter_session (seat); session_set_env (SESSION (greeter_session), "XDG_SEAT", seat_get_name (seat)); return greeter_session; @@ -63,9 +54,7 @@ seat_xremote_create_greeter_session (Seat *seat) static Session * seat_xremote_create_session (Seat *seat) { - Session *session; - - session = SEAT_CLASS (seat_xremote_parent_class)->create_session (seat); + Session *session = SEAT_CLASS (seat_xremote_parent_class)->create_session (seat); session_set_env (SESSION (session), "XDG_SEAT", seat_get_name (seat)); return session; @@ -74,9 +63,7 @@ seat_xremote_create_session (Seat *seat) static void seat_xremote_run_script (Seat *seat, DisplayServer *display_server, Process *script) { - XServerRemote *x_server; - - x_server = X_SERVER_REMOTE (display_server); + XServerRemote *x_server = X_SERVER_REMOTE (display_server); process_set_env (script, "DISPLAY", x_server_get_address (X_SERVER (x_server))); process_set_env (script, "REMOTE_HOST", x_server_get_hostname (X_SERVER (x_server))); diff --git a/src/seat-xvnc.c b/src/seat-xvnc.c index 5539041d..232bcc72 100644 --- a/src/seat-xvnc.c +++ b/src/seat-xvnc.c @@ -28,9 +28,7 @@ struct SeatXVNCPrivate SeatXVNC *seat_xvnc_new (GSocket *connection) { - SeatXVNC *seat; - - seat = g_object_new (SEAT_XVNC_TYPE, NULL); + SeatXVNC *seat = g_object_new (SEAT_XVNC_TYPE, NULL); seat->priv->connection = g_object_ref (connection); return seat; @@ -46,11 +44,6 @@ seat_xvnc_setup (Seat *seat) static DisplayServer * seat_xvnc_create_display_server (Seat *seat, Session *session) { - XServerXVNC *x_server; - g_autofree gchar *number = NULL; - g_autoptr(XAuthority) cookie = NULL; - const gchar *command = NULL; - if (strcmp (session_get_session_type (session), "x") != 0) return NULL; @@ -58,13 +51,14 @@ seat_xvnc_create_display_server (Seat *seat, Session *session) if (SEAT_XVNC (seat)->priv->x_server) return NULL; - SEAT_XVNC (seat)->priv->x_server = x_server = x_server_xvnc_new (); - number = g_strdup_printf ("%d", x_server_get_display_number (X_SERVER (x_server))); - cookie = x_authority_new_local_cookie (number); + g_autoptr(XServerXVNC) x_server = x_server_xvnc_new (); + SEAT_XVNC (seat)->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)); - command = config_get_string (config_get_instance (), "VNCServer", "command"); + const gchar *command = config_get_string (config_get_instance (), "VNCServer", "command"); if (command) x_server_local_set_command (X_SERVER_LOCAL (x_server), command); @@ -85,22 +79,17 @@ seat_xvnc_create_display_server (Seat *seat, Session *session) x_server_xvnc_set_depth (x_server, depth); } - return g_object_ref (DISPLAY_SERVER (x_server)); + return DISPLAY_SERVER (g_steal_pointer (&x_server)); } static void seat_xvnc_run_script (Seat *seat, DisplayServer *display_server, Process *script) { - XServerXVNC *x_server; - GInetSocketAddress *address; - g_autofree gchar *hostname = NULL; - const gchar *path; - - x_server = X_SERVER_XVNC (display_server); + XServerXVNC *x_server = X_SERVER_XVNC (display_server); - address = G_INET_SOCKET_ADDRESS (g_socket_get_remote_address (SEAT_XVNC (seat)->priv->connection, NULL)); - hostname = g_inet_address_to_string (g_inet_socket_address_get_address (address)); - path = x_server_local_get_authority_file_path (X_SERVER_LOCAL (x_server)); + GInetSocketAddress *address = G_INET_SOCKET_ADDRESS (g_socket_get_remote_address (SEAT_XVNC (seat)->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)); process_set_env (script, "REMOTE_HOST", hostname); process_set_env (script, "DISPLAY", x_server_get_address (X_SERVER (x_server))); @@ -65,7 +65,7 @@ struct SeatPrivate /* TRUE if stopped */ gboolean stopped; - + /* The greeter to be started to replace the current one */ GreeterSession *replacement_greeter; }; @@ -100,14 +100,12 @@ free_seat_module (gpointer data) void seat_register_module (const gchar *name, GType type) { - SeatModule *module; - if (!seat_modules) seat_modules = g_hash_table_new_full (g_str_hash, g_str_equal, free_seat_module, NULL); g_debug ("Registered seat module %s", name); - module = g_malloc0 (sizeof (SeatModule)); + SeatModule *module = g_malloc0 (sizeof (SeatModule)); module->name = g_strdup (name); module->type = type; g_hash_table_insert (seat_modules, g_strdup (name), module); @@ -116,10 +114,9 @@ seat_register_module (const gchar *name, GType type) Seat * seat_new (const gchar *module_name) { - SeatModule *m = NULL; - g_return_val_if_fail (module_name != NULL, NULL); + SeatModule *m = NULL; if (seat_modules) m = g_hash_table_lookup (seat_modules, module_name); if (!m) @@ -160,15 +157,13 @@ seat_get_string_list_property (Seat *seat, const gchar *name) gboolean seat_get_boolean_property (Seat *seat, const gchar *name) { - const gchar *value; - gint i, length = 0; - - value = seat_get_string_property (seat, name); + const gchar *value = seat_get_string_property (seat, name); if (!value) return FALSE; /* Count the number of non-whitespace characters */ - for (i = 0; value[i]; i++) + gint length = 0; + for (gint i = 0; value[i]; i++) if (!g_ascii_isspace (value[i])) length = i + 1; @@ -178,9 +173,7 @@ seat_get_boolean_property (Seat *seat, const gchar *name) gint seat_get_integer_property (Seat *seat, const gchar *name) { - const gchar *value; - - value = seat_get_string_property (seat, name); + const gchar *value = seat_get_string_property (seat, name); return value ? atoi (value) : 0; } @@ -234,14 +227,12 @@ set_greeter_idle (gpointer greeter) void seat_set_active_session (Seat *seat, Session *session) { - GList *link; - g_return_if_fail (seat != NULL); SEAT_GET_CLASS (seat)->set_active_session (seat, session); /* Stop any greeters */ - for (link = seat->priv->sessions; link; link = link->next) + for (GList *link = seat->priv->sessions; link; link = link->next) { Session *s = link->data; @@ -329,9 +320,7 @@ seat_set_externally_activated_session (Seat *seat, Session *session) Session * seat_find_session_by_login1_id (Seat *seat, const gchar *login1_session_id) { - GList *session_link; - - for (session_link = seat->priv->sessions; session_link; session_link = session_link->next) + for (GList *session_link = seat->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) @@ -358,10 +347,7 @@ seat_get_allow_guest (Seat *seat) static gboolean run_script (Seat *seat, DisplayServer *display_server, const gchar *script_name, User *user) { - g_autoptr(Process) script = NULL; - gboolean result = FALSE; - - script = process_new (NULL, NULL); + g_autoptr(Process) script = process_new (NULL, NULL); process_set_command (script, script_name); @@ -391,11 +377,10 @@ run_script (Seat *seat, DisplayServer *display_server, const gchar *script_name, SEAT_GET_CLASS (seat)->run_script (seat, display_server, script); + gboolean result = FALSE; if (process_start (script, TRUE)) { - int exit_status; - - exit_status = process_get_exit_status (script); + int exit_status = process_get_exit_status (script); if (WIFEXITED (exit_status)) { l_debug (seat, "Exit status of %s: %d", script_name, WEXITSTATUS (exit_status)); @@ -416,13 +401,12 @@ emit_upstart_signal (const gchar *signal) { g_return_if_fail (signal != NULL); g_return_if_fail (signal[0] != 0); - g_autoptr(GSubprocess) p = NULL; if (getuid () != 0) return; /* OK if it fails, probably not installed or not running upstart */ - p = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_SILENCE, NULL, "initctl", "-q", "emit", signal, "DISPLAY_MANAGER=lightdm", NULL); + g_autoptr(GSubprocess) p = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_SILENCE, NULL, "initctl", "-q", "emit", signal, "DISPLAY_MANAGER=lightdm", NULL); } static void @@ -442,14 +426,10 @@ check_stopped (Seat *seat) static void display_server_stopped_cb (DisplayServer *display_server, Seat *seat) { - const gchar *script; - GList *list, *link; - Session *active_session; - l_debug (seat, "Display server stopped"); /* Run a script right after stopping the display server */ - script = seat_get_string_property (seat, "display-stopped-script"); + const gchar *script = seat_get_string_property (seat, "display-stopped-script"); if (script) run_script (seat, NULL, script, NULL); @@ -464,18 +444,17 @@ display_server_stopped_cb (DisplayServer *display_server, Seat *seat) } /* Stop all sessions on this display server */ - list = g_list_copy (seat->priv->sessions); - for (link = list; link; link = link->next) + GList *list = g_list_copy (seat->priv->sessions); + for (GList *link = list; link; link = link->next) g_object_ref (link->data); - for (link = list; link; link = link->next) + for (GList *link = list; link; link = link->next) { Session *session = link->data; - gboolean is_failed_greeter; if (session_get_display_server (session) != display_server || session_get_is_stopping (session)) continue; - - is_failed_greeter = IS_GREETER_SESSION (session) && !session_get_is_started (session); + + gboolean is_failed_greeter = IS_GREETER_SESSION (session) && !session_get_is_started (session); l_debug (seat, "Stopping session"); session_stop (session); @@ -493,7 +472,7 @@ display_server_stopped_cb (DisplayServer *display_server, Seat *seat) if (!seat->priv->stopping) { /* If we were the active session, switch to a greeter */ - active_session = seat_get_active_session (seat); + Session *active_session = seat_get_active_session (seat); if (!active_session || session_get_display_server (active_session) == display_server) { l_debug (seat, "Active display server stopped, starting greeter"); @@ -517,9 +496,7 @@ can_share_display_server (Seat *seat, DisplayServer *display_server) static GreeterSession * find_greeter_session (Seat *seat) { - GList *link; - - for (link = seat->priv->sessions; link; link = link->next) + for (GList *link = seat->priv->sessions; link; link = link->next) { Session *session = link->data; if (!session_get_is_stopping (session) && IS_GREETER_SESSION (session)) @@ -532,9 +509,7 @@ find_greeter_session (Seat *seat) static GreeterSession * find_resettable_greeter (Seat *seat) { - GList *link; - - for (link = seat->priv->sessions; link; link = link->next) + for (GList *link = seat->priv->sessions; link; link = link->next) { Session *session = link->data; if (!session_get_is_stopping (session) && IS_GREETER_SESSION (session) && @@ -559,12 +534,9 @@ set_greeter_hints (Seat *seat, Greeter *greeter) static void switch_to_greeter_from_failed_session (Seat *seat, Session *session) { - GreeterSession *greeter_session; - Greeter *greeter; - gboolean existing = FALSE; - /* Switch to greeter if one open */ - greeter_session = find_resettable_greeter (seat); + GreeterSession *greeter_session = find_resettable_greeter (seat); + gboolean existing = FALSE; if (greeter_session) { l_debug (seat, "Switching to existing greeter"); @@ -575,7 +547,7 @@ switch_to_greeter_from_failed_session (Seat *seat, Session *session) { greeter_session = create_greeter_session (seat); } - greeter = greeter_session_get_greeter (greeter_session); + Greeter *greeter = greeter_session_get_greeter (greeter_session); if (session_get_is_guest (session)) greeter_set_hint (greeter, "select-guest", "true"); @@ -596,9 +568,7 @@ switch_to_greeter_from_failed_session (Seat *seat, Session *session) session_set_display_server (SESSION (greeter_session), session_get_display_server (session)); else { - DisplayServer *display_server; - - display_server = create_display_server (seat, session); + DisplayServer *display_server = create_display_server (seat, session); session_set_display_server (session, display_server); if (!start_display_server (seat, display_server)) { @@ -620,17 +590,11 @@ start_session (Seat *seat, Session *session) /* Use system location for greeter log file */ if (IS_GREETER_SESSION (session)) { - gchar *log_dir, *filename, *log_filename; - gboolean backup_logs; - - log_dir = config_get_string (config_get_instance (), "LightDM", "log-directory"); - filename = g_strdup_printf ("%s-greeter.log", seat->priv->name); - log_filename = g_build_filename (log_dir, filename, NULL); - g_free (log_dir); - g_free (filename); - backup_logs = config_get_boolean (config_get_instance (), "LightDM", "backup-logs"); + 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 *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); - g_free (log_filename); } if (session_start (session)) @@ -651,7 +615,6 @@ static void run_session (Seat *seat, Session *session) { const gchar *script; - if (IS_GREETER_SESSION (session)) script = seat_get_string_property (seat, "greeter-setup-script"); else @@ -694,12 +657,10 @@ run_session (Seat *seat, Session *session) static Session * find_user_session (Seat *seat, const gchar *username, Session *ignore_session) { - GList *link; - if (!username) return NULL; - for (link = seat->priv->sessions; link; link = link->next) + for (GList *link = seat->priv->sessions; link; link = link->next) { Session *session = link->data; @@ -716,9 +677,7 @@ 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; - - session = find_user_session (seat, greeter_get_active_username (greeter), seat->priv->active_session); + Session *session = find_user_session (seat, greeter_get_active_username (greeter), seat->priv->active_session); g_clear_object (&seat->priv->next_session); seat->priv->next_session = session ? g_object_ref (session) : NULL; @@ -731,9 +690,7 @@ session_authentication_complete_cb (Session *session, Seat *seat) { if (session_get_is_authenticated (session)) { - Session *s; - - s = find_user_session (seat, session_get_username (session), session); + Session *s = find_user_session (seat, session_get_username (session), session); if (s) { l_debug (seat, "Session authenticated, switching to existing user session"); @@ -761,8 +718,6 @@ session_authentication_complete_cb (Session *session, Seat *seat) static void session_stopped_cb (Session *session, Seat *seat) { - DisplayServer *display_server; - l_debug (seat, "Session stopped"); g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); @@ -774,13 +729,12 @@ session_stopped_cb (Session *session, Seat *seat) if (session == seat->priv->session_to_activate) g_clear_object (&seat->priv->session_to_activate); - display_server = session_get_display_server (session); + DisplayServer *display_server = session_get_display_server (session); /* Cleanup */ if (!IS_GREETER_SESSION (session)) { - const gchar *script; - script = seat_get_string_property (seat, "session-cleanup-script"); + const gchar *script = seat_get_string_property (seat, "session-cleanup-script"); if (script) run_script (seat, display_server, script, session_get_user (session)); } @@ -796,13 +750,13 @@ session_stopped_cb (Session *session, Seat *seat) g_object_unref (session); return; } - + /* If there is a pending replacement greeter, start it */ if (IS_GREETER_SESSION (session) && seat->priv->replacement_greeter) { GreeterSession *replacement_greeter = seat->priv->replacement_greeter; seat->priv->replacement_greeter = NULL; - + if (session_get_is_authenticated (SESSION (replacement_greeter))) { l_debug (seat, "Greeter stopped, running session"); @@ -821,9 +775,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)))) { - GList *link; - - for (link = seat->priv->sessions; link; link = link->next) + for (GList *link = seat->priv->sessions; link; link = link->next) { Session *s = link->data; @@ -905,9 +857,7 @@ set_session_env (Session *session) static Session * create_session (Seat *seat, gboolean autostart) { - Session *session; - - session = SEAT_GET_CLASS (seat)->create_session (seat); + Session *session = SEAT_GET_CLASS (seat)->create_session (seat); seat->priv->sessions = g_list_append (seat->priv->sessions, session); if (autostart) g_signal_connect (session, SESSION_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (session_authentication_complete_cb), seat); @@ -923,62 +873,53 @@ create_session (Seat *seat, gboolean autostart) static gchar ** get_session_argv (Seat *seat, SessionConfig *session_config, const gchar *session_wrapper) { - gboolean result; - int argc; - gchar **argv, *path; - g_autoptr(GError) error = NULL; - /* If configured, run sessions through a wrapper */ if (session_wrapper) { - argv = g_malloc (sizeof (gchar *) * 3); - path = g_find_program_in_path (session_wrapper); - argv[0] = path ? path : g_strdup (session_wrapper); + gchar **argv = g_malloc (sizeof (gchar *) * 3); + g_autofree gchar *path = g_find_program_in_path (session_wrapper); + argv[0] = path ? g_steal_pointer (&path) : g_strdup (session_wrapper); argv[1] = g_strdup (session_config_get_command (session_config)); argv[2] = NULL; return argv; } /* Split command into an array listing and make command absolute */ - result = g_shell_parse_argv (session_config_get_command (session_config), &argc, &argv, &error); + int argc; + g_auto(GStrv) argv = NULL; + g_autoptr(GError) error = NULL; + gboolean result = g_shell_parse_argv (session_config_get_command (session_config), &argc, &argv, &error); if (error) l_debug (seat, "Invalid session command '%s': %s", session_config_get_command (session_config), error->message); if (!result) return NULL; - path = g_find_program_in_path (argv[0]); + g_autofree gchar *path = g_find_program_in_path (argv[0]); if (path) { g_free (argv[0]); - argv[0] = path; + argv[0] = g_steal_pointer (&path); } - return argv; + return g_steal_pointer (&argv); } static SessionConfig * find_session_config (Seat *seat, const gchar *sessions_dir, const gchar *session_name) { - g_auto(GStrv) dirs = NULL; - int i; - g_return_val_if_fail (sessions_dir != NULL, NULL); g_return_val_if_fail (session_name != NULL, NULL); - dirs = g_strsplit (sessions_dir, ":", -1); - for (i = 0; dirs[i]; i++) + g_auto(GStrv) dirs = g_strsplit (sessions_dir, ":", -1); + for (int i = 0; dirs[i]; i++) { - g_autofree gchar *filename = NULL; - g_autofree gchar *path = NULL; const gchar *default_session_type = "x"; - SessionConfig *session_config; - g_autoptr(GError) error = NULL; - if (strcmp (dirs[i], WAYLAND_SESSIONS_DIR) == 0) default_session_type = "wayland"; - filename = g_strdup_printf ("%s.desktop", session_name); - path = g_build_filename (dirs[i], filename, NULL); - session_config = session_config_new_from_file (path, default_session_type, &error); + g_autofree gchar *filename = g_strdup_printf ("%s.desktop", session_name); + g_autofree gchar *path = g_build_filename (dirs[i], filename, NULL); + g_autoptr(GError) error = NULL; + SessionConfig *session_config = session_config_new_from_file (path, default_session_type, &error); if (session_config) return session_config; } @@ -991,19 +932,15 @@ find_session_config (Seat *seat, const gchar *sessions_dir, const gchar *session static void configure_session (Session *session, SessionConfig *config, const gchar *session_name, const gchar *language) { - gchar **desktop_names; - session_set_config (session, config); session_set_env (session, "XDG_SESSION_DESKTOP", session_name); session_set_env (session, "DESKTOP_SESSION", session_name); session_set_env (session, "GDMSESSION", session_name); - desktop_names = session_config_get_desktop_names (config); + gchar **desktop_names = session_config_get_desktop_names (config); if (desktop_names) { - gchar *value; - value = g_strjoinv (":", desktop_names); + g_autofree gchar *value = g_strjoinv (":", desktop_names); session_set_env (session, "XDG_CURRENT_DESKTOP", value); - g_free (value); } if (language && language[0] != '\0') { @@ -1015,24 +952,17 @@ configure_session (Session *session, SessionConfig *config, const gchar *session static Session * create_user_session (Seat *seat, const gchar *username, gboolean autostart) { - g_autoptr(User) user = NULL; - g_autofree gchar *sessions_dir = NULL; - const gchar *session_name, *language; - g_autoptr(SessionConfig) session_config = NULL; - g_autoptr(Session) session = NULL; - g_auto(GStrv) argv = NULL; - l_debug (seat, "Creating user session"); /* Load user preferences */ - user = accounts_get_user_by_name (username); + g_autoptr(User) user = accounts_get_user_by_name (username); if (!user) { l_debug (seat, "Can't login unknown user '%s'", username); return NULL; } - session_name = user_get_xsession (user); - language = user_get_language (user); + const gchar *session_name = user_get_xsession (user); + const gchar *language = user_get_language (user); /* Override session for autologin if configured */ if (autostart) @@ -1044,19 +974,19 @@ create_user_session (Seat *seat, const gchar *username, gboolean autostart) if (!session_name) session_name = seat_get_string_property (seat, "user-session"); - sessions_dir = config_get_string (config_get_instance (), "LightDM", "sessions-directory"); - session_config = find_session_config (seat, sessions_dir, session_name); + g_autofree gchar *sessions_dir = config_get_string (config_get_instance (), "LightDM", "sessions-directory"); + g_autoptr(SessionConfig) session_config = find_session_config (seat, sessions_dir, session_name); if (!session_config) { l_debug (seat, "Can't find session '%s'", session_name); return NULL; } - session = create_session (seat, autostart); + g_autoptr(Session) session = create_session (seat, autostart); configure_session (session, session_config, session_name, language); session_set_username (session, username); session_set_do_authenticate (session, TRUE); - argv = get_session_argv (seat, session_config, seat_get_string_property (seat, "session-wrapper")); + g_auto(GStrv) argv = get_session_argv (seat, session_config, seat_get_string_property (seat, "session-wrapper")); session_set_argv (session, argv); return g_steal_pointer (&session); @@ -1065,12 +995,10 @@ create_user_session (Seat *seat, const gchar *username, gboolean autostart) static void prepend_argv (gchar ***argv, const gchar *value) { - gchar **old_argv, **new_argv; - gint i; - - old_argv = *argv; - new_argv = g_malloc (sizeof (gchar *) * (g_strv_length (*argv) + 2)); + gchar **old_argv = *argv; + gchar **new_argv = g_malloc (sizeof (gchar *) * (g_strv_length (*argv) + 2)); new_argv[0] = g_strdup (value); + gint i; for (i = 0; old_argv[i]; i++) new_argv[i + 1] = old_argv[i]; new_argv[i + 1] = NULL; @@ -1082,36 +1010,28 @@ prepend_argv (gchar ***argv, const gchar *value) static Session * create_guest_session (Seat *seat, const gchar *session_name) { - const gchar *guest_wrapper; - g_autofree gchar *sessions_dir = NULL; - g_auto(GStrv) argv = NULL; - g_autoptr(SessionConfig) session_config = NULL; - g_autoptr(Session) session = NULL; - if (!session_name) session_name = seat_get_string_property (seat, "guest-session"); if (!session_name) session_name = seat_get_string_property (seat, "user-session"); - sessions_dir = config_get_string (config_get_instance (), "LightDM", "sessions-directory"); - session_config = find_session_config (seat, sessions_dir, session_name); + g_autofree gchar *sessions_dir = config_get_string (config_get_instance (), "LightDM", "sessions-directory"); + g_autoptr(SessionConfig) session_config = find_session_config (seat, sessions_dir, session_name); if (!session_config) { l_debug (seat, "Can't find session '%s'", session_name); return NULL; } - session = create_session (seat, TRUE); + g_autoptr(Session) session = create_session (seat, TRUE); configure_session (session, session_config, session_name, NULL); session_set_do_authenticate (session, TRUE); session_set_is_guest (session, TRUE); - argv = get_session_argv (seat, session_config, seat_get_string_property (seat, "session-wrapper")); - guest_wrapper = seat_get_string_property (seat, "guest-wrapper"); + g_auto(GStrv) argv = get_session_argv (seat, session_config, seat_get_string_property (seat, "session-wrapper")); + const gchar *guest_wrapper = seat_get_string_property (seat, "guest-wrapper"); if (guest_wrapper) { - gchar *path; - path = g_find_program_in_path (guest_wrapper); + g_autofree gchar *path = g_find_program_in_path (guest_wrapper); prepend_argv (&argv, path ? path : guest_wrapper); - g_free (path); } session_set_argv (session, argv); @@ -1123,10 +1043,8 @@ create_guest_session (Seat *seat, const gchar *session_name) static Session * get_greeter_session (Seat *seat, Greeter *greeter) { - GList *link; - /* Stop any greeters */ - for (link = seat->priv->sessions; link; link = link->next) + for (GList *link = seat->priv->sessions; link; link = link->next) { Session *session = link->data; @@ -1153,11 +1071,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) { - Session *session, *existing_session, *greeter_session; - const gchar *username; - DisplayServer *display_server; - /* Get the session to use */ + Session *session; if (greeter_get_guest_authenticated (greeter)) { session = g_object_ref (create_guest_session (seat, session_name)); @@ -1167,15 +1082,10 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi } else { - const gchar *language = NULL; - g_autoptr(SessionConfig) session_config = NULL; - User *user; - gchar *sessions_dir = NULL; - g_auto(GStrv) argv = NULL; - session = greeter_take_authentication_session (greeter); /* Get session command to run */ + g_autofree gchar *sessions_dir = NULL; switch (type) { case SESSION_TYPE_LOCAL: @@ -1187,7 +1097,8 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi } /* Load user preferences */ - user = session_get_user (session); + const gchar *language = NULL; + User *user = session_get_user (session); if (user) { const gchar *autologin_username; @@ -1207,8 +1118,7 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi if (user) user_set_xsession (session_get_user (session), session_name); - session_config = find_session_config (seat, sessions_dir, session_name); - g_free (sessions_dir); + g_autoptr(SessionConfig) session_config = find_session_config (seat, sessions_dir, session_name); if (!session_config) { l_debug (seat, "Can't find session '%s'", session_name); @@ -1216,7 +1126,7 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi } configure_session (session, session_config, session_name, language); - argv = get_session_argv (seat, session_config, seat_get_string_property (seat, "session-wrapper")); + g_auto(GStrv) argv = get_session_argv (seat, session_config, seat_get_string_property (seat, "session-wrapper")); session_set_argv (session, argv); } @@ -1225,8 +1135,8 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi seat->priv->session_to_activate = session; /* Return to existing session if it is open */ - username = session_get_username (session); - existing_session = find_user_session (seat, username, NULL); + const gchar *username = session_get_username (session); + Session *existing_session = find_user_session (seat, username, NULL); if (existing_session && session != existing_session) { l_debug (seat, "Returning to existing user session %s", username); @@ -1237,10 +1147,10 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi } /* If can re-use the display server, stop the greeter first */ - greeter_session = get_greeter_session (seat, greeter); + Session *greeter_session = get_greeter_session (seat, greeter); if (greeter_session) { - display_server = session_get_display_server (greeter_session); + DisplayServer *display_server = session_get_display_server (greeter_session); if (display_server && !greeter_get_resettable (greeter) && can_share_display_server (seat, display_server) && @@ -1259,7 +1169,7 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi } /* Otherwise start a new display server for this session */ - display_server = create_display_server (seat, session); + DisplayServer *display_server = create_display_server (seat, session); session_set_display_server (session, display_server); if (!start_display_server (seat, display_server)) { @@ -1273,37 +1183,23 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi static GreeterSession * create_greeter_session (Seat *seat) { - gchar *sessions_dir; - g_auto(GStrv) argv = NULL; - SessionConfig *session_config; - GreeterSession *greeter_session; - Greeter *greeter; - const gchar *greeter_wrapper; - const gchar *autologin_username; - const gchar *autologin_session; - int autologin_timeout; - gboolean autologin_guest; - l_debug (seat, "Creating greeter session"); - sessions_dir = config_get_string (config_get_instance (), "LightDM", "greeters-directory"); - session_config = find_session_config (seat, sessions_dir, seat_get_string_property (seat, "greeter-session")); - g_free (sessions_dir); + g_autofree gchar *sessions_dir = config_get_string (config_get_instance (), "LightDM", "greeters-directory"); + g_autoptr(SessionConfig) session_config = find_session_config (seat, sessions_dir, seat_get_string_property (seat, "greeter-session")); if (!session_config) return NULL; - argv = get_session_argv (seat, session_config, NULL); - greeter_wrapper = seat_get_string_property (seat, "greeter-wrapper"); + g_auto(GStrv) argv = get_session_argv (seat, session_config, NULL); + const gchar *greeter_wrapper = seat_get_string_property (seat, "greeter-wrapper"); if (greeter_wrapper) { - gchar *path; - path = g_find_program_in_path (greeter_wrapper); + g_autofree gchar *path = g_find_program_in_path (greeter_wrapper); prepend_argv (&argv, path ? path : greeter_wrapper); - g_free (path); } - greeter_session = SEAT_GET_CLASS (seat)->create_greeter_session (seat); - greeter = greeter_session_get_greeter (greeter_session); + 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)); g_signal_connect (greeter, GREETER_SIGNAL_ACTIVE_USERNAME_CHANGED, G_CALLBACK (greeter_active_username_changed_cb), seat); @@ -1316,10 +1212,8 @@ create_greeter_session (Seat *seat) session_set_pam_service (SESSION (greeter_session), seat_get_string_property (seat, "pam-greeter-service")); if (getuid () == 0) { - gchar *greeter_user; - greeter_user = config_get_string (config_get_instance (), "LightDM", "greeter-user"); + g_autofree gchar *greeter_user = config_get_string (config_get_instance (), "LightDM", "greeter-user"); session_set_username (SESSION (greeter_session), greeter_user); - g_free (greeter_user); } else { @@ -1339,21 +1233,18 @@ create_greeter_session (Seat *seat) set_greeter_hints (seat, greeter); /* Configure for automatic login */ - autologin_username = seat_get_string_property (seat, "autologin-user"); + const gchar *autologin_username = seat_get_string_property (seat, "autologin-user"); if (g_strcmp0 (autologin_username, "") == 0) autologin_username = NULL; - autologin_session = seat_get_string_property (seat, "autologin-session"); + const gchar *autologin_session = seat_get_string_property (seat, "autologin-session"); if (g_strcmp0 (autologin_session, "") == 0) autologin_session = NULL; - autologin_timeout = seat_get_integer_property (seat, "autologin-user-timeout"); - autologin_guest = seat_get_boolean_property (seat, "autologin-guest"); + int autologin_timeout = seat_get_integer_property (seat, "autologin-user-timeout"); + gboolean autologin_guest = seat_get_boolean_property (seat, "autologin-guest"); if (autologin_timeout > 0) { - gchar *value; - - value = g_strdup_printf ("%d", autologin_timeout); + g_autofree gchar *value = g_strdup_printf ("%d", autologin_timeout); greeter_set_hint (greeter, "autologin-timeout", value); - g_free (value); if (autologin_username) greeter_set_hint (greeter, "autologin-user", autologin_username); if (autologin_session) @@ -1368,9 +1259,7 @@ create_greeter_session (Seat *seat) static Session * find_session_for_display_server (Seat *seat, DisplayServer *display_server) { - GList *link; - - for (link = seat->priv->sessions; link; link = link->next) + for (GList *link = seat->priv->sessions; link; link = link->next) { Session *session = link->data; @@ -1386,11 +1275,8 @@ find_session_for_display_server (Seat *seat, DisplayServer *display_server) static void display_server_ready_cb (DisplayServer *display_server, Seat *seat) { - const gchar *script; - Session *session; - /* Run setup script */ - script = seat_get_string_property (seat, "display-setup-script"); + const gchar *script = seat_get_string_property (seat, "display-setup-script"); if (script && !run_script (seat, display_server, script, NULL)) { l_debug (seat, "Stopping display server due to failed setup script"); @@ -1401,7 +1287,7 @@ display_server_ready_cb (DisplayServer *display_server, Seat *seat) emit_upstart_signal ("login-session-start"); /* Start the session waiting for this display server */ - session = find_session_for_display_server (seat, display_server); + Session *session = find_session_for_display_server (seat, display_server); if (session) { if (session_get_is_authenticated (session)) @@ -1425,16 +1311,14 @@ display_server_ready_cb (DisplayServer *display_server, Seat *seat) static DisplayServer * create_display_server (Seat *seat, Session *session) { - DisplayServer *display_server; - l_debug (seat, "Creating display server of type %s", session_get_session_type (session)); - display_server = SEAT_GET_CLASS (seat)->create_display_server (seat, session); + DisplayServer *display_server = SEAT_GET_CLASS (seat)->create_display_server (seat, session); if (!display_server) return NULL; /* Remember this display server */ - if (!g_list_find (seat->priv->display_servers, display_server)) + if (!g_list_find (seat->priv->display_servers, display_server)) { seat->priv->display_servers = g_list_append (seat->priv->display_servers, display_server); g_signal_connect (display_server, DISPLAY_SERVER_SIGNAL_READY, G_CALLBACK (display_server_ready_cb), seat); @@ -1459,16 +1343,13 @@ start_display_server (Seat *seat, DisplayServer *display_server) gboolean seat_switch_to_greeter (Seat *seat) { - GreeterSession *greeter_session; - DisplayServer *display_server; - g_return_val_if_fail (seat != NULL, FALSE); if (!seat_get_can_switch (seat) && seat->priv->sessions != NULL) return FALSE; /* Switch to greeter if one open */ - greeter_session = find_greeter_session (seat); + GreeterSession *greeter_session = find_greeter_session (seat); if (greeter_session) { l_debug (seat, "Switching to existing greeter"); @@ -1483,7 +1364,7 @@ seat_switch_to_greeter (Seat *seat) g_clear_object (&seat->priv->session_to_activate); seat->priv->session_to_activate = g_object_ref (SESSION (greeter_session)); - display_server = create_display_server (seat, SESSION (greeter_session)); + DisplayServer *display_server = create_display_server (seat, SESSION (greeter_session)); if (!display_server) { g_clear_object (&seat->priv->session_to_activate); return FALSE; @@ -1496,17 +1377,10 @@ seat_switch_to_greeter (Seat *seat) static void switch_authentication_complete_cb (Session *session, Seat *seat) { - GreeterSession *greeter_session; - Greeter *greeter; - DisplayServer *display_server; - gboolean existing = FALSE; - /* If authenticated, then unlock existing session or start new one */ if (session_get_is_authenticated (session)) { - Session *s; - - s = find_user_session (seat, session_get_username (session), session); + Session *s = find_user_session (seat, session_get_username (session), session); if (s) { l_debug (seat, "Session authenticated, switching to existing user session"); @@ -1519,7 +1393,7 @@ switch_authentication_complete_cb (Session *session, Seat *seat) 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); - display_server = create_display_server (seat, session); + DisplayServer *display_server = create_display_server (seat, session); session_set_display_server (session, display_server); start_display_server (seat, display_server); } @@ -1530,7 +1404,8 @@ switch_authentication_complete_cb (Session *session, Seat *seat) session_stop (session); /* See if we already have a greeter up and reuse it if so */ - greeter_session = find_resettable_greeter (seat); + GreeterSession *greeter_session = find_resettable_greeter (seat); + gboolean existing = FALSE; if (greeter_session) { l_debug (seat, "Switching to existing greeter to authenticate session"); @@ -1542,7 +1417,7 @@ switch_authentication_complete_cb (Session *session, Seat *seat) l_debug (seat, "Starting greeter to authenticate session"); greeter_session = create_greeter_session (seat); } - greeter = greeter_session_get_greeter (greeter_session); + Greeter *greeter = greeter_session_get_greeter (greeter_session); if (session_get_is_guest (session)) greeter_set_hint (greeter, "select-guest", "true"); @@ -1559,7 +1434,7 @@ switch_authentication_complete_cb (Session *session, Seat *seat) g_clear_object (&seat->priv->session_to_activate); seat->priv->session_to_activate = g_object_ref (SESSION (greeter_session)); - display_server = create_display_server (seat, SESSION (greeter_session)); + DisplayServer *display_server = create_display_server (seat, SESSION (greeter_session)); session_set_display_server (SESSION (greeter_session), display_server); start_display_server (seat, display_server); } @@ -1568,8 +1443,6 @@ switch_authentication_complete_cb (Session *session, Seat *seat) gboolean seat_switch_to_user (Seat *seat, const gchar *username, const gchar *session_name) { - Session *session; - g_return_val_if_fail (seat != NULL, FALSE); g_return_val_if_fail (username != NULL, FALSE); @@ -1577,7 +1450,7 @@ seat_switch_to_user (Seat *seat, const gchar *username, const gchar *session_nam return FALSE; /* If we're already on this session, then ignore */ - session = find_user_session (seat, username, NULL); + Session *session = find_user_session (seat, username, NULL); if (session && session == seat->priv->active_session) return TRUE; @@ -1594,9 +1467,7 @@ seat_switch_to_user (Seat *seat, const gchar *username, const gchar *session_nam static Session * find_guest_session (Seat *seat) { - GList *link; - - for (link = seat->priv->sessions; link; link = link->next) + for (GList *link = seat->priv->sessions; link; link = link->next) { Session *session = link->data; if (!session_get_is_stopping (session) && session_get_is_guest (session)) @@ -1609,16 +1480,13 @@ find_guest_session (Seat *seat) gboolean seat_switch_to_guest (Seat *seat, const gchar *session_name) { - Session *session; - DisplayServer *display_server; - g_return_val_if_fail (seat != NULL, FALSE); if (!seat_get_can_switch (seat) || !seat_get_allow_guest (seat)) return FALSE; /* Switch to session if one open */ - session = find_guest_session (seat); + Session *session = find_guest_session (seat); if (session) { l_debug (seat, "Switching to existing guest account %s", session_get_username (session)); @@ -1630,7 +1498,7 @@ seat_switch_to_guest (Seat *seat, const gchar *session_name) if (!session) return FALSE; - display_server = create_display_server (seat, session); + 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); @@ -1643,12 +1511,6 @@ seat_switch_to_guest (Seat *seat, const gchar *session_name) gboolean seat_lock (Seat *seat, const gchar *username) { - GreeterSession *greeter_session; - Greeter *greeter; - DisplayServer *display_server = NULL; - gboolean reset_existing = FALSE; - gboolean reuse_xserver = FALSE; - g_return_val_if_fail (seat != NULL, FALSE); if (!seat_get_can_switch (seat)) @@ -1659,7 +1521,10 @@ seat_lock (Seat *seat, const gchar *username) l_debug (seat, "Locking"); /* Switch to greeter we can reuse */ - greeter_session = find_resettable_greeter (seat); + gboolean reset_existing = FALSE; + gboolean reuse_xserver = FALSE; + DisplayServer *display_server = NULL; + GreeterSession *greeter_session = find_resettable_greeter (seat); if (greeter_session) { l_debug (seat, "Switching to existing greeter"); @@ -1680,12 +1545,12 @@ seat_lock (Seat *seat, const gchar *username) } reuse_xserver = TRUE; } - + greeter_session = create_greeter_session (seat); if (!greeter_session) return FALSE; } - greeter = greeter_session_get_greeter (greeter_session); + Greeter *greeter = greeter_session_get_greeter (greeter_session); greeter_set_hint (greeter, "lock-screen", "true"); if (username) @@ -1745,21 +1610,16 @@ seat_real_setup (Seat *seat) static gboolean seat_real_start (Seat *seat) { - const gchar *autologin_username; - int autologin_timeout; - gboolean autologin_guest; - gboolean autologin_in_background; - Session *session = NULL, *background_session = NULL; - /* Get autologin settings */ - autologin_username = seat_get_string_property (seat, "autologin-user"); + const gchar *autologin_username = seat_get_string_property (seat, "autologin-user"); if (g_strcmp0 (autologin_username, "") == 0) autologin_username = NULL; - autologin_timeout = seat_get_integer_property (seat, "autologin-user-timeout"); - autologin_guest = seat_get_boolean_property (seat, "autologin-guest"); - autologin_in_background = seat_get_boolean_property (seat, "autologin-in-background"); + int autologin_timeout = seat_get_integer_property (seat, "autologin-user-timeout"); + gboolean autologin_guest = seat_get_boolean_property (seat, "autologin-guest"); + gboolean autologin_in_background = seat_get_boolean_property (seat, "autologin-in-background"); /* Autologin if configured */ + Session *session = NULL, *background_session = NULL; if (autologin_timeout == 0 || autologin_in_background) { if (autologin_guest) @@ -1779,12 +1639,10 @@ seat_real_start (Seat *seat) if (session) { - DisplayServer *display_server; - g_clear_object (&seat->priv->session_to_activate); seat->priv->session_to_activate = g_object_ref (session); - display_server = create_display_server (seat, session); + DisplayServer *display_server = create_display_server (seat, session); session_set_display_server (session, display_server); if (!display_server || !start_display_server (seat, display_server)) { @@ -1800,10 +1658,7 @@ seat_real_start (Seat *seat) /* Fallback to a greeter */ if (!session) { - GreeterSession *greeter_session; - DisplayServer *display_server; - - greeter_session = create_greeter_session (seat); + GreeterSession *greeter_session = create_greeter_session (seat); if (!greeter_session) { l_debug (seat, "Failed to create greeter session"); @@ -1814,7 +1669,7 @@ seat_real_start (Seat *seat) session = SESSION (greeter_session); seat->priv->session_to_activate = g_object_ref (session); - display_server = create_display_server (seat, session); + DisplayServer *display_server = create_display_server (seat, session); session_set_display_server (session, display_server); if (!display_server || !start_display_server (seat, display_server)) { @@ -1836,9 +1691,7 @@ seat_real_start (Seat *seat) /* Start background session */ if (background_session) { - DisplayServer *background_display_server; - - background_display_server = create_display_server (seat, background_session); + DisplayServer *background_display_server = create_display_server (seat, background_session); session_set_display_server (background_session, background_display_server); if (!start_display_server (seat, background_display_server)) l_warning (seat, "Failed to start display server for background session"); @@ -1856,14 +1709,11 @@ seat_real_create_display_server (Seat *seat, Session *session) static gboolean seat_real_display_server_is_used (Seat *seat, DisplayServer *display_server) { - GList *link; - - for (link = seat->priv->sessions; link; link = link->next) + for (GList *link = seat->priv->sessions; link; link = link->next) { Session *session = link->data; - DisplayServer *d; - d = session_get_display_server (session); + DisplayServer *d = session_get_display_server (session); if (!d) continue; @@ -1889,9 +1739,7 @@ create_session_cb (Greeter *greeter, Seat *seat) static Greeter * create_greeter_cb (Session *session, Seat *seat) { - Greeter *greeter; - - greeter = greeter_new (); + g_autoptr(Greeter) greeter = greeter_new (); greeter_set_pam_services (greeter, seat_get_string_property (seat, "pam-service"), @@ -1903,18 +1751,16 @@ create_greeter_cb (Session *session, Seat *seat) greeter_set_allow_guest (greeter, seat_get_allow_guest (seat)); set_greeter_hints (seat, greeter); - return greeter; + return g_steal_pointer (&greeter); } static Session * seat_real_create_session (Seat *seat) { - Session *session; - - session = session_new (); + g_autoptr(Session) session = session_new (); g_signal_connect (session, SESSION_SIGNAL_CREATE_GREETER, G_CALLBACK (create_greeter_cb), seat); - return session; + return g_steal_pointer (&session); } static void @@ -1936,18 +1782,16 @@ seat_real_get_active_session (Seat *seat) static void seat_real_stop (Seat *seat) { - GList *list, *link; - check_stopped (seat); if (seat->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 */ - list = g_list_copy (seat->priv->display_servers); - for (link = list; link; link = link->next) + GList *list = g_list_copy (seat->priv->display_servers); + for (GList *link = list; link; link = link->next) g_object_ref (link->data); - for (link = list; link; link = link->next) + for (GList *link = list; link; link = link->next) { DisplayServer *display_server = link->data; if (!display_server_get_is_stopping (display_server)) @@ -1958,9 +1802,9 @@ seat_real_stop (Seat *seat) } g_list_free_full (list, g_object_unref); list = g_list_copy (seat->priv->sessions); - for (link = list; link; link = link->next) + for (GList *link = list; link; link = link->next) g_object_ref (link->data); - for (link = list; link; link = link->next) + for (GList *link = list; link; link = link->next) { Session *session = link->data; if (!session_get_is_stopping (session)) @@ -1984,17 +1828,16 @@ static void seat_finalize (GObject *object) { Seat *self = SEAT (object); - GList *link; g_free (self->priv->name); g_hash_table_unref (self->priv->properties); - for (link = self->priv->display_servers; link; link = link->next) + for (GList *link = self->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 (link = self->priv->sessions; link; link = link->next) + for (GList *link = self->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); @@ -2016,7 +1859,7 @@ seat_class_init (SeatClass *klass) klass->setup = seat_real_setup; klass->start = seat_real_start; klass->create_display_server = seat_real_create_display_server; - klass->display_server_is_used = seat_real_display_server_is_used; + klass->display_server_is_used = seat_real_display_server_is_used; klass->create_greeter_session = seat_real_create_greeter_session; klass->create_session = seat_real_create_session; klass->set_active_session = seat_real_set_active_session; diff --git a/src/session-child.c b/src/session-child.c index d4035366..5d77c5a5 100644 --- a/src/session-child.c +++ b/src/session-child.c @@ -56,9 +56,7 @@ write_data (const void *buf, size_t count) static void write_string (const char *value) { - int length; - - length = value ? strlen (value) : -1; + int length = value ? strlen (value) : -1; write_data (&length, sizeof (length)); if (value) write_data (value, sizeof (char) * length); @@ -67,9 +65,7 @@ write_string (const char *value) static ssize_t read_data (void *buf, size_t count) { - ssize_t n_read; - - n_read = read (from_daemon_output, buf, count); + ssize_t n_read = read (from_daemon_output, buf, count); if (n_read < 0) g_printerr ("Error reading from daemon: %s\n", strerror (errno)); @@ -80,8 +76,6 @@ static gchar * read_string_full (void* (*alloc_fn)(size_t n)) { int length; - char *value; - if (read_data (&length, sizeof (length)) <= 0) return NULL; if (length < 0) @@ -92,7 +86,7 @@ read_string_full (void* (*alloc_fn)(size_t n)) return NULL; } - value = (*alloc_fn) (sizeof (char) * (length + 1)); + gchar *value = (*alloc_fn) (sizeof (gchar) * (length + 1)); read_data (value, length); value[length] = '\0'; @@ -108,11 +102,6 @@ read_string (void) static int pam_conv_cb (int msg_length, const struct pam_message **msg, struct pam_response **resp, void *app_data) { - int i, error; - gboolean auth_complete = FALSE; - struct pam_response *response; - gchar *username = NULL; - /* FIXME: We don't support communication after pam_authenticate completes */ if (authentication_complete) return PAM_SUCCESS; @@ -120,7 +109,7 @@ pam_conv_cb (int msg_length, const struct pam_message **msg, struct pam_response /* Cancel authentication if requiring input */ if (!is_interactive) { - for (i = 0; i < msg_length; i++) + for (int i = 0; i < msg_length; i++) { if (msg[i]->msg_style == PAM_PROMPT_ECHO_ON || msg[i]->msg_style == PAM_PROMPT_ECHO_OFF) { @@ -134,13 +123,15 @@ pam_conv_cb (int msg_length, const struct pam_message **msg, struct pam_response } /* Check if we changed user */ + gchar *username = NULL; pam_get_item (pam_handle, PAM_USER, (const void **) &username); /* Notify the daemon */ write_string (username); + gboolean auth_complete = FALSE; write_data (&auth_complete, sizeof (auth_complete)); write_data (&msg_length, sizeof (msg_length)); - for (i = 0; i < msg_length; i++) + for (int i = 0; i < msg_length; i++) { const struct pam_message *m = msg[i]; write_data (&m->msg_style, sizeof (m->msg_style)); @@ -148,11 +139,12 @@ pam_conv_cb (int msg_length, const struct pam_message **msg, struct pam_response } /* Get response */ + int error; read_data (&error, sizeof (error)); if (error != PAM_SUCCESS) return error; - response = calloc (msg_length, sizeof (struct pam_response)); - for (i = 0; i < msg_length; i++) + struct pam_response *response = calloc (msg_length, sizeof (struct pam_response)); + for (int i = 0; i < msg_length; i++) { struct pam_response *r = &response[i]; // callers of this function inside pam will expect to be able to call @@ -178,25 +170,23 @@ signal_cb (int signum) static XAuthority * read_xauth (void) { - gchar *x_authority_name; - guint16 x_authority_family; - guint8 *x_authority_address; - gsize x_authority_address_length; - gchar *x_authority_number; - guint8 *x_authority_data; - gsize x_authority_data_length; - - x_authority_name = read_string (); + g_autofree gchar *x_authority_name = read_string (); if (!x_authority_name) return NULL; + guint16 x_authority_family; read_data (&x_authority_family, sizeof (x_authority_family)); + + gsize x_authority_address_length; read_data (&x_authority_address_length, sizeof (x_authority_address_length)); - x_authority_address = g_malloc (x_authority_address_length); + g_autofree guint8 *x_authority_address = g_malloc (x_authority_address_length); read_data (x_authority_address, x_authority_address_length); - x_authority_number = read_string (); + + g_autofree gchar *x_authority_number = read_string (); + + gsize x_authority_data_length; read_data (&x_authority_data_length, sizeof (x_authority_data_length)); - x_authority_data = g_malloc (x_authority_data_length); + g_autofree guint8 *x_authority_data = g_malloc (x_authority_data_length); read_data (x_authority_data, x_authority_data_length); return x_authority_new (x_authority_family, x_authority_address, x_authority_address_length, x_authority_number, x_authority_name, x_authority_data, x_authority_data_length); @@ -207,7 +197,6 @@ static void updwtmpx (const gchar *wtmp_file, struct utmpx *ut) { struct utmp u; - memset (&u, 0, sizeof (u)); u.ut_type = ut->ut_type; u.ut_pid = ut->ut_pid; @@ -229,20 +218,18 @@ updwtmpx (const gchar *wtmp_file, struct utmpx *ut) static void audit_event (int type, const gchar *username, uid_t uid, const gchar *remote_host_name, const gchar *tty, gboolean success) { - int auditfd, result; - const char *op = NULL; - - auditfd = audit_open (); + int auditfd = audit_open (); if (auditfd < 0) { g_printerr ("Error opening audit socket: %s\n", strerror (errno)); return; } + const char *op = NULL; if (type == AUDIT_USER_LOGIN) op = "login"; else if (type == AUDIT_USER_LOGOUT) op = "logout"; - result = success == TRUE ? 1 : 0; + int result = success == TRUE ? 1 : 0; if (audit_log_acct_message (auditfd, type, NULL, op, username, uid, remote_host_name, NULL, tty, result) <= 0) g_printerr ("Error writing audit message: %s\n", strerror (errno)); @@ -254,52 +241,6 @@ audit_event (int type, const gchar *username, uid_t uid, const gchar *remote_hos int session_child_run (int argc, char **argv) { - struct pam_conv conversation = { pam_conv_cb, NULL }; - int i, version, fd, result; - gboolean auth_complete = TRUE; - User *user = NULL; - g_autofree gchar *log_filename = NULL; - LogMode log_mode = LOG_MODE_BACKUP_AND_TRUNCATE; - gsize env_length; - gsize command_argc; - gchar **command_argv; - GVariantBuilder ck_parameters; - int return_code; - int authentication_result; - gchar *authentication_result_string; - gchar *service; - gchar *username; - gchar *tty; - gchar *remote_host_name; - gchar *xdisplay; - XAuthority *x_authority = NULL; - gchar *x_authority_filename; - GDBusConnection *bus; - const gchar *login1_session_id = NULL; - gchar *console_kit_cookie = NULL; - const gchar *locale_value; - static const gchar * const locale_var_names[] = { - "LC_PAPER", - "LC_NAME", - "LC_ADDRESS", - "LC_TELEPHONE", - "LC_MEASUREMENT", - "LC_IDENTIFICATION", - "LC_COLLATE", - "LC_CTYPE", - "LC_MONETARY", - "LC_NUMERIC", - "LC_TIME", - "LC_MESSAGES", - "LC_ALL", - "LANG", - NULL - }; - gid_t gid; - uid_t uid; - const gchar *home_directory; - g_autoptr(GError) error = NULL; - #if !defined(GLIB_VERSION_2_36) g_type_init (); #endif @@ -311,7 +252,7 @@ session_child_run (int argc, char **argv) } /* Make input non-blocking */ - fd = open ("/dev/null", O_RDONLY); + int fd = open ("/dev/null", O_RDONLY); dup2 (fd, STDIN_FILENO); close (fd); @@ -339,20 +280,22 @@ session_child_run (int argc, char **argv) fcntl (to_daemon_input, F_SETFD, FD_CLOEXEC); /* Read a version number so we can handle upgrades (i.e. a newer version of session child is run for an old daemon */ + int version; read_data (&version, sizeof (version)); - service = read_string (); - username = read_string (); + g_autofree gchar *service = read_string (); + g_autofree gchar *username = read_string (); read_data (&do_authenticate, sizeof (do_authenticate)); read_data (&is_interactive, sizeof (is_interactive)); - read_string (); /* Used to be class, now we just use the environment variable */ - tty = read_string (); - remote_host_name = read_string (); - xdisplay = read_string (); - x_authority = read_xauth (); + g_autofree gchar *unused_class = read_string (); /* Used to be class, now we just use the environment variable */ + g_autofree gchar *tty = read_string (); + g_autofree gchar *remote_host_name = read_string (); + g_autofree gchar *xdisplay = read_string (); + g_autoptr(XAuthority) x_authority = read_xauth (); /* Setup PAM */ - result = pam_start (service, username, &conversation, &pam_handle); + struct pam_conv conversation = { pam_conv_cb, NULL }; + int result = pam_start (service, username, &conversation, &pam_handle); if (result != PAM_SUCCESS) { g_printerr ("Failed to start PAM: %s", pam_strerror (NULL, result)); @@ -382,6 +325,7 @@ session_child_run (int argc, char **argv) #endif /* Authenticate */ + int authentication_result = PAM_SUCCESS; if (do_authenticate) { const gchar *new_username; @@ -436,6 +380,7 @@ session_child_run (int argc, char **argv) authentication_result = PAM_SUCCESS; authentication_complete = TRUE; + User *user = NULL; if (authentication_result == PAM_SUCCESS) { /* Fail authentication if user doesn't actually exist */ @@ -455,8 +400,26 @@ session_child_run (int argc, char **argv) pam_putenv (pam_handle, g_strdup_printf ("SHELL=%s", user_get_shell (user))); /* Let the greeter and user session inherit the system default locale */ - for (i = 0; locale_var_names[i] != NULL; i++) + static const gchar * const locale_var_names[] = { + "LC_PAPER", + "LC_NAME", + "LC_ADDRESS", + "LC_TELEPHONE", + "LC_MEASUREMENT", + "LC_IDENTIFICATION", + "LC_COLLATE", + "LC_CTYPE", + "LC_MONETARY", + "LC_NUMERIC", + "LC_TIME", + "LC_MESSAGES", + "LC_ALL", + "LANG", + NULL + }; + for (int i = 0; locale_var_names[i] != NULL; i++) { + const gchar *locale_value; if ((locale_value = g_getenv (locale_var_names[i])) != NULL) { g_autofree gchar *locale_var = g_strdup_printf ("%s=%s", locale_var_names[i], locale_value); @@ -466,10 +429,11 @@ session_child_run (int argc, char **argv) } } - authentication_result_string = g_strdup (pam_strerror (pam_handle, authentication_result)); + g_autofree gchar *authentication_result_string = g_strdup (pam_strerror (pam_handle, authentication_result)); /* Report authentication result */ write_string (username); + gboolean auth_complete = TRUE; write_data (&auth_complete, sizeof (auth_complete)); write_data (&authentication_result, sizeof (authentication_result)); write_string (authentication_result_string); @@ -490,7 +454,8 @@ session_child_run (int argc, char **argv) } /* Get the command to run (blocks) */ - log_filename = read_string (); + g_autofree gchar *log_filename = read_string (); + LogMode log_mode = LOG_MODE_BACKUP_AND_TRUNCATE; if (version >= 3) read_data (&log_mode, sizeof (log_mode)); if (version >= 1) @@ -498,7 +463,7 @@ session_child_run (int argc, char **argv) g_free (tty); tty = read_string (); } - x_authority_filename = read_string (); + g_autofree gchar *x_authority_filename = read_string (); if (version >= 1) { g_free (xdisplay); @@ -506,11 +471,14 @@ session_child_run (int argc, char **argv) g_clear_object (&x_authority); x_authority = read_xauth (); } + gsize env_length; read_data (&env_length, sizeof (env_length)); - for (i = 0; i < env_length; i++) + for (int i = 0; i < env_length; i++) pam_putenv (pam_handle, read_string ()); + gsize command_argc; read_data (&command_argc, sizeof (command_argc)); - command_argv = g_malloc (sizeof (gchar *) * (command_argc + 1)); + g_auto(GStrv) command_argv = g_malloc (sizeof (gchar *) * (command_argc + 1)); + int i; for (i = 0; i < command_argc; i++) command_argv[i] = read_string (); command_argv[i] = NULL; @@ -528,7 +496,7 @@ session_child_run (int argc, char **argv) { if (g_path_is_absolute (log_filename)) { - fd = log_file_open (log_filename, log_mode); + int fd = log_file_open (log_filename, log_mode); dup2 (fd, STDERR_FILENO); close (fd); g_clear_pointer (&log_filename, g_free); @@ -536,7 +504,7 @@ session_child_run (int argc, char **argv) } else { - fd = open ("/dev/null", O_WRONLY); + int fd = open ("/dev/null", O_WRONLY); dup2 (fd, STDERR_FILENO); close (fd); } @@ -570,7 +538,8 @@ session_child_run (int argc, char **argv) } /* Open a connection to the system bus for ConsoleKit - we must keep it open or CK will close the session */ - bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); + g_autoptr(GError) error = NULL; + g_autoptr(GDBusConnection) bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (error) g_printerr ("Unable to contact system bus: %s", error->message); if (!bus) @@ -580,7 +549,8 @@ session_child_run (int argc, char **argv) } /* Check what logind session we are, or fallback to ConsoleKit */ - login1_session_id = pam_getenv (pam_handle, "XDG_SESSION_ID"); + const gchar *login1_session_id = pam_getenv (pam_handle, "XDG_SESSION_ID"); + g_autofree gchar *console_kit_cookie = NULL; if (login1_session_id) { write_string (login1_session_id); @@ -589,6 +559,7 @@ session_child_run (int argc, char **argv) } else { + GVariantBuilder ck_parameters; g_variant_builder_init (&ck_parameters, G_VARIANT_TYPE ("(a(sv))")); g_variant_builder_open (&ck_parameters, G_VARIANT_TYPE ("a(sv)")); g_variant_builder_add (&ck_parameters, "(sv)", "unix-user", g_variant_new_int32 (user_get_uid (user))); @@ -630,14 +601,12 @@ session_child_run (int argc, char **argv) /* Write X authority */ if (x_authority) { - gboolean drop_privileges, result; - g_autofree gchar *value = NULL; - g_autoptr(GError) error = NULL; - - drop_privileges = geteuid () == 0; + gboolean drop_privileges = geteuid () == 0; if (drop_privileges) privileges_drop (user_get_uid (user), user_get_gid (user)); - result = x_authority_write (x_authority, XAUTH_WRITE_MODE_REPLACE, x_authority_filename, &error); + + g_autoptr(GError) error = NULL; + gboolean result = x_authority_write (x_authority, XAUTH_WRITE_MODE_REPLACE, x_authority_filename, &error); if (drop_privileges) privileges_reclaim (); @@ -649,7 +618,7 @@ session_child_run (int argc, char **argv) return EXIT_FAILURE; } - value = g_strdup_printf ("XAUTHORITY=%s", x_authority_filename); + g_autofree gchar *value = g_strdup_printf ("XAUTHORITY=%s", x_authority_filename); pam_putenv (pam_handle, value); } @@ -657,9 +626,9 @@ session_child_run (int argc, char **argv) signal (SIGTERM, signal_cb); /* Run the command as the authenticated user */ - uid = user_get_uid (user); - gid = user_get_gid (user); - home_directory = user_get_home_directory (user); + uid_t uid = user_get_uid (user); + gid_t gid = user_get_gid (user); + const gchar *home_directory = user_get_home_directory (user); child_pid = fork (); if (child_pid == 0) { @@ -686,7 +655,7 @@ session_child_run (int argc, char **argv) if (log_filename) { - fd = log_file_open (log_filename, log_mode); + int fd = log_file_open (log_filename, log_mode); if (fd >= 0) { dup2 (fd, STDERR_FILENO); @@ -703,6 +672,7 @@ session_child_run (int argc, char **argv) } /* Bail out if failed to fork */ + int return_code = EXIT_SUCCESS; if (child_pid < 0) { g_printerr ("Failed to fork session child process: %s\n", strerror (errno)); @@ -712,14 +682,10 @@ session_child_run (int argc, char **argv) /* Wait for the command to complete (blocks) */ if (child_pid > 0) { - int child_status; - /* Log to utmp */ if (g_strcmp0 (pam_getenv (pam_handle, "XDG_SESSION_CLASS"), "greeter") != 0) { struct utmpx ut; - struct timeval tv; - memset (&ut, 0, sizeof (ut)); ut.ut_type = USER_PROCESS; ut.ut_pid = child_pid; @@ -732,6 +698,7 @@ session_child_run (int argc, char **argv) strncpy (ut.ut_host, xdisplay, sizeof (ut.ut_host)); else if (remote_host_name) strncpy (ut.ut_host, remote_host_name, sizeof (ut.ut_host)); + struct timeval tv; gettimeofday (&tv, NULL); ut.ut_tv.tv_sec = tv.tv_sec; ut.ut_tv.tv_usec = tv.tv_usec; @@ -743,11 +710,12 @@ session_child_run (int argc, char **argv) endutxent (); updwtmpx ("/var/log/wtmp", &ut); -#if HAVE_LIBAUDIT +#if HAVE_LIBAUDIT audit_event (AUDIT_USER_LOGIN, username, uid, remote_host_name, tty, TRUE); #endif } + int child_status; waitpid (child_pid, &child_status, 0); child_pid = 0; if (WIFEXITED (child_status)) @@ -759,8 +727,6 @@ session_child_run (int argc, char **argv) if (g_strcmp0 (pam_getenv (pam_handle, "XDG_SESSION_CLASS"), "greeter") != 0) { struct utmpx ut; - struct timeval tv; - memset (&ut, 0, sizeof (ut)); ut.ut_type = DEAD_PROCESS; ut.ut_pid = child_pid; @@ -773,6 +739,7 @@ session_child_run (int argc, char **argv) strncpy (ut.ut_host, xdisplay, sizeof (ut.ut_host)); else if (remote_host_name) strncpy (ut.ut_host, remote_host_name, sizeof (ut.ut_host)); + struct timeval tv; gettimeofday (&tv, NULL); ut.ut_tv.tv_sec = tv.tv_sec; ut.ut_tv.tv_usec = tv.tv_usec; @@ -793,13 +760,12 @@ session_child_run (int argc, char **argv) /* Remove X authority */ if (x_authority) { - gboolean drop_privileges, result; - g_autoptr(GError) error = NULL; - - drop_privileges = geteuid () == 0; + gboolean drop_privileges = geteuid () == 0; if (drop_privileges) privileges_drop (user_get_uid (user), user_get_gid (user)); - result = x_authority_write (x_authority, XAUTH_WRITE_MODE_REMOVE, x_authority_filename, &error); + + g_autoptr(GError) error = NULL; + gboolean result = x_authority_write (x_authority, XAUTH_WRITE_MODE_REMOVE, x_authority_filename, &error); if (drop_privileges) privileges_reclaim (); diff --git a/src/session-config.c b/src/session-config.c index 13f77cc9..e1b56f0e 100644 --- a/src/session-config.c +++ b/src/session-config.c @@ -31,14 +31,10 @@ G_DEFINE_TYPE (SessionConfig, session_config, G_TYPE_OBJECT) SessionConfig * session_config_new_from_file (const gchar *filename, const gchar *default_session_type, GError **error) { - GKeyFile *desktop_file; - SessionConfig *config; - gchar *command; - - desktop_file = g_key_file_new (); + g_autoptr(GKeyFile) desktop_file = g_key_file_new (); if (!g_key_file_load_from_file (desktop_file, filename, G_KEY_FILE_NONE, error)) return NULL; - command = g_key_file_get_string (desktop_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL); + g_autofree gchar *command = g_key_file_get_string (desktop_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL); if (!command) { g_set_error (error, @@ -48,8 +44,8 @@ session_config_new_from_file (const gchar *filename, const gchar *default_sessio return NULL; } - config = g_object_new (SESSION_CONFIG_TYPE, NULL); - config->priv->command = command; + 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); @@ -69,9 +65,7 @@ session_config_new_from_file (const gchar *filename, const gchar *default_sessio } config->priv->allow_greeter = g_key_file_get_boolean (desktop_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-Allow-Greeter", NULL); - g_key_file_free (desktop_file); - - return config; + return g_steal_pointer (&config); } const gchar * diff --git a/src/session.c b/src/session.c index d7b531fb..c1f44204 100644 --- a/src/session.c +++ b/src/session.c @@ -271,9 +271,7 @@ session_set_remote_host_name (Session *session, const gchar *remote_host_name) static GList * find_env_entry (Session *session, const gchar *name) { - GList *link; - - for (link = session->priv->env; link; link = link->next) + for (GList *link = session->priv->env; link; link = link->next) { const gchar *entry = link->data; @@ -287,15 +285,12 @@ find_env_entry (Session *session, const gchar *name) void session_set_env (Session *session, const gchar *name, const gchar *value) { - GList *link; - gchar *entry; - g_return_if_fail (session != NULL); g_return_if_fail (value != NULL); - entry = g_strdup_printf ("%s=%s", name, value); + gchar *entry = g_strdup_printf ("%s=%s", name, value); - link = find_env_entry (session, name); + GList *link = find_env_entry (session, name); if (link) { g_free (link->data); @@ -308,14 +303,11 @@ session_set_env (Session *session, const gchar *name, const gchar *value) const gchar * session_get_env (Session *session, const gchar *name) { - GList *link; - gchar *entry; - - link = find_env_entry (session, name); + GList *link = find_env_entry (session, name); if (!link) return NULL; - entry = link->data; + gchar *entry = link->data; return entry + strlen (name) + 1; } @@ -323,11 +315,9 @@ session_get_env (Session *session, const gchar *name) void session_unset_env (Session *session, const gchar *name) { - GList *link; - g_return_if_fail (session != NULL); - link = find_env_entry (session, name); + GList *link = find_env_entry (session, name); if (!link) return; @@ -366,9 +356,7 @@ write_data (Session *session, const void *buf, size_t count) static void write_string (Session *session, const char *value) { - int length; - - length = value ? strlen (value) : -1; + int length = value ? strlen (value) : -1; write_data (session, &length, sizeof (length)); if (value) write_data (session, value, sizeof (char) * length); @@ -377,9 +365,6 @@ write_string (Session *session, const char *value) static void write_xauth (Session *session, XAuthority *x_authority) { - guint16 family; - gsize length; - if (!x_authority) { write_string (session, NULL); @@ -387,9 +372,9 @@ write_xauth (Session *session, XAuthority *x_authority) } write_string (session, x_authority_get_authorization_name (session->priv->x_authority)); - family = x_authority_get_family (session->priv->x_authority); + guint16 family = x_authority_get_family (session->priv->x_authority); write_data (session, &family, sizeof (family)); - length = x_authority_get_address_length (session->priv->x_authority); + gsize length = x_authority_get_address_length (session->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)); @@ -401,8 +386,7 @@ write_xauth (Session *session, XAuthority *x_authority) static ssize_t read_from_child (Session *session, void *buf, size_t count) { - ssize_t n_read; - n_read = read (session->priv->from_child_output, buf, count); + ssize_t n_read = read (session->priv->from_child_output, buf, count); if (n_read < 0) l_warning (session, "Error reading from session: %s", strerror (errno)); return n_read; @@ -412,8 +396,6 @@ static gchar * read_string_from_child (Session *session) { int length; - char *value; - if (read_from_child (session, &length, sizeof (length)) <= 0) return NULL; if (length < 0) @@ -424,7 +406,7 @@ read_string_from_child (Session *session) return NULL; } - value = g_malloc (sizeof (char) * (length + 1)); + char *value = g_malloc (sizeof (char) * (length + 1)); read_from_child (session, value, length); value[length] = '\0'; @@ -471,9 +453,6 @@ static gboolean from_child_cb (GIOChannel *source, GIOCondition condition, gpointer data) { Session *session = data; - g_autofree gchar *username = NULL; - ssize_t n_read; - gboolean auth_complete; /* Remote end gone */ if (condition == G_IO_HUP) @@ -483,7 +462,7 @@ from_child_cb (GIOChannel *source, GIOCondition condition, gpointer data) } /* Get the username currently being authenticated (may change during authentication) */ - username = read_string_from_child (session); + g_autofree gchar *username = read_string_from_child (session); if (g_strcmp0 (username, session->priv->username) != 0) { g_free (session->priv->username); @@ -492,7 +471,8 @@ from_child_cb (GIOChannel *source, GIOCondition condition, gpointer data) } /* Check if authentication completed */ - n_read = read_from_child (session, &auth_complete, sizeof (auth_complete)); + gboolean auth_complete; + ssize_t n_read = read_from_child (session, &auth_complete, sizeof (auth_complete)); if (n_read < 0) l_debug (session, "Error reading from child: %s", strerror (errno)); if (n_read <= 0) @@ -519,12 +499,10 @@ from_child_cb (GIOChannel *source, GIOCondition condition, gpointer data) } else { - int i; - 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 (i = 0; i < session->priv->messages_length; i++) + for (int i = 0; i < session->priv->messages_length; i++) { struct pam_message *m = &session->priv->messages[i]; read_from_child (session, &m->msg_style, sizeof (m->msg_style)); @@ -555,7 +533,7 @@ session_get_is_started (Session *session) static Greeter * create_greeter_cb (GreeterSocket *socket, Session *session) { - Greeter *greeter; + Greeter *greeter = NULL; g_signal_emit (session, signals[CREATE_GREETER], 0, &greeter); return greeter; } @@ -563,27 +541,22 @@ create_greeter_cb (GreeterSocket *socket, Session *session) static gboolean session_real_start (Session *session) { - int version; - int to_child_pipe[2], from_child_pipe[2]; - int to_child_output, from_child_input; - g_autofree gchar *arg0 = NULL; - g_autofree gchar *arg1 = NULL; - g_return_val_if_fail (session->priv->pid == 0, FALSE); if (session->priv->display_server) display_server_connect_session (session->priv->display_server, session); /* Create pipes to talk to the child */ + int to_child_pipe[2], from_child_pipe[2]; if (pipe (to_child_pipe) < 0 || pipe (from_child_pipe) < 0) { g_warning ("Failed to create pipe to communicate with session process: %s", strerror (errno)); return FALSE; } - to_child_output = to_child_pipe[0]; + 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]; - from_child_input = from_child_pipe[1]; + 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); @@ -600,8 +573,8 @@ session_real_start (Session *session) } /* Run the child */ - arg0 = g_strdup_printf ("%d", to_child_output); - arg1 = g_strdup_printf ("%d", from_child_input); + 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) { @@ -633,7 +606,7 @@ session_real_start (Session *session) close (from_child_input); /* Indicate what version of the protocol we are using */ - version = 3; + int version = 3; write_data (session, &version, sizeof (version)); /* Send configuration */ @@ -676,20 +649,18 @@ session_get_console_kit_cookie (Session *session) void session_respond (Session *session, struct pam_response *response) { - int error = PAM_SUCCESS; - int i; - g_return_if_fail (session != NULL); + int error = PAM_SUCCESS; write_data (session, &error, sizeof (error)); - for (i = 0; i < session->priv->messages_length; i++) + for (int i = 0; i < session->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 (i = 0; i < session->priv->messages_length; i++) + 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; @@ -758,11 +729,6 @@ session_get_is_run (Session *session) static void session_real_run (Session *session) { - gsize i, argc; - g_autofree gchar *command = NULL; - g_autofree gchar *x_authority_filename = NULL; - GList *link; - g_return_if_fail (session != NULL); g_return_if_fail (!session->priv->command_run); g_return_if_fail (session_get_is_authenticated (session)); @@ -773,17 +739,15 @@ session_real_run (Session *session) session->priv->command_run = TRUE; - command = g_strjoinv (" ", session->priv->argv); + g_autofree gchar *command = g_strjoinv (" ", session->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) { - g_autofree gchar *run_dir = NULL; - g_autofree gchar *dir = NULL; - - run_dir = config_get_string (config_get_instance (), "LightDM", "run-directory"); - dir = g_build_filename (run_dir, session->priv->username, NULL); + 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); if (g_mkdir_with_parents (dir, S_IRWXU) < 0) l_warning (session, "Failed to set create system authority dir %s: %s", dir, strerror (errno)); @@ -809,13 +773,8 @@ session_real_run (Session *session) /* Open socket to allow in-session greeter */ if (session->priv->config && session_config_get_allow_greeter (session->priv->config)) { - g_autofree gchar *run_dir = NULL; - g_autofree gchar *dir = NULL; - g_autofree gchar *path = NULL; - g_autoptr(GError) error = NULL; - - run_dir = config_get_string (config_get_instance (), "LightDM", "run-directory"); - dir = g_build_filename (run_dir, session->priv->username, NULL); + 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); if (g_mkdir_with_parents (dir, S_IRWXU) < 0) l_warning (session, "Failed to create greeter socket dir %s: %s", dir, strerror (errno)); @@ -825,11 +784,12 @@ session_real_run (Session *session) l_warning (session, "Failed to set ownership of greeter socket dir: %s", strerror (errno)); } - path = g_build_filename (dir, "greeter-socket", NULL); + 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); session_set_env (session, "LIGHTDM_GREETER_PIPE", path); + g_autoptr(GError) error = NULL; if (!greeter_socket_start (session->priv->greeter_socket, &error)) l_warning (session, "Failed to start greeter socket: %s\n", error->message); } @@ -842,13 +802,13 @@ session_real_run (Session *session) write_string (session, x_authority_filename); write_string (session, session->priv->xdisplay); write_xauth (session, session->priv->x_authority); - argc = g_list_length (session->priv->env); + gsize argc = g_list_length (session->priv->env); write_data (session, &argc, sizeof (argc)); - for (link = session->priv->env; link; link = link->next) + for (GList *link = session->priv->env; link; link = link->next) write_string (session, (gchar *) link->data); argc = g_strv_length (session->priv->argv); write_data (session, &argc, sizeof (argc)); - for (i = 0; i < argc; i++) + for (gsize i = 0; i < argc; i++) write_string (session, session->priv->argv[i]); session->priv->login1_session_id = read_string_from_child (session); @@ -911,16 +871,15 @@ session_stop (Session *session) /* If can cleanly stop then do that */ if (session_get_is_authenticated (session) && !session->priv->command_run) { - gsize n = 0; - LogMode log_mode = LOG_MODE_INVALID; - session->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 write_string (session, NULL); // tty write_string (session, NULL); // xauth filename write_string (session, NULL); // xdisplay write_xauth (session, NULL); // xauth + gsize n = 0; write_data (session, &n, sizeof (n)); // environment write_data (session, &n, sizeof (n)); // command return; @@ -965,7 +924,6 @@ static void session_finalize (GObject *object) { Session *self = SESSION (object); - int i; g_clear_object (&self->priv->config); g_clear_object (&self->priv->display_server); @@ -981,7 +939,7 @@ session_finalize (GObject *object) g_clear_pointer (&self->priv->username, g_free); g_clear_object (&self->priv->user); g_clear_pointer (&self->priv->pam_service, g_free); - for (i = 0; i < self->priv->messages_length; i++) + 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); diff --git a/src/shared-data-manager.c b/src/shared-data-manager.c index 17b5b936..e493e584 100644 --- a/src/shared-data-manager.c +++ b/src/shared-data-manager.c @@ -56,19 +56,16 @@ static void delete_unused_user (gpointer key, gpointer value, gpointer user_data) { const gchar *user = (const gchar *)key; - g_autofree gchar *path = NULL; - g_autofree gchar *quoted_path = NULL; - g_autofree gchar *cmd = NULL; - g_autoptr(GError) error = NULL; /* For this operation, we just need a fire and forget rm -rf. Since recursively deleting in GIO is a huge pain in the butt, we'll just drop to shell for this. */ - path = g_build_filename (USERS_DIR, user, NULL); - quoted_path = g_shell_quote (path); - cmd = g_strdup_printf ("/bin/rm -rf %s", quoted_path); + g_autofree gchar *path = g_build_filename (USERS_DIR, user, NULL); + g_autofree gchar *quoted_path = g_shell_quote (path); + g_autofree gchar *cmd = g_strdup_printf ("/bin/rm -rf %s", quoted_path); + g_autoptr(GError) error = NULL; g_spawn_command_line_async (cmd, &error); if (error) g_warning ("Could not delete unused user data directory %s: %s", path, error->message); @@ -77,23 +74,17 @@ delete_unused_user (gpointer key, gpointer value, gpointer user_data) gchar * shared_data_manager_ensure_user_dir (SharedDataManager *manager, const gchar *user) { - struct passwd *entry; - g_autofree gchar *path = NULL; - g_autoptr(GFile) file = NULL; - gboolean result; - g_autoptr(GFileInfo) info = NULL; - g_autoptr(GError) error = NULL; - - entry = getpwnam (user); + struct passwd *entry = getpwnam (user); if (!entry) return NULL; - path = g_build_filename (USERS_DIR, user, NULL); - file = g_file_new_for_path (path); + g_autofree gchar *path = g_build_filename (USERS_DIR, user, NULL); + g_autoptr(GFile) file = g_file_new_for_path (path); g_debug ("Creating shared data directory %s", path); - result = g_file_make_directory (file, NULL, &error); + g_autoptr(GError) error = NULL; + gboolean result = g_file_make_directory (file, NULL, &error); if (error) { if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS)) @@ -113,7 +104,7 @@ shared_data_manager_ensure_user_dir (SharedDataManager *manager, const gchar *us /* Even if the directory already exists, we want to re-affirm the owners because the greeter gid is configuration based and may change between runs. */ - info = g_file_info_new (); + 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_MODE, 0770); @@ -131,9 +122,8 @@ next_user_dirs_cb (GObject *object, GAsyncResult *res, gpointer user_data) { GFileEnumerator *enumerator = G_FILE_ENUMERATOR (object); SharedDataManager *manager = SHARED_DATA_MANAGER (user_data); - GList *link; - g_autoptr(GError) error = NULL; + g_autoptr(GError) error = NULL; GList *files = g_file_enumerator_next_files_finish (enumerator, res, &error); if (error) { @@ -142,7 +132,7 @@ next_user_dirs_cb (GObject *object, GAsyncResult *res, gpointer user_data) return; } - for (link = files; link; link = link->next) + 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); @@ -159,7 +149,7 @@ next_user_dirs_cb (GObject *object, GAsyncResult *res, gpointer user_data) // iterate the current users and as we go, remove the users from the // starting_dirs hash and thus see which users are obsolete. GList *users = common_user_list_get_users (common_user_list_get_instance ()); - for (link = users; link; link = link->next) + 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)); @@ -176,23 +166,19 @@ static void list_user_dirs_cb (GObject *object, GAsyncResult *res, gpointer user_data) { GFile *file = G_FILE (object); - SharedDataManager *manager = SHARED_DATA_MANAGER (user_data); - GFileEnumerator *enumerator; - g_autoptr(GError) error = NULL; + g_autoptr(SharedDataManager) manager = SHARED_DATA_MANAGER (user_data); - enumerator = g_file_enumerate_children_finish (file, res, &error); + g_autoptr(GError) error = NULL; + GFileEnumerator *enumerator = g_file_enumerate_children_finish (file, res, &error); if (error) g_warning ("Could not enumerate user data directory %s: %s", USERS_DIR, error->message); if (!enumerator) - { - g_object_unref (manager); return; - } manager->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, manager); + next_user_dirs_cb, g_steal_pointer (&manager)); } static void @@ -204,10 +190,8 @@ user_removed_cb (CommonUserList *list, CommonUser *user, SharedDataManager *mana void shared_data_manager_start (SharedDataManager *manager) { - g_autoptr(GFile) file = NULL; - /* Grab list of all current directories, so we know if any exist that we no longer need. */ - file = g_file_new_for_path (USERS_DIR); + g_autoptr(GFile) file = g_file_new_for_path (USERS_DIR); g_file_enumerate_children_async (file, G_FILE_ATTRIBUTE_STANDARD_NAME, G_FILE_QUERY_INFO_NONE, G_PRIORITY_DEFAULT, NULL, @@ -220,13 +204,11 @@ shared_data_manager_start (SharedDataManager *manager) static void shared_data_manager_init (SharedDataManager *manager) { - struct passwd *greeter_entry; - manager->priv = G_TYPE_INSTANCE_GET_PRIVATE (manager, SHARED_DATA_MANAGER_TYPE, SharedDataManagerPrivate); /* Grab current greeter-user gid */ manager->priv->greeter_user = config_get_string (config_get_instance (), "LightDM", "greeter-user"); - greeter_entry = getpwnam (manager->priv->greeter_user); + struct passwd *greeter_entry = getpwnam (manager->priv->greeter_user); if (greeter_entry) manager->priv->greeter_gid = greeter_entry->pw_gid; } @@ -235,7 +217,7 @@ static void shared_data_manager_finalize (GObject *object) { SharedDataManager *self = SHARED_DATA_MANAGER (object); - + /* 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); diff --git a/src/shared-data-manager.h b/src/shared-data-manager.h index 7b60e8f0..6099bd8a 100644 --- a/src/shared-data-manager.h +++ b/src/shared-data-manager.h @@ -36,6 +36,8 @@ typedef struct GObjectClass parent_class; } SharedDataManagerClass; +G_DEFINE_AUTOPTR_CLEANUP_FUNC (SharedDataManager, g_object_unref) + GType shared_data_manager_get_type (void); SharedDataManager *shared_data_manager_get_instance (void); diff --git a/src/unity-system-compositor.c b/src/unity-system-compositor.c index 1bd85fe8..81270276 100644 --- a/src/unity-system-compositor.c +++ b/src/unity-system-compositor.c @@ -136,10 +136,8 @@ unity_system_compositor_set_timeout (UnitySystemCompositor *compositor, gint tim static void write_message (UnitySystemCompositor *compositor, guint16 id, const guint8 *payload, guint16 payload_length) { - g_autofree guint8 *data = NULL; gsize data_length = 4 + payload_length; - - data = g_malloc (data_length); + g_autofree guint8 *data = g_malloc (data_length); data[0] = id >> 8; data[1] = id & 0xFF; data[2] = payload_length >> 8; @@ -186,7 +184,6 @@ unity_system_compositor_connect_session (DisplayServer *display_server, Session 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); @@ -219,13 +216,10 @@ unity_system_compositor_disconnect_session (DisplayServer *display_server, Sessi static gchar * get_absolute_command (const gchar *command) { - g_auto(GStrv) tokens = NULL; - g_autofree gchar *absolute_binary = NULL; - gchar *absolute_command = NULL; + g_auto(GStrv) tokens = g_strsplit (command, " ", 2); - tokens = g_strsplit (command, " ", 2); - - absolute_binary = g_find_program_in_path (tokens[0]); + g_autofree gchar *absolute_binary = g_find_program_in_path (tokens[0]); + gchar *absolute_command = NULL; if (absolute_binary) { if (tokens[1]) @@ -241,9 +235,6 @@ static gboolean read_cb (GIOChannel *source, GIOCondition condition, gpointer data) { UnitySystemCompositor *compositor = data; - gsize n_to_read = 0; - guint16 id, payload_length; - /*guint8 *payload;*/ if (condition == G_IO_HUP) { @@ -253,30 +244,29 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) } /* 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; else { - payload_length = compositor->priv->read_buffer[2] << 8 | compositor->priv->read_buffer[3]; + 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; } /* Read from compositor */ if (n_to_read > 0) { - gsize n_total, n_read = 0; - GIOStatus status; - g_autoptr(GError) error = NULL; - - n_total = compositor->priv->read_buffer_n_used + n_to_read; + 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); - status = g_io_channel_read_chars (source, - (gchar *)compositor->priv->read_buffer + compositor->priv->read_buffer_n_used, - n_to_read, - &n_read, - &error); + 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, + n_to_read, + &n_read, + &error); if (error) l_warning (compositor, "Failed to read from compositor: %s", error->message); if (status != G_IO_STATUS_NORMAL) @@ -287,13 +277,13 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) /* Read header */ if (compositor->priv->read_buffer_n_used < 4) return TRUE; - id = compositor->priv->read_buffer[0] << 8 | compositor->priv->read_buffer[1]; - payload_length = compositor->priv->read_buffer[2] << 8 | compositor->priv->read_buffer[3]; + 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]; /* Read payload */ if (compositor->priv->read_buffer_n_used < 4 + payload_length) return TRUE; - /*payload = compositor->priv->read_buffer + 4;*/ + /*guint8 *payload = compositor->priv->read_buffer + 4;*/ switch (id) { @@ -332,10 +322,8 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) static void run_cb (Process *process, gpointer user_data) { - int fd; - /* Make input non-blocking */ - fd = open ("/dev/null", O_RDONLY); + int fd = open ("/dev/null", O_RDONLY); dup2 (fd, STDIN_FILENO); close (fd); } @@ -376,12 +364,6 @@ static gboolean unity_system_compositor_start (DisplayServer *server) { UnitySystemCompositor *compositor = UNITY_SYSTEM_COMPOSITOR (server); - gboolean result, backup_logs; - g_autoptr(GString) command = NULL; - g_autofree gchar *dir = NULL; - g_autofree gchar *log_file = NULL; - g_autofree gchar *value = NULL; - g_autofree gchar *absolute_command = NULL; g_return_val_if_fail (compositor->priv->process == NULL, FALSE); @@ -405,17 +387,17 @@ unity_system_compositor_start (DisplayServer *server) compositor->priv->from_compositor_watch = g_io_add_watch (compositor->priv->from_compositor_channel, G_IO_IN | G_IO_HUP, read_cb, compositor); /* Setup logging */ - dir = config_get_string (config_get_instance (), "LightDM", "log-directory"); - log_file = g_build_filename (dir, "unity-system-compositor.log", NULL); + g_autofree gchar *dir = config_get_string (config_get_instance (), "LightDM", "log-directory"); + g_autofree gchar *log_file = g_build_filename (dir, "unity-system-compositor.log", NULL); l_debug (compositor, "Logging to %s", log_file); /* Setup environment */ compositor->priv->process = process_new (run_cb, compositor); - backup_logs = config_get_boolean (config_get_instance (), "LightDM", "backup-logs"); + 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"); - value = g_strdup_printf ("%d", compositor->priv->vt); + g_autofree gchar *value = g_strdup_printf ("%d", compositor->priv->vt); process_set_env (compositor->priv->process, "XDG_VTNR", value); /* Variable required for regression tests */ if (g_getenv ("LIGHTDM_TEST_ROOT")) @@ -426,13 +408,13 @@ unity_system_compositor_start (DisplayServer *server) } /* Generate command line to run */ - absolute_command = get_absolute_command (compositor->priv->command); + g_autofree gchar *absolute_command = get_absolute_command (compositor->priv->command); if (!absolute_command) { l_debug (compositor, "Can't launch compositor %s, not found in path", compositor->priv->command); return FALSE; } - command = g_string_new (absolute_command); + 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) @@ -441,7 +423,7 @@ unity_system_compositor_start (DisplayServer *server) /* Start the compositor */ g_signal_connect (compositor->priv->process, PROCESS_SIGNAL_STOPPED, G_CALLBACK (stopped_cb), compositor); - result = process_start (compositor->priv->process, FALSE); + gboolean result = process_start (compositor->priv->process, FALSE); /* Close compositor ends of the pipes */ close (compositor->priv->to_compositor_pipe[0]); diff --git a/src/vnc-server.c b/src/vnc-server.c index 0834df5a..b68745b5 100644 --- a/src/vnc-server.c +++ b/src/vnc-server.c @@ -72,20 +72,15 @@ vnc_server_get_listen_address (VNCServer *server) static gboolean read_cb (GSocket *socket, GIOCondition condition, VNCServer *server) { - g_autoptr(GSocket) client_socket = NULL; g_autoptr(GError) error = NULL; - - client_socket = g_socket_accept (socket, NULL, &error); + g_autoptr(GSocket) client_socket = g_socket_accept (socket, NULL, &error); if (error) g_warning ("Failed to get connection from from VNC socket: %s", error->message); if (client_socket) { - GInetSocketAddress *address; - g_autofree gchar *hostname = NULL; - - address = G_INET_SOCKET_ADDRESS (g_socket_get_remote_address (client_socket, NULL)); - hostname = g_inet_address_to_string (g_inet_socket_address_get_address (address)); + GInetSocketAddress *address = G_INET_SOCKET_ADDRESS (g_socket_get_remote_address (client_socket, NULL)); + g_autofree gchar *hostname = g_inet_address_to_string (g_inet_socket_address_get_address (address)); g_debug ("Got VNC connection from %s:%d", hostname, g_inet_socket_address_get_port (address)); g_signal_emit (server, signals[NEW_CONNECTION], 0, client_socket); @@ -97,18 +92,14 @@ read_cb (GSocket *socket, GIOCondition condition, VNCServer *server) static GSocket * open_tcp_socket (GSocketFamily family, guint port, const gchar *listen_address, GError **error) { - g_autoptr(GSocket) socket = NULL; - g_autoptr(GSocketAddress) address = NULL; - - socket = g_socket_new (family, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_TCP, error); + g_autoptr(GSocket) socket = g_socket_new (family, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_TCP, error); if (!socket) return NULL; - if (listen_address) + g_autoptr(GSocketAddress) address = NULL; + if (listen_address) { - GList *addresses; - - addresses = g_resolver_lookup_by_name (g_resolver_get_default (), listen_address, NULL, error); + GList *addresses = g_resolver_lookup_by_name (g_resolver_get_default (), listen_address, NULL, error); if (!addresses) return NULL; address = g_inet_socket_address_new (addresses->data, port); @@ -126,30 +117,28 @@ open_tcp_socket (GSocketFamily family, guint port, const gchar *listen_address, gboolean vnc_server_start (VNCServer *server) { - GSource *source; - g_autoptr(GError) ipv4_error = NULL; - g_autoptr(GError) ipv6_error = NULL; - 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); if (ipv4_error) g_warning ("Failed to create IPv4 VNC socket: %s", ipv4_error->message); if (server->priv->socket) { - source = g_socket_create_source (server->priv->socket, G_IO_IN, NULL); + GSource *source = g_socket_create_source (server->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); if (ipv6_error) g_warning ("Failed to create IPv6 VNC socket: %s", ipv6_error->message); if (server->priv->socket6) { - source = g_socket_create_source (server->priv->socket6, G_IO_IN, NULL); + GSource *source = g_socket_create_source (server->priv->socket6, G_IO_IN, NULL); g_source_set_callback (source, (GSourceFunc) read_cb, server, NULL); g_source_attach (source, NULL); } @@ -28,9 +28,7 @@ static GList *used_vts = NULL; static gint open_tty (void) { - int fd; - - fd = g_open ("/dev/tty0", O_RDONLY | O_NOCTTY, 0); + int fd = g_open ("/dev/tty0", O_RDONLY | O_NOCTTY, 0); if (fd < 0) g_warning ("Error opening /dev/tty0: %s", strerror (errno)); return fd; @@ -50,14 +48,12 @@ gint vt_get_active (void) { #ifdef __linux__ - gint tty_fd; - gint active = -1; - /* Pretend always active */ if (getuid () != 0) return 1; - tty_fd = open_tty (); + gint tty_fd = open_tty (); + gint active = -1; if (tty_fd >= 0) { struct vt_stat vt_state = { 0 }; @@ -78,19 +74,16 @@ void vt_set_active (gint number) { #ifdef __linux__ - gint tty_fd; - g_debug ("Activating VT %d", number); /* Pretend always active */ if (getuid () != 0) return; - tty_fd = open_tty (); + gint tty_fd = open_tty (); if (tty_fd >= 0) { int n = number; - if (ioctl (tty_fd, VT_ACTIVATE, n) < 0) { g_warning ("Error using VT_ACTIVATE %d on /dev/tty0: %s", n, strerror (errno)); @@ -121,9 +114,7 @@ vt_set_active (gint number) static gboolean vt_is_used (gint number) { - GList *link; - - for (link = used_vts; link; link = link->next) + for (GList *link = used_vts; link; link = link->next) { int n = GPOINTER_TO_INT (link->data); if (n == number) @@ -136,9 +127,7 @@ vt_is_used (gint number) gint vt_get_min (void) { - gint number; - - number = config_get_integer (config_get_instance (), "LightDM", "minimum-vt"); + gint number = config_get_integer (config_get_instance (), "LightDM", "minimum-vt"); if (number < 1) number = 1; @@ -148,12 +137,10 @@ vt_get_min (void) gint vt_get_unused (void) { - gint number; - if (getuid () != 0) return -1; - number = vt_get_min (); + gint number = vt_get_min (); while (vt_is_used (number)) number++; diff --git a/src/wayland-session.h b/src/wayland-session.h index 79282ca6..240c19fb 100644 --- a/src/wayland-session.h +++ b/src/wayland-session.h @@ -34,6 +34,8 @@ typedef struct DisplayServerClass parent_class; } WaylandSessionClass; +G_DEFINE_AUTOPTR_CLEANUP_FUNC (WaylandSession, g_object_unref) + GType wayland_session_get_type (void); WaylandSession *wayland_session_new (void); diff --git a/src/x-authority.c b/src/x-authority.c index 716a2374..705bb511 100644 --- a/src/x-authority.c +++ b/src/x-authority.c @@ -59,9 +59,7 @@ XAuthority * x_authority_new_cookie (guint16 family, const guint8 *address, gsize address_length, const gchar *number) { guint8 cookie[16]; - gint i; - - for (i = 0; i < 16; i++) + for (gint i = 0; i < 16; i++) cookie[i] = g_random_int () & 0xFF; return x_authority_new (family, address, address_length, number, "MIT-MAGIC-COOKIE-1", cookie, 16); @@ -71,7 +69,6 @@ XAuthority * x_authority_new_local_cookie (const gchar *number) { gchar hostname[1024]; - gethostname (hostname, 1024); return x_authority_new_cookie (XAUTH_FAMILY_LOCAL, (guint8 *) hostname, strlen (hostname), number); } @@ -164,11 +161,9 @@ x_authority_get_authorization_data (XAuthority *auth) guint8 * x_authority_copy_authorization_data (XAuthority *auth) { - guint8 *data; - g_return_val_if_fail (auth != NULL, NULL); - data = g_malloc (auth->priv->authorization_data_length); + guint8 *data = g_malloc (auth->priv->authorization_data_length); memcpy (data, auth->priv->authorization_data, auth->priv->authorization_data_length); return data; } @@ -195,8 +190,6 @@ read_uint16 (gchar *data, gsize data_length, gsize *offset, guint16 *value) static gboolean read_data (gchar *data, gsize data_length, gsize *offset, guint16 length, guint8 **value) { - int i; - g_free (*value); *value = NULL; @@ -204,7 +197,7 @@ read_data (gchar *data, gsize data_length, gsize *offset, guint16 length, guint8 return FALSE; *value = g_malloc0 (length + 1); - for (i = 0; i < length; i++) + for (int i = 0; i < length; i++) (*value)[i] = data[*offset + i]; *offset += length; (*value)[length] = 0; @@ -246,47 +239,41 @@ write_string (int fd, const gchar *value) gboolean x_authority_write (XAuthority *auth, XAuthWriteMode mode, const gchar *filename, GError **error) { - g_autofree gchar *input = NULL; - gsize input_length = 0, input_offset = 0; - GList *link, *records = NULL; - gboolean result = TRUE; - gboolean matched = FALSE; - int output_fd; - g_return_val_if_fail (auth != NULL, FALSE); g_return_val_if_fail (filename != NULL, FALSE); /* Read out existing records */ + g_autofree gchar *input = NULL; + gsize input_length = 0, input_offset = 0; if (mode != XAUTH_WRITE_MODE_SET) { g_autoptr(GError) read_error = NULL; - g_file_get_contents (filename, &input, &input_length, &read_error); if (read_error && !g_error_matches (read_error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) g_warning ("Error reading existing Xauthority: %s", read_error->message); } + GList *records = NULL; + gboolean matched = FALSE; while (input_offset != input_length) { - g_autoptr(XAuthority) a = NULL; - gboolean address_matches = FALSE; + g_autoptr(XAuthority) a = g_object_new (X_AUTHORITY_TYPE, NULL); + guint16 address_length = 0; guint16 authorization_data_length = 0; - - a = g_object_new (X_AUTHORITY_TYPE, NULL); - - 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_uint16 (input, input_length, &input_offset, &authorization_data_length) && - read_data (input, input_length, &input_offset, authorization_data_length, &a->priv->authorization_data); + 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_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; if (!result) break; + gboolean address_matches = FALSE; if (auth->priv->address_length == a->priv->address_length) { guint16 i; @@ -316,7 +303,7 @@ x_authority_write (XAuthority *auth, XAuthWriteMode mode, const gchar *filename, /* Write records back */ errno = 0; - output_fd = g_open (filename, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); + int output_fd = g_open (filename, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); if (output_fd < 0) { g_set_error (error, @@ -329,8 +316,8 @@ x_authority_write (XAuthority *auth, XAuthWriteMode mode, const gchar *filename, } errno = 0; - result = TRUE; - for (link = records; link && result; link = link->next) + gboolean result = TRUE; + for (GList *link = records; link && result; link = link->next) { XAuthority *a = link->data; diff --git a/src/x-server-local.c b/src/x-server-local.c index cfa4ab11..80e0ab0d 100644 --- a/src/x-server-local.c +++ b/src/x-server-local.c @@ -91,28 +91,22 @@ find_version (const gchar *line) const gchar * x_server_local_get_version (void) { - g_autofree gchar *stderr_text = NULL; - gint exit_status; - g_auto(GStrv) tokens = NULL; - guint n_tokens; - if (version) return version; + g_autofree gchar *stderr_text = NULL; + gint exit_status; if (!g_spawn_command_line_sync ("X -version", NULL, &stderr_text, &exit_status, NULL)) return NULL; if (exit_status == EXIT_SUCCESS) { - g_auto(GStrv) lines = NULL; - int i; - - lines = g_strsplit (stderr_text, "\n", -1); - for (i = 0; lines[i] && !version; i++) + g_auto(GStrv) lines = g_strsplit (stderr_text, "\n", -1); + for (int i = 0; lines[i] && !version; i++) version = find_version (lines[i]); } - tokens = g_strsplit (version, ".", 3); - n_tokens = g_strv_length (tokens); + g_auto(GStrv) tokens = g_strsplit (version, ".", 3); + guint n_tokens = g_strv_length (tokens); version_major = n_tokens > 0 ? atoi (tokens[0]) : 0; version_minor = n_tokens > 1 ? atoi (tokens[1]) : 0; @@ -132,13 +126,8 @@ x_server_local_version_compare (guint major, guint minor) static gboolean display_number_in_use (guint display_number) { - GList *link; - g_autofree gchar *path = NULL; - gboolean in_use; - g_autofree gchar *data = NULL; - /* See if we know we are managing a server with that number */ - for (link = display_numbers; link; link = link->next) + for (GList *link = display_numbers; link; link = link->next) { guint number = GPOINTER_TO_UINT (link->data); if (number == display_number) @@ -146,15 +135,14 @@ display_number_in_use (guint display_number) } /* See if an X server that we don't know of has a lock on that number */ - path = g_strdup_printf ("/tmp/.X%d-lock", display_number); - in_use = g_file_test (path, G_FILE_TEST_EXISTS); + g_autofree gchar *path = g_strdup_printf ("/tmp/.X%d-lock", display_number); + gboolean in_use = g_file_test (path, G_FILE_TEST_EXISTS); /* See if that lock file is valid, ignore it if the contents are invalid or the process doesn't exist */ + g_autofree gchar *data = NULL; if (in_use && g_file_get_contents (path, &data, NULL, NULL)) { - int pid; - - pid = atoi (g_strstrip (data)); + int pid = atoi (g_strstrip (data)); errno = 0; if (pid < 0 || (kill (pid, 0) < 0 && errno == ESRCH)) @@ -167,9 +155,7 @@ display_number_in_use (guint display_number) guint x_server_local_get_unused_display_number (void) { - guint number; - - number = config_get_integer (config_get_instance (), "LightDM", "minimum-display-number"); + guint number = config_get_integer (config_get_instance (), "LightDM", "minimum-display-number"); while (display_number_in_use (number)) number++; @@ -181,8 +167,7 @@ x_server_local_get_unused_display_number (void) void x_server_local_release_display_number (guint display_number) { - GList *link; - for (link = display_numbers; link; link = link->next) + for (GList *link = display_numbers; link; link = link->next) { guint number = GPOINTER_TO_UINT (link->data); if (number == display_number) @@ -321,13 +306,9 @@ x_server_local_get_authority_file_path (XServerLocal *server) static gchar * get_absolute_command (const gchar *command) { - g_auto(GStrv) tokens = NULL; - g_autofree gchar *absolute_binary = NULL; + g_auto(GStrv) tokens = g_strsplit (command, " ", 2); + g_autofree gchar *absolute_binary = g_find_program_in_path (tokens[0]); gchar *absolute_command = NULL; - - tokens = g_strsplit (command, " ", 2); - - absolute_binary = g_find_program_in_path (tokens[0]); if (absolute_binary) { if (tokens[1]) @@ -342,10 +323,8 @@ get_absolute_command (const gchar *command) static void x_server_local_run (Process *process, gpointer user_data) { - int fd; - /* Make input non-blocking */ - fd = open ("/dev/null", O_RDONLY); + int fd = open ("/dev/null", O_RDONLY); dup2 (fd, STDIN_FILENO); close (fd); @@ -407,10 +386,7 @@ stopped_cb (Process *process, XServerLocal *server) static void write_authority_file (XServerLocal *server) { - XAuthority *authority; - g_autoptr(GError) error = NULL; - - authority = x_server_get_authority (X_SERVER (server)); + XAuthority *authority = x_server_get_authority (X_SERVER (server)); if (!authority) return; @@ -430,6 +406,7 @@ write_authority_file (XServerLocal *server) l_debug (server, "Writing X server authority to %s", server->priv->authority_file); + g_autoptr(GError) error = NULL; x_authority_write (authority, XAUTH_WRITE_MODE_REPLACE, server->priv->authority_file, &error); if (error) l_warning (server, "Failed to write authority: %s", error->message); @@ -439,13 +416,6 @@ static gboolean x_server_local_start (DisplayServer *display_server) { XServerLocal *server = X_SERVER_LOCAL (display_server); - ProcessRunFunc run_cb; - gboolean result, backup_logs; - g_autofree gchar *filename = NULL; - g_autofree gchar *dir = NULL; - g_autofree gchar *log_file = NULL; - g_autofree gchar *absolute_command = NULL; - g_autoptr(GString) command = NULL; g_return_val_if_fail (server->priv->x_server_process == NULL, FALSE); @@ -453,28 +423,28 @@ x_server_local_start (DisplayServer *display_server) g_return_val_if_fail (server->priv->command != NULL, FALSE); - run_cb = X_SERVER_LOCAL_GET_CLASS (server)->get_run_function (server); + 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); /* Setup logging */ - filename = g_strdup_printf ("x-%d.log", x_server_get_display_number (X_SERVER (server))); - dir = config_get_string (config_get_instance (), "LightDM", "log-directory"); - log_file = g_build_filename (dir, filename, NULL); - backup_logs = config_get_boolean (config_get_instance (), "LightDM", "backup-logs"); + 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); l_debug (display_server, "Logging to %s", log_file); - absolute_command = get_absolute_command (server->priv->command); + g_autofree gchar *absolute_command = get_absolute_command (server->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)); return FALSE; } - command = g_string_new (absolute_command); + g_autoptr(GString) command = g_string_new (absolute_command); g_string_append_printf (command, " :%d", server->priv->display_number); @@ -547,12 +517,10 @@ x_server_local_start (DisplayServer *display_server) if (g_getenv ("LIGHTDM_TEST_ROOT")) process_set_env (server->priv->x_server_process, "LIGHTDM_TEST_ROOT", g_getenv ("LIGHTDM_TEST_ROOT")); - result = process_start (server->priv->x_server_process, FALSE); - + gboolean result = process_start (server->priv->x_server_process, FALSE); if (result) l_debug (display_server, "Waiting for ready signal from X server :%d", server->priv->display_number); - - if (!result) + else stopped_cb (server->priv->x_server_process, X_SERVER_LOCAL (server)); return result; diff --git a/src/x-server-local.h b/src/x-server-local.h index b6a2b409..c1714585 100644 --- a/src/x-server-local.h +++ b/src/x-server-local.h @@ -40,6 +40,8 @@ typedef struct gboolean (*start)(DisplayServer *server); } XServerLocalClass; +G_DEFINE_AUTOPTR_CLEANUP_FUNC (XServerLocal, g_object_unref) + const gchar *x_server_local_get_version (void); gint x_server_local_version_compare (guint major, guint minor); diff --git a/src/x-server-xmir.c b/src/x-server-xmir.c index e2c15e89..df37bad4 100644 --- a/src/x-server-xmir.c +++ b/src/x-server-xmir.c @@ -32,13 +32,11 @@ G_DEFINE_TYPE (XServerXmir, x_server_xmir, X_SERVER_LOCAL_TYPE) static void compositor_ready_cb (UnitySystemCompositor *compositor, XServerXmir *server) { - gboolean result; - if (!server->priv->waiting_for_compositor) return; server->priv->waiting_for_compositor = FALSE; - result = X_SERVER_LOCAL_CLASS (x_server_xmir_parent_class)->start (DISPLAY_SERVER (server)); + gboolean result = X_SERVER_LOCAL_CLASS (x_server_xmir_parent_class)->start (DISPLAY_SERVER (server)); if (!result) display_server_stop (DISPLAY_SERVER (server)); } @@ -52,9 +50,7 @@ compositor_stopped_cb (UnitySystemCompositor *compositor, XServerXmir *server) XServerXmir * x_server_xmir_new (UnitySystemCompositor *compositor) { - XServerXmir *server; - - server = g_object_new (X_SERVER_XMIR_TYPE, NULL); + XServerXmir *server = g_object_new (X_SERVER_XMIR_TYPE, NULL); x_server_local_set_command (X_SERVER_LOCAL (server), "Xmir"); server->priv->compositor = g_object_ref (compositor); g_signal_connect (compositor, DISPLAY_SERVER_SIGNAL_READY, G_CALLBACK (compositor_ready_cb), server); diff --git a/src/x-server-xmir.h b/src/x-server-xmir.h index 65acd238..6d1d45de 100644 --- a/src/x-server-xmir.h +++ b/src/x-server-xmir.h @@ -33,6 +33,8 @@ typedef struct XServerLocalClass parent_class; } XServerXmirClass; +G_DEFINE_AUTOPTR_CLEANUP_FUNC (XServerXmir, g_object_unref) + GType x_server_xmir_get_type (void); XServerXmir *x_server_xmir_new (UnitySystemCompositor *compositor); diff --git a/src/x-server-xvnc.h b/src/x-server-xvnc.h index e56ea7cb..accea198 100644 --- a/src/x-server-xvnc.h +++ b/src/x-server-xvnc.h @@ -35,6 +35,8 @@ typedef struct void (*ready)(XServerXVNC *server); } XServerXVNCClass; +G_DEFINE_AUTOPTR_CLEANUP_FUNC (XServerXVNC, g_object_unref) + GType x_server_xvnc_get_type (void); gboolean x_server_xvnc_check_available (void); diff --git a/src/x-server.c b/src/x-server.c index d6423f18..d6267ae0 100644 --- a/src/x-server.c +++ b/src/x-server.c @@ -106,8 +106,8 @@ static gboolean x_server_start (DisplayServer *display_server) { XServer *server = X_SERVER (display_server); - xcb_auth_info_t *auth = NULL, a; + xcb_auth_info_t *auth = NULL, a; if (server->priv->authority) { a.namelen = strlen (x_authority_get_authorization_name (server->priv->authority)); @@ -132,13 +132,11 @@ x_server_start (DisplayServer *display_server) static void x_server_connect_session (DisplayServer *display_server, Session *session) { - gint vt; - session_set_env (session, "XDG_SESSION_TYPE", "x11"); display_server = session_get_display_server (session); - vt = display_server_get_vt (display_server); + gint vt = display_server_get_vt (display_server); if (vt > 0) { g_autofree gchar *tty_text = NULL; @@ -164,10 +162,8 @@ x_server_connect_session (DisplayServer *display_server, Session *session) static void x_server_disconnect_session (DisplayServer *display_server, Session *session) { - gint vt; - session_unset_env (session, "XDG_SESSION_TYPE"); - vt = display_server_get_vt (display_server); + gint vt = display_server_get_vt (display_server); if (vt > 0) { session_set_tty (session, NULL); diff --git a/src/x-server.h b/src/x-server.h index d83b9329..2d38cb2f 100644 --- a/src/x-server.h +++ b/src/x-server.h @@ -38,6 +38,8 @@ typedef struct guint (*get_display_number) (XServer *server); } XServerClass; +G_DEFINE_AUTOPTR_CLEANUP_FUNC (XServer, g_object_unref) + GType x_server_get_type (void); void x_server_set_hostname (XServer *server, const gchar *hostname); diff --git a/src/xdmcp-protocol.c b/src/xdmcp-protocol.c index bedcc1a0..265f3361 100644 --- a/src/xdmcp-protocol.c +++ b/src/xdmcp-protocol.c @@ -25,15 +25,13 @@ typedef struct static guint8 read_card8 (PacketReader *reader) { - guint8 value; - if (reader->remaining < 1) { reader->overflow = TRUE; return 0; } - value = reader->data[0]; + guint8 value = reader->data[0]; reader->data++; reader->remaining--; @@ -55,22 +53,18 @@ read_card32 (PacketReader *reader) static void read_data (PacketReader *reader, XDMCPData *data) { - guint16 i; - data->length = read_card16 (reader); data->data = g_malloc (sizeof (guint8) * data->length); - for (i = 0; i < data->length; i++) + for (guint16 i = 0; i < data->length; i++) data->data[i] = read_card8 (reader); } static gchar * read_string (PacketReader *reader) { - guint16 length, i; - gchar *string; - - length = read_card16 (reader); - string = g_malloc (sizeof (gchar) * (length + 1)); + guint16 length = read_card16 (reader); + gchar *string = g_malloc (sizeof (gchar) * (length + 1)); + guint16 i; for (i = 0; i < length; i++) string[i] = (gchar) read_card8 (reader); string[i] = '\0'; @@ -81,11 +75,9 @@ read_string (PacketReader *reader) static gchar ** read_string_array (PacketReader *reader) { - guint8 n_strings, i; - gchar **strings; - - n_strings = read_card8 (reader); - strings = g_malloc (sizeof (gchar *) * (n_strings + 1)); + guint8 n_strings = read_card8 (reader); + gchar **strings = g_malloc (sizeof (gchar *) * (n_strings + 1)); + guint8 i; for (i = 0; i < n_strings; i++) strings[i] = read_string (reader); strings[i] = NULL; @@ -133,39 +125,31 @@ write_card32 (PacketWriter *writer, guint32 value) static void write_data (PacketWriter *writer, const XDMCPData *value) { - guint16 i; - write_card16 (writer, value->length); - for (i = 0; i < value->length; i++) + for (guint16 i = 0; i < value->length; i++) write_card8 (writer, value->data[i]); } static void write_string (PacketWriter *writer, const gchar *value) { - const gchar *c; - write_card16 (writer, strlen (value)); - for (c = value; *c; c++) + for (const gchar *c = value; *c; c++) write_card8 (writer, *c); } static void write_string_array (PacketWriter *writer, gchar **values) { - gchar **value; - write_card8 (writer, g_strv_length (values)); - for (value = values; *value; value++) + for (gchar **value = values; *value; value++) write_string (writer, *value); } XDMCPPacket * xdmcp_packet_alloc (XDMCPOpcode opcode) { - XDMCPPacket *packet; - - packet = g_malloc0 (sizeof (XDMCPPacket)); + XDMCPPacket *packet = g_malloc0 (sizeof (XDMCPPacket)); packet->opcode = opcode; return packet; @@ -174,19 +158,14 @@ xdmcp_packet_alloc (XDMCPOpcode opcode) XDMCPPacket * xdmcp_packet_decode (const guint8 *data, gsize data_length) { - XDMCPPacket *packet; - guint16 version, opcode, length; PacketReader reader; - int i; - gboolean failed = FALSE; - reader.data = data; reader.remaining = data_length; reader.overflow = FALSE; - version = read_card16 (&reader); - opcode = read_card16 (&reader); - length = read_card16 (&reader); + guint16 version = read_card16 (&reader); + guint16 opcode = read_card16 (&reader); + guint16 length = read_card16 (&reader); if (reader.overflow) { @@ -204,7 +183,8 @@ xdmcp_packet_decode (const guint8 *data, gsize data_length) return NULL; } - packet = xdmcp_packet_alloc (opcode); + XDMCPPacket *packet = xdmcp_packet_alloc (opcode); + gboolean failed = FALSE; switch (packet->opcode) { case XDMCP_BroadcastQuery: @@ -230,14 +210,14 @@ xdmcp_packet_decode (const guint8 *data, gsize data_length) packet->Request.display_number = read_card16 (&reader); packet->Request.n_connections = read_card8 (&reader); packet->Request.connections = g_malloc (sizeof (XDMCPConnection) * packet->Request.n_connections); - for (i = 0; i < packet->Request.n_connections; i++) + for (int i = 0; i < packet->Request.n_connections; i++) packet->Request.connections[i].type = read_card16 (&reader); if (read_card8 (&reader) != packet->Request.n_connections) { g_warning ("Number of connection types does not match number of connection addresses"); failed = TRUE; } - for (i = 0; i < packet->Request.n_connections; i++) + for (int i = 0; i < packet->Request.n_connections; i++) read_data (&reader, &packet->Request.connections[i].address); packet->Request.authentication_name = read_string (&reader); read_data (&reader, &packet->Request.authentication_data); @@ -307,13 +287,10 @@ xdmcp_packet_decode (const guint8 *data, gsize data_length) gssize xdmcp_packet_encode (XDMCPPacket *packet, guint8 *data, gsize max_length) { - guint16 length; - PacketWriter writer; - int i; - if (max_length < 6) return -1; + PacketWriter writer; writer.data = data + 6; writer.remaining = max_length - 6; writer.overflow = FALSE; @@ -342,10 +319,10 @@ xdmcp_packet_encode (XDMCPPacket *packet, guint8 *data, gsize max_length) case XDMCP_Request: write_card16 (&writer, packet->Request.display_number); write_card8 (&writer, packet->Request.n_connections); - for (i = 0; i < packet->Request.n_connections; i++) + for (int i = 0; i < packet->Request.n_connections; i++) write_card16 (&writer, packet->Request.connections[i].type); write_card8 (&writer, packet->Request.n_connections); - for (i = 0; i < packet->Request.n_connections; i++) + for (int i = 0; i < packet->Request.n_connections; i++) write_data (&writer, &packet->Request.connections[i].address); write_string (&writer, packet->Request.authentication_name); write_data (&writer, &packet->Request.authentication_data); @@ -386,7 +363,7 @@ xdmcp_packet_encode (XDMCPPacket *packet, guint8 *data, gsize max_length) break; } - length = max_length - 6 - writer.remaining; + guint16 length = max_length - 6 - writer.remaining; /* Write header */ writer.data = data; @@ -408,11 +385,8 @@ xdmcp_packet_encode (XDMCPPacket *packet, guint8 *data, gsize max_length) static gchar * data_tostring (XDMCPData *data) { - g_autoptr(GString) s = NULL; - guint16 i; - - s = g_string_new (""); - for (i = 0; i < data->length; i++) + g_autoptr(GString) s = g_string_new (""); + for (guint16 i = 0; i < data->length; i++) g_string_append_printf (s, "%02X", data->data[i]); return g_steal_pointer (&s->str); @@ -421,11 +395,8 @@ data_tostring (XDMCPData *data) static gchar * string_list_tostring (gchar **strings) { - g_autoptr(GString) s = NULL; - gchar **i; - - s = g_string_new (""); - for (i = strings; *i; i++) + g_autoptr(GString) s = g_string_new (""); + for (gchar **i = strings; *i; i++) { if (i != strings) g_string_append (s, " "); @@ -474,16 +445,14 @@ xdmcp_packet_tostring (XDMCPPacket *packet) g_autofree gchar *names_text = string_list_tostring (packet->Request.authorization_names); g_autofree gchar *data_text = data_tostring (&packet->Request.authentication_data); g_autoptr(GString) connections_text = g_string_new (""); - gint i; - - for (i = 0; i < packet->Request.n_connections; i++) + for (gint i = 0; i < packet->Request.n_connections; i++) { XDMCPConnection *connection = &packet->Request.connections[i]; - GSocketFamily family = G_SOCKET_FAMILY_INVALID; if (i != 0) g_string_append (connections_text, " "); + GSocketFamily family = G_SOCKET_FAMILY_INVALID; if (connection->type == XAUTH_FAMILY_INTERNET && connection->address.length == 4) family = G_SOCKET_FAMILY_IPV4; else if (connection->type == XAUTH_FAMILY_INTERNET6 && connection->address.length == 16) @@ -540,8 +509,6 @@ xdmcp_packet_tostring (XDMCPPacket *packet) void xdmcp_packet_free (XDMCPPacket *packet) { - gint i; - if (packet == NULL) return; @@ -554,7 +521,7 @@ xdmcp_packet_free (XDMCPPacket *packet) break; case XDMCP_ForwardQuery: g_free (packet->ForwardQuery.client_address.data); - g_free (packet->ForwardQuery.client_port.data); + g_free (packet->ForwardQuery.client_port.data); g_strfreev (packet->ForwardQuery.authentication_names); break; case XDMCP_Willing: @@ -567,7 +534,7 @@ xdmcp_packet_free (XDMCPPacket *packet) g_free (packet->Unwilling.status); break; case XDMCP_Request: - for (i = 0; i < packet->Request.n_connections; i++) + for (gint i = 0; i < packet->Request.n_connections; i++) g_free (packet->Request.connections[i].address.data); g_free (packet->Request.connections); g_free (packet->Request.authentication_name); diff --git a/src/xdmcp-server.c b/src/xdmcp-server.c index 8d18707f..f1d351a0 100644 --- a/src/xdmcp-server.c +++ b/src/xdmcp-server.c @@ -152,15 +152,13 @@ session_timeout_cb (XDMCPSession *session) static XDMCPSession * add_session (XDMCPServer *server) { - XDMCPSession *session; guint16 id; - do { id = g_random_int () & 0xFFFFFFFF; } while (g_hash_table_lookup (server->priv->sessions, GINT_TO_POINTER ((gint) id))); - session = xdmcp_session_new (id); + XDMCPSession *session = xdmcp_session_new (id); session->priv->server = server; g_hash_table_insert (server->priv->sessions, GINT_TO_POINTER ((gint) id), g_object_ref (session)); session->priv->inactive_timeout = g_timeout_add (MANAGE_TIMEOUT, (GSourceFunc) session_timeout_cb, session); @@ -177,29 +175,23 @@ get_session (XDMCPServer *server, guint16 id) static gchar * socket_address_to_string (GSocketAddress *address) { - g_autofree gchar *inet_text = NULL; - - inet_text = g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address))); + g_autofree gchar *inet_text = g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address))); return g_strdup_printf ("%s:%d", inet_text, g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address))); } static void send_packet (GSocket *socket, GSocketAddress *address, XDMCPPacket *packet) { - g_autofree gchar *address_string = NULL; - guint8 data[1024]; - gssize n_written; - - address_string = socket_address_to_string (address); + g_autofree gchar *address_string = socket_address_to_string (address); g_debug ("Send %s to %s", xdmcp_packet_tostring (packet), address_string); - n_written = xdmcp_packet_encode (packet, data, 1024); + guint8 data[1024]; + gssize n_written = xdmcp_packet_encode (packet, data, 1024); if (n_written < 0) - g_critical ("Failed to encode XDMCP packet"); + g_critical ("Failed to encode XDMCP packet"); else { g_autoptr(GError) error = NULL; - g_socket_send_to (socket, address, (gchar *) data, n_written, NULL, &error); if (error) g_warning ("Error sending packet: %s", error->message); @@ -218,15 +210,12 @@ get_authentication_name (XDMCPServer *server) static void handle_query (XDMCPServer *server, GSocket *socket, GSocketAddress *address, gchar **authentication_names) { - XDMCPPacket *response; - gchar **i; - gchar *authentication_name = NULL; - /* 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) authentication_name = ""; - for (i = authentication_names; *i; i++) + for (gchar **i = authentication_names; *i; i++) { if (strcmp (*i, get_authentication_name (server)) == 0 && server->priv->key != NULL) { @@ -235,6 +224,7 @@ handle_query (XDMCPServer *server, GSocket *socket, GSocketAddress *address, gch } } + XDMCPPacket *response; if (authentication_name) { response = xdmcp_packet_alloc (XDMCP_Willing); @@ -260,13 +250,7 @@ handle_query (XDMCPServer *server, GSocket *socket, GSocketAddress *address, gch static void handle_forward_query (XDMCPServer *server, GSocket *socket, GSocketAddress *address, XDMCPPacket *packet) { - GSocketFamily family; - g_autoptr(GInetAddress) client_inet_address = NULL; - g_autoptr(GSocketAddress) client_address = NULL; - gint i; - guint16 port = 0; - - family = g_socket_get_family (socket); + GSocketFamily family = g_socket_get_family (socket); switch (family) { case G_SOCKET_FAMILY_IPV4: @@ -288,11 +272,12 @@ handle_forward_query (XDMCPServer *server, GSocket *socket, GSocketAddress *addr return; } - for (i = 0; i < packet->ForwardQuery.client_port.length; i++) + guint16 port = 0; + for (int i = 0; i < packet->ForwardQuery.client_port.length; i++) port = port << 8 | packet->ForwardQuery.client_port.data[i]; - client_inet_address = g_inet_address_new_from_bytes (packet->ForwardQuery.client_address.data, family); - client_address = g_inet_socket_address_new (client_inet_address, port); + g_autoptr(GInetAddress) client_inet_address = g_inet_address_new_from_bytes (packet->ForwardQuery.client_address.data, family); + g_autoptr(GSocketAddress) client_address = g_inet_socket_address_new (client_inet_address, port); handle_query (server, socket, client_address, packet->ForwardQuery.authentication_names); } @@ -312,12 +297,10 @@ atox (char c) static void decode_key (const gchar *key, guint8 *data) { - gint i; - memset (data, 0, 8); if (strncmp (key, "0x", 2) == 0 || strncmp (key, "0X", 2) == 0) { - for (i = 0; i < 8; i++) + for (gint i = 0; i < 8; i++) { if (key[i*2] == '\0') break; @@ -329,7 +312,7 @@ decode_key (const gchar *key, guint8 *data) } else { - for (i = 1; i < 8 && key[i-1]; i++) + for (gint i = 1; i < 8 && key[i-1]; i++) data[i] = key[i-1]; } } @@ -361,23 +344,18 @@ compare_addresses (gconstpointer a, gconstpointer b, gpointer user_data) const AddrSortItem *item_a = a; const AddrSortItem *item_b = b; GInetAddress *source_address = user_data; - GSocketFamily family_a; - GSocketFamily family_b; - gboolean is_link_local; /* Prefer non link-local addresses */ - is_link_local = g_inet_address_get_is_link_local (item_a->address); + gboolean is_link_local = g_inet_address_get_is_link_local (item_a->address); if (is_link_local != g_inet_address_get_is_link_local (item_b->address)) return is_link_local ? 1 : -1; /* Prefer the source address family */ - family_a = g_inet_address_get_family (item_a->address); - family_b = g_inet_address_get_family (item_b->address); + GSocketFamily family_a = g_inet_address_get_family (item_a->address); + GSocketFamily family_b = g_inet_address_get_family (item_b->address); if (family_a != family_b) { - GSocketFamily family; - - family = g_inet_address_get_family (source_address); + GSocketFamily family = g_inet_address_get_family (source_address); if (family_a == family) return -1; if (family_b == family) @@ -402,20 +380,16 @@ compare_addresses (gconstpointer a, gconstpointer b, gpointer user_data) static XDMCPConnection * choose_connection (XDMCPPacket *packet, GInetAddress *source_address) { - gsize addresses_length, i; - GArray *addresses; - gssize index = -1; - AddrSortItem addr; - - addresses_length = packet->Request.n_connections; + gsize addresses_length = packet->Request.n_connections; if (addresses_length == 0) return NULL; - addresses = g_array_sized_new (FALSE, FALSE, sizeof addr, addresses_length); + AddrSortItem addr; + GArray *addresses = g_array_sized_new (FALSE, FALSE, sizeof addr, addresses_length); if (!addresses) return NULL; - for (i = 0; i < addresses_length; i++) + for (gsize i = 0; i < addresses_length; i++) { addr.address = connection_to_address (&packet->Request.connections[i]); if (addr.address) @@ -429,11 +403,12 @@ choose_connection (XDMCPPacket *packet, GInetAddress *source_address) g_array_sort_with_data (addresses, compare_addresses, source_address); /* Use the best address */ + gssize index = -1; if (addresses->len) index = g_array_index (addresses, AddrSortItem, 0).index; /* Free the local sort array and items */ - for (i = 0; i < addresses->len; i++) + for (gsize i = 0; i < addresses->len; i++) g_object_unref (g_array_index (addresses, AddrSortItem, i).address); g_array_unref (addresses); @@ -443,28 +418,22 @@ choose_connection (XDMCPPacket *packet, GInetAddress *source_address) static gboolean has_string (gchar **list, const gchar *text) { - gchar **i; - - for (i = list; *i; i++) + for (gchar **i = list; *i; i++) if (strcmp (*i, text) == 0) return TRUE; - + return FALSE; } static void handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, XDMCPPacket *packet) { - XDMCPPacket *response; - XDMCPSession *session; - gchar *authentication_name = NULL, *decline_status = NULL, *authorization_name; - g_autofree gchar *display_number = NULL; - guint8 *authentication_data = NULL, *authorization_data = NULL, *session_authorization_data = NULL; - gsize authentication_data_length = 0, authorization_data_length = 0, session_authorization_data_length = 0; - XDMCPConnection *connection; - XdmAuthKeyRec rho; - /* Check authentication */ + g_autofree gchar *authentication_name = NULL; + g_autofree guint8 *authentication_data = NULL; + gsize authentication_data_length = 0; + g_autofree gchar *decline_status = NULL; + XdmAuthKeyRec rho; if (strcmp (packet->Request.authentication_name, "") == 0) { if (!server->priv->key) @@ -490,7 +459,7 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X authentication_name = g_strdup ("XDM-AUTHENTICATION-1"); authentication_data = g_malloc (sizeof (guint8) * 8); authentication_data_length = 8; - + XdmcpUnwrap (input, key, rho.data, authentication_data_length); XdmcpIncrementKey (&rho); XdmcpWrap (rho.data, key, authentication_data, authentication_data_length); @@ -512,7 +481,7 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X } /* Choose an address to connect back on */ - connection = choose_connection (packet, g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address))); + XDMCPConnection *connection = choose_connection (packet, g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address))); if (!connection && !decline_status) decline_status = g_strdup ("No valid address found"); @@ -522,10 +491,10 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X /* Decline if request was not valid */ if (decline_status) { - response = xdmcp_packet_alloc (XDMCP_Decline); - response->Decline.status = decline_status; - response->Decline.authentication_name = authentication_name; - response->Decline.authentication_data.data = authentication_data; + XDMCPPacket *response = xdmcp_packet_alloc (XDMCP_Decline); + response->Decline.status = g_steal_pointer (&decline_status); + response->Decline.authentication_name = g_steal_pointer (&authentication_name); + response->Decline.authentication_data.data = g_steal_pointer (&authentication_data); response->Decline.authentication_data.length = authentication_data_length; send_packet (socket, address, response); xdmcp_packet_free (response); @@ -533,18 +502,22 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X } /* Generate authorization data */ + g_autofree gchar *authorization_name = NULL; + g_autofree guint8 *authorization_data = NULL; + gsize authorization_data_length = 0; + g_autofree guint8 *session_authorization_data = NULL; + gsize session_authorization_data_length = 0; if (server->priv->key) { - gint i; - guint8 key[8], session_key[8]; - /* Setup key */ + guint8 key[8]; decode_key (server->priv->key, key); /* Generate a private session key */ // FIXME: Pick a good DES key? + guint8 session_key[8]; session_key[0] = 0; - for (i = 1; i < 8; i++) + for (gint i = 1; i < 8; i++) session_key[i] = g_random_int () & 0xFF; /* Encrypt the session key and send it to the server */ @@ -562,10 +535,8 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X } else { - g_autoptr(XAuthority) auth = NULL; - /* Data is the cookie */ - auth = x_authority_new_cookie (XAUTH_FAMILY_WILD, NULL, 0, ""); + g_autoptr(XAuthority) auth = x_authority_new_cookie (XAUTH_FAMILY_WILD, NULL, 0, ""); authorization_data = x_authority_copy_authorization_data (auth); authorization_data_length = x_authority_get_authorization_data_length (auth); authorization_name = g_strdup ("MIT-MAGIC-COOKIE-1"); @@ -573,10 +544,10 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X session_authorization_data_length = x_authority_get_authorization_data_length (auth); } - session = add_session (server); + XDMCPSession *session = add_session (server); session->priv->address = connection_to_address (connection); session->priv->display_number = packet->Request.display_number; - display_number = g_strdup_printf ("%d", 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 @@ -603,13 +574,13 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X session_authorization_data, session_authorization_data_length); - response = xdmcp_packet_alloc (XDMCP_Accept); + XDMCPPacket *response = xdmcp_packet_alloc (XDMCP_Accept); response->Accept.session_id = xdmcp_session_get_id (session); - response->Accept.authentication_name = authentication_name; - response->Accept.authentication_data.data = authentication_data; + response->Accept.authentication_name = g_steal_pointer (&authentication_name); + response->Accept.authentication_data.data = g_steal_pointer (&authentication_data); response->Accept.authentication_data.length = authentication_data_length; - response->Accept.authorization_name = authorization_name; - response->Accept.authorization_data.data = authorization_data; + response->Accept.authorization_name = g_steal_pointer (&authorization_name); + response->Accept.authorization_data.data = g_steal_pointer (&authorization_data); response->Accept.authorization_data.length = authorization_data_length; send_packet (socket, address, response); xdmcp_packet_free (response); @@ -618,19 +589,13 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X static void handle_manage (XDMCPServer *server, GSocket *socket, GSocketAddress *address, XDMCPPacket *packet) { - XDMCPSession *session; - gboolean result; - - session = get_session (server, packet->Manage.session_id); + XDMCPSession *session = get_session (server, packet->Manage.session_id); if (!session) { - XDMCPPacket *response; - - response = xdmcp_packet_alloc (XDMCP_Refuse); + XDMCPPacket *response = xdmcp_packet_alloc (XDMCP_Refuse); response->Refuse.session_id = packet->Manage.session_id; send_packet (socket, address, response); xdmcp_packet_free (response); - return; } @@ -657,6 +622,7 @@ handle_manage (XDMCPServer *server, GSocket *socket, GSocketAddress *address, XD session->priv->display_class = g_strdup (packet->Manage.display_class); + gboolean result = FALSE; g_signal_emit (server, signals[NEW_SESSION], 0, session, &result); if (result) { @@ -764,7 +730,7 @@ open_udp_socket (GSocketFamily family, guint port, const gchar *listen_address, if (!socket) return NULL; - if (listen_address) + if (listen_address) { GList *addresses; @@ -786,30 +752,28 @@ open_udp_socket (GSocketFamily family, guint port, const gchar *listen_address, gboolean xdmcp_server_start (XDMCPServer *server) { - GSource *source; - g_autoptr(GError) ipv4_error = NULL; - g_autoptr(GError) ipv6_error = NULL; - 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); if (ipv4_error) g_warning ("Failed to create IPv4 XDMCP socket: %s", ipv4_error->message); if (server->priv->socket) { - source = g_socket_create_source (server->priv->socket, G_IO_IN, NULL); + GSource *source = g_socket_create_source (server->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); if (ipv6_error) g_warning ("Failed to create IPv6 XDMCP socket: %s", ipv6_error->message); if (server->priv->socket6) { - source = g_socket_create_source (server->priv->socket6, G_IO_IN, NULL); + GSource *source = g_socket_create_source (server->priv->socket6, G_IO_IN, NULL); g_source_set_callback (source, (GSourceFunc) read_cb, server, NULL); g_source_attach (source, NULL); } |