01552a
From 8a1dfbe91c1b309d361b4053e05bd5e01056fd41 Mon Sep 17 00:00:00 2001
01552a
From: Ray Strode <rstrode@redhat.com>
01552a
Date: Mon, 3 Mar 2014 17:55:59 -0500
01552a
Subject: [PATCH 1/4] device-manager: ignore udev if only console is serial
01552a
 console
01552a
01552a
Right now we use the heuristic, "more than one entry in
01552a
/sys/class/tty/console/active" to mean "has serial consoles".
01552a
01552a
We used to use the heuristic "file has more than tty0 in it".
01552a
The older heuristic is more accurate because a user may have
01552a
console=ttyS0 without console=tty0 on the kernel command line.
01552a
---
01552a
 src/libply-splash-core/ply-device-manager.c | 27 +++++++++++++--------------
01552a
 1 file changed, 13 insertions(+), 14 deletions(-)
01552a
01552a
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
01552a
index d06e1b5..098fd85 100644
01552a
--- a/src/libply-splash-core/ply-device-manager.c
01552a
+++ b/src/libply-splash-core/ply-device-manager.c
01552a
@@ -514,204 +514,203 @@ ply_device_manager_new (const char                 *default_tty,
01552a
   return manager;
01552a
 }
01552a
 
01552a
 void
01552a
 ply_device_manager_free (ply_device_manager_t *manager)
01552a
 {
01552a
   ply_trace ("freeing device manager");
01552a
 
01552a
   if (manager == NULL)
01552a
     return;
01552a
 
01552a
   ply_event_loop_stop_watching_for_exit (manager->loop,
01552a
                                          (ply_event_loop_exit_handler_t)
01552a
                                          detach_from_event_loop,
01552a
                                          manager);
01552a
   free_seats (manager);
01552a
   ply_list_free (manager->seats);
01552a
 
01552a
   free_terminals (manager);
01552a
   ply_hashtable_free (manager->terminals);
01552a
 
01552a
   if (manager->udev_monitor != NULL)
01552a
     udev_monitor_unref (manager->udev_monitor);
01552a
 
01552a
   if (manager->udev_context != NULL)
01552a
     udev_unref (manager->udev_context);
01552a
 
01552a
   free (manager);
01552a
 }
01552a
 
01552a
-static int
01552a
+static bool
01552a
 add_consoles_from_file (ply_device_manager_t *manager,
01552a
                         const char           *path)
01552a
 {
01552a
   int fd;
01552a
   char contents[512] = "";
01552a
   ssize_t contents_length;
01552a
-  int num_consoles;
01552a
+  bool has_serial_consoles;
01552a
   const char *remaining_file_contents;
01552a
 
01552a
   ply_trace ("opening %s", path);
01552a
   fd = open (path, O_RDONLY);
01552a
 
01552a
   if (fd < 0)
01552a
     {
01552a
       ply_trace ("couldn't open it: %m");
01552a
-      return 0;
01552a
+      return false;
01552a
     }
01552a
 
01552a
   ply_trace ("reading file");
01552a
   contents_length = read (fd, contents, sizeof (contents) - 1);
01552a
 
01552a
   if (contents_length <= 0)
01552a
     {
01552a
       ply_trace ("couldn't read it: %m");
01552a
       close (fd);
01552a
-      return 0;
01552a
+      return false;
01552a
     }
01552a
   close (fd);
01552a
 
01552a
   remaining_file_contents = contents;
01552a
-  num_consoles = 0;
01552a
+  has_serial_consoles = false;
01552a
 
01552a
   while (remaining_file_contents < contents + contents_length)
01552a
     {
01552a
       char *console;
01552a
       size_t console_length;
01552a
       const char *console_device;
01552a
       ply_terminal_t *terminal;
01552a
 
01552a
       /* Advance past any leading whitespace */
01552a
       remaining_file_contents += strspn (remaining_file_contents, " \n\t\v");
01552a
 
01552a
       if (*remaining_file_contents == '\0')
01552a
         {
01552a
           /* There's nothing left after the whitespace, we're done */
01552a
           break;
01552a
         }
01552a
 
01552a
       /* Find trailing whitespace and NUL terminate.  If strcspn
01552a
        * doesn't find whitespace, it gives us the length of the string
01552a
        * until the next NUL byte, which we'll just overwrite with
01552a
        * another NUL byte anyway. */
01552a
       console_length = strcspn (remaining_file_contents, " \n\t\v");
01552a
       console = strndup (remaining_file_contents, console_length);
01552a
 
01552a
       terminal = get_terminal (manager, console);
01552a
       console_device = ply_terminal_get_name (terminal);
01552a
 
01552a
       free (console);
01552a
 
01552a
       ply_trace ("console %s found!", console_device);
01552a
-      num_consoles++;
01552a
+
01552a
+      if (terminal != manager->local_console_terminal)
01552a
+        has_serial_consoles = true;
01552a
 
01552a
       /* Move past the parsed console string, and the whitespace we
01552a
        * may have found above.  If we found a NUL above and not whitespace,
01552a
        * then we're going to jump past the end of the buffer and the loop
01552a
        * will terminate
01552a
        */
01552a
       remaining_file_contents += console_length + 1;
01552a
     }
01552a
 
01552a
-  return num_consoles;
01552a
+  return has_serial_consoles;
01552a
 }
01552a
 
01552a
 static void
01552a
 create_seat_for_terminal_and_renderer_type (ply_device_manager_t *manager,
01552a
                                             const char           *device_path,
01552a
                                             ply_terminal_t       *terminal,
01552a
                                             ply_renderer_type_t   renderer_type)
01552a
 {
01552a
   ply_seat_t *seat;
01552a
   bool is_local_terminal = false;
01552a
 
01552a
   if (terminal != NULL && manager->local_console_terminal == terminal)
01552a
     is_local_terminal = true;
01552a
 
01552a
   if (is_local_terminal && manager->local_console_seat != NULL)
01552a
     {
01552a
       ply_trace ("trying to create seat for local console when one already exists");
01552a
       return;
01552a
     }
01552a
 
01552a
   ply_trace ("creating seat for %s (renderer type: %u) (terminal: %s)",
01552a
              device_path? : "", renderer_type, terminal? ply_terminal_get_name (terminal): "none");
01552a
   seat = ply_seat_new (terminal);
01552a
 
01552a
   if (!ply_seat_open (seat, renderer_type, device_path))
01552a
     {
01552a
       ply_trace ("could not create seat");
01552a
       ply_seat_free (seat);
01552a
       return;
01552a
     }
01552a
 
01552a
   ply_list_append_data (manager->seats, seat);
01552a
 
01552a
   if (is_local_terminal)
01552a
     manager->local_console_seat = seat;
01552a
 
01552a
   if (manager->seat_added_handler != NULL)
01552a
     manager->seat_added_handler (manager->seat_event_handler_data, seat);
01552a
 }
01552a
 
01552a
 static void
01552a
 create_seat_for_terminal (const char           *device_path,
01552a
                           ply_terminal_t       *terminal,
01552a
                           ply_device_manager_t *manager)
01552a
 {
01552a
   create_seat_for_terminal_and_renderer_type (manager,
01552a
                                               device_path,
01552a
                                               terminal,
01552a
                                               PLY_RENDERER_TYPE_NONE);
01552a
 }
01552a
 static bool
01552a
 create_seats_from_terminals (ply_device_manager_t *manager)
01552a
 {
01552a
-  int num_consoles;
01552a
+  bool has_serial_consoles;
01552a
 
01552a
   ply_trace ("checking for consoles");
01552a
 
01552a
   if (manager->flags & PLY_DEVICE_MANAGER_FLAGS_IGNORE_SERIAL_CONSOLES)
01552a
     {
01552a
-      num_consoles = 0;
01552a
+      has_serial_consoles = false;
01552a
       ply_trace ("ignoring all consoles but default console because explicitly told to.");
01552a
     }
01552a
   else
01552a
     {
01552a
-      num_consoles = add_consoles_from_file (manager, "/sys/class/tty/console/active");
01552a
-
01552a
-      if (num_consoles == 0)
01552a
-        ply_trace ("ignoring all consoles but default console because /sys/class/tty/console/active could not be read");
01552a
+      has_serial_consoles = add_consoles_from_file (manager, "/sys/class/tty/console/active");
01552a
     }
01552a
 
01552a
-  if (num_consoles > 1)
01552a
+  if (has_serial_consoles)
01552a
     {
01552a
       ply_trace ("serial consoles detected, managing them with details forced");
01552a
       ply_hashtable_foreach (manager->terminals,
01552a
                              (ply_hashtable_foreach_func_t *)
01552a
                              create_seat_for_terminal,
01552a
                              manager);
01552a
       return true;
01552a
     }
01552a
 
01552a
   return false;
01552a
 }
01552a
 
01552a
 static void
01552a
 create_seats_from_udev (ply_device_manager_t *manager)
01552a
 {
01552a
   bool found_drm_device, found_fb_device;
01552a
 
01552a
   ply_trace ("Looking for devices from udev");
01552a
 
01552a
   found_drm_device = create_seats_for_subsystem (manager, SUBSYSTEM_DRM);
01552a
   found_fb_device = create_seats_for_subsystem (manager, SUBSYSTEM_FRAME_BUFFER);
01552a
 
01552a
   if (found_drm_device || found_fb_device)
01552a
     return;
01552a
 
01552a
   ply_trace ("Creating non-graphical seat, since there's no suitable graphics hardware");
01552a
   create_seat_for_terminal_and_renderer_type (manager,
01552a
                                               ply_terminal_get_name (manager->local_console_terminal),
01552a
                                               manager->local_console_terminal,
01552a
                                               PLY_RENDERER_TYPE_NONE);
01552a
-- 
01552a
1.8.3.1
01552a
01552a
01552a
From 5fbfc8d1ec9da9060ebeaf0938afe8e2e0102b3d Mon Sep 17 00:00:00 2001
01552a
From: Ray Strode <rstrode@redhat.com>
01552a
Date: Mon, 3 Mar 2014 18:00:19 -0500
01552a
Subject: [PATCH 2/4] device-manager: be more tolerant of tty active console
01552a
 value
01552a
01552a
Some kernels mistakenly put tty1 instead of tty0 in the file,
01552a
so try to cope with them for maximium compatibility.
01552a
---
01552a
 src/libply-splash-core/ply-device-manager.c | 3 ++-
01552a
 1 file changed, 2 insertions(+), 1 deletion(-)
01552a
01552a
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
01552a
index 098fd85..dbc203d 100644
01552a
--- a/src/libply-splash-core/ply-device-manager.c
01552a
+++ b/src/libply-splash-core/ply-device-manager.c
01552a
@@ -441,61 +441,62 @@ free_terminal (char                 *device,
01552a
                ply_device_manager_t *manager)
01552a
 {
01552a
   ply_hashtable_remove (manager->terminals, device);
01552a
 
01552a
   ply_terminal_close (terminal);
01552a
   ply_terminal_free (terminal);
01552a
 }
01552a
 
01552a
 static void
01552a
 free_terminals (ply_device_manager_t *manager)
01552a
 {
01552a
   ply_hashtable_foreach (manager->terminals,
01552a
                          (ply_hashtable_foreach_func_t *)
01552a
                          free_terminal,
01552a
                          manager);
01552a
 }
01552a
 
01552a
 static ply_terminal_t *
01552a
 get_terminal (ply_device_manager_t *manager,
01552a
               const char           *device_name)
01552a
 {
01552a
   char *full_name = NULL;
01552a
   ply_terminal_t *terminal;
01552a
 
01552a
   if (strncmp (device_name, "/dev/", strlen ("/dev/")) == 0)
01552a
     full_name = strdup (device_name);
01552a
   else
01552a
     asprintf (&full_name, "/dev/%s", device_name);
01552a
 
01552a
   if (strcmp (full_name, "/dev/tty0") == 0 ||
01552a
-      strcmp (full_name, "/dev/tty") == 0)
01552a
+      strcmp (full_name, "/dev/tty") == 0 ||
01552a
+      strcmp (full_name, ply_terminal_get_name (manager->local_console_terminal)) == 0)
01552a
     {
01552a
       terminal = manager->local_console_terminal;
01552a
       goto done;
01552a
     }
01552a
 
01552a
   terminal = ply_hashtable_lookup (manager->terminals, full_name);
01552a
 
01552a
   if (terminal == NULL)
01552a
     {
01552a
       terminal = ply_terminal_new (full_name);
01552a
 
01552a
       ply_hashtable_insert (manager->terminals,
01552a
                             (void *) ply_terminal_get_name (terminal),
01552a
                             terminal);
01552a
     }
01552a
 
01552a
 done:
01552a
   free (full_name);
01552a
   return terminal;
01552a
 }
01552a
 
01552a
 ply_device_manager_t *
01552a
 ply_device_manager_new (const char                 *default_tty,
01552a
                         ply_device_manager_flags_t  flags)
01552a
 {
01552a
   ply_device_manager_t *manager;
01552a
 
01552a
   manager = calloc (1, sizeof (ply_device_manager_t));
01552a
   manager->loop = NULL;
01552a
   manager->terminals = ply_hashtable_new (ply_hashtable_string_hash, ply_hashtable_string_compare);
01552a
-- 
01552a
1.8.3.1
01552a
01552a
01552a
From 0d5fae7feb3c2fb462f124940e91fea16298eb1f Mon Sep 17 00:00:00 2001
01552a
From: Ray Strode <rstrode@redhat.com>
01552a
Date: Thu, 6 Mar 2014 14:42:16 -0500
01552a
Subject: [PATCH 3/4] seat: make sure to open terminal when adding text
01552a
 displays
01552a
01552a
If we have a pixel display, the renderer will handle opening the
01552a
associated terminal. but if we don't have a pixel display, something
01552a
needs to open the terminal.
01552a
01552a
This commit adds code to do that.
01552a
---
01552a
 src/libply-splash-core/ply-seat.c | 13 +++++++++++++
01552a
 1 file changed, 13 insertions(+)
01552a
01552a
diff --git a/src/libply-splash-core/ply-seat.c b/src/libply-splash-core/ply-seat.c
01552a
index 541b29e..2ac8bf7 100644
01552a
--- a/src/libply-splash-core/ply-seat.c
01552a
+++ b/src/libply-splash-core/ply-seat.c
01552a
@@ -75,60 +75,73 @@ add_pixel_displays (ply_seat_t *seat)
01552a
   ply_list_node_t *node;
01552a
 
01552a
   heads = ply_renderer_get_heads (seat->renderer);
01552a
 
01552a
   ply_trace ("Adding displays for %d heads",
01552a
              ply_list_get_length (heads));
01552a
 
01552a
   node = ply_list_get_first_node (heads);
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_list_node_t *next_node;
01552a
       ply_renderer_head_t *head;
01552a
       ply_pixel_display_t *display;
01552a
 
01552a
       head = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (heads, node);
01552a
 
01552a
       display = ply_pixel_display_new (seat->renderer, head);
01552a
 
01552a
       ply_list_append_data (seat->pixel_displays, display);
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 }
01552a
 
01552a
 static void
01552a
 add_text_displays (ply_seat_t *seat)
01552a
 {
01552a
   ply_text_display_t *display;
01552a
 
01552a
+  if (!ply_terminal_is_open (seat->terminal))
01552a
+    {
01552a
+      if (!ply_terminal_open (seat->terminal))
01552a
+        {
01552a
+          ply_trace ("could not add terminal %s: %m",
01552a
+                     ply_terminal_get_name (seat->terminal));
01552a
+          return;
01552a
+        }
01552a
+    }
01552a
+
01552a
+  ply_trace ("adding text display for terminal %s",
01552a
+             ply_terminal_get_name (seat->terminal));
01552a
+
01552a
   display = ply_text_display_new (seat->terminal);
01552a
   ply_list_append_data (seat->text_displays, display);
01552a
 }
01552a
 
01552a
 bool
01552a
 ply_seat_open (ply_seat_t          *seat,
01552a
                ply_renderer_type_t  renderer_type,
01552a
                const char          *device)
01552a
 {
01552a
   if (renderer_type != PLY_RENDERER_TYPE_NONE)
01552a
     {
01552a
       ply_renderer_t *renderer;
01552a
 
01552a
       renderer = ply_renderer_new (renderer_type, device, seat->terminal);
01552a
 
01552a
       if (!ply_renderer_open (renderer))
01552a
         {
01552a
           ply_trace ("could not open renderer for %s", device);
01552a
           ply_renderer_free (renderer);
01552a
 
01552a
           seat->renderer = NULL;
01552a
           seat->renderer_active = false;
01552a
 
01552a
           if (renderer_type != PLY_RENDERER_TYPE_AUTO)
01552a
             return false;
01552a
         }
01552a
       else
01552a
         {
01552a
           seat->renderer = renderer;
01552a
           seat->renderer_active = true;
01552a
-- 
01552a
1.8.3.1
01552a
01552a
01552a
From aa2f5ac95c7cc0f4eb5f61465ecaf22247c7047c Mon Sep 17 00:00:00 2001
01552a
From: Ray Strode <rstrode@redhat.com>
01552a
Date: Thu, 6 Mar 2014 15:31:20 -0500
01552a
Subject: [PATCH 4/4] device-manager: Don't add local console to terminals hash
01552a
 table unless passed on cmdline
01552a
01552a
it's unexpected for plymouth to show boot messages on the local console
01552a
if there is not console=tty0 on the kernel command line.
01552a
01552a
This commit fixes that.
01552a
---
01552a
 src/libply-splash-core/ply-device-manager.c | 7 ++++---
01552a
 1 file changed, 4 insertions(+), 3 deletions(-)
01552a
01552a
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
01552a
index dbc203d..8f5360c 100644
01552a
--- a/src/libply-splash-core/ply-device-manager.c
01552a
+++ b/src/libply-splash-core/ply-device-manager.c
01552a
@@ -445,92 +445,93 @@ free_terminal (char                 *device,
01552a
   ply_terminal_close (terminal);
01552a
   ply_terminal_free (terminal);
01552a
 }
01552a
 
01552a
 static void
01552a
 free_terminals (ply_device_manager_t *manager)
01552a
 {
01552a
   ply_hashtable_foreach (manager->terminals,
01552a
                          (ply_hashtable_foreach_func_t *)
01552a
                          free_terminal,
01552a
                          manager);
01552a
 }
01552a
 
01552a
 static ply_terminal_t *
01552a
 get_terminal (ply_device_manager_t *manager,
01552a
               const char           *device_name)
01552a
 {
01552a
   char *full_name = NULL;
01552a
   ply_terminal_t *terminal;
01552a
 
01552a
   if (strncmp (device_name, "/dev/", strlen ("/dev/")) == 0)
01552a
     full_name = strdup (device_name);
01552a
   else
01552a
     asprintf (&full_name, "/dev/%s", device_name);
01552a
 
01552a
   if (strcmp (full_name, "/dev/tty0") == 0 ||
01552a
       strcmp (full_name, "/dev/tty") == 0 ||
01552a
       strcmp (full_name, ply_terminal_get_name (manager->local_console_terminal)) == 0)
01552a
     {
01552a
       terminal = manager->local_console_terminal;
01552a
+
01552a
+      ply_hashtable_insert (manager->terminals,
01552a
+                            (void *) ply_terminal_get_name (terminal),
01552a
+                            terminal);
01552a
       goto done;
01552a
     }
01552a
 
01552a
   terminal = ply_hashtable_lookup (manager->terminals, full_name);
01552a
 
01552a
   if (terminal == NULL)
01552a
     {
01552a
       terminal = ply_terminal_new (full_name);
01552a
 
01552a
       ply_hashtable_insert (manager->terminals,
01552a
                             (void *) ply_terminal_get_name (terminal),
01552a
                             terminal);
01552a
     }
01552a
 
01552a
 done:
01552a
   free (full_name);
01552a
   return terminal;
01552a
 }
01552a
 
01552a
 ply_device_manager_t *
01552a
 ply_device_manager_new (const char                 *default_tty,
01552a
                         ply_device_manager_flags_t  flags)
01552a
 {
01552a
   ply_device_manager_t *manager;
01552a
 
01552a
   manager = calloc (1, sizeof (ply_device_manager_t));
01552a
   manager->loop = NULL;
01552a
   manager->terminals = ply_hashtable_new (ply_hashtable_string_hash, ply_hashtable_string_compare);
01552a
   manager->local_console_terminal = ply_terminal_new (default_tty);
01552a
-  ply_hashtable_insert (manager->terminals,
01552a
-                        (void *) ply_terminal_get_name (manager->local_console_terminal),
01552a
-                        manager->local_console_terminal);
01552a
   manager->seats = ply_list_new ();
01552a
   manager->flags = flags;
01552a
 
01552a
   if (!(flags & PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV))
01552a
     manager->udev_context = udev_new ();
01552a
 
01552a
   attach_to_event_loop (manager, ply_event_loop_get_default ());
01552a
 
01552a
   return manager;
01552a
 }
01552a
 
01552a
 void
01552a
 ply_device_manager_free (ply_device_manager_t *manager)
01552a
 {
01552a
   ply_trace ("freeing device manager");
01552a
 
01552a
   if (manager == NULL)
01552a
     return;
01552a
 
01552a
   ply_event_loop_stop_watching_for_exit (manager->loop,
01552a
                                          (ply_event_loop_exit_handler_t)
01552a
                                          detach_from_event_loop,
01552a
                                          manager);
01552a
   free_seats (manager);
01552a
   ply_list_free (manager->seats);
01552a
 
01552a
   free_terminals (manager);
01552a
   ply_hashtable_free (manager->terminals);
01552a
 
01552a
   if (manager->udev_monitor != NULL)
01552a
-- 
01552a
1.8.3.1
01552a