summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2013-12-11 12:53:38 -0500
committerRay Strode <rstrode@redhat.com>2013-12-11 13:00:02 -0500
commit6e7dc7bf622100505ea26f31baca432122d72179 (patch)
tree183a77d1f664d28d8d6eb43b282839ec3a0e761f
parent1a0bfabbef58ec00f24f407f2a85ddd436cc3196 (diff)
device-manager: protect against local console seat getting created more than once
We watch for udev events even after forcing fall back, so we need to make sure we don't allocate two seats for the local console if we fallback then get a late event.
-rw-r--r--src/libply-splash-core/ply-device-manager.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
index 1ad1466d..c4993c87 100644
--- a/src/libply-splash-core/ply-device-manager.c
+++ b/src/libply-splash-core/ply-device-manager.c
@@ -47,6 +47,7 @@ struct _ply_device_manager
ply_event_loop_t *loop;
ply_hashtable_t *terminals;
ply_terminal_t *local_console_terminal;
+ ply_seat_t *local_console_seat;
ply_list_t *seats;
struct udev *udev_context;
struct udev_monitor *udev_monitor;
@@ -572,6 +573,16 @@ create_seat_for_terminal_and_renderer_type (ply_device_manager_t *manager,
ply_renderer_type_t renderer_type)
{
ply_seat_t *seat;
+ bool is_local_terminal = false;
+
+ if (terminal != NULL && manager->local_console_terminal == terminal)
+ is_local_terminal = true;
+
+ if (is_local_terminal && manager->local_console_seat != NULL)
+ {
+ ply_trace ("trying to create seat for local console when one already exists");
+ return;
+ }
ply_trace ("creating seat for %s (renderer type: %u) (terminal: %s)",
device_path? : "", renderer_type, terminal? ply_terminal_get_name (terminal): "none");
@@ -586,6 +597,9 @@ create_seat_for_terminal_and_renderer_type (ply_device_manager_t *manager,
ply_list_append_data (manager->seats, seat);
+ if (is_local_terminal)
+ manager->local_console_seat = seat;
+
if (manager->seat_added_handler != NULL)
manager->seat_added_handler (manager->seat_event_handler_data, seat);
}