grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v0] Require human interaction to go to normal shell if grub.cfg h


From: Jon McCune
Subject: [PATCH v0] Require human interaction to go to normal shell if grub.cfg has a problem
Date: Mon, 25 Nov 2013 15:46:48 -0800

The rescue prompt is very useful for human operators, but not so
useful in unattended environments.  Add a facility for rebooting
after a delay, so that, e.g., the system can still PXE boot if
there is no console attached.

Signed-off-by: Jon McCune <address@hidden>
---
 grub-core/normal/main.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c
index ad36273..f8953d5 100644
--- a/grub-core/normal/main.c
+++ b/grub-core/normal/main.c
@@ -32,6 +32,7 @@
 #include <grub/i18n.h>
 #include <grub/charset.h>
 #include <grub/script_sh.h>
+#include <grub/time.h>
 
 GRUB_MOD_LICENSE ("GPLv3+");
 
@@ -333,6 +334,21 @@ grub_normal_execute (const char *config, int nested, int 
batch)
     }
 }
 
+/* Copied from grub-core/commands/sleep.c. */
+static int
+grub_interruptible_millisleep (grub_uint32_t ms)
+{
+  grub_uint64_t start;
+
+  start = grub_get_time_ms ();
+
+  while (grub_get_time_ms () - start < ms)
+    if (grub_getkey_noblock () == GRUB_TERM_ESC)
+      return 1;
+
+  return 0;
+}
+
 /* This starts the normal mode.  */
 void
 grub_enter_normal_mode (const char *config)
@@ -340,6 +356,15 @@ grub_enter_normal_mode (const char *config)
   grub_boot_time ("Entering normal mode");
   nested_level++;
   grub_normal_execute (config, 0, 0);
+  /* Control only returns from grub_normal_execute() if there is some kind of
+   * problem with grub.cfg, like it does not exist.  Reboot by default unless
+   * ESC is pressed within 5 seconds. */
+  grub_printf ("Press ESC in 5 seconds for a rescue shell.\n");
+  if (!grub_interruptible_millisleep (5000))
+    {
+      grub_printf ("Rebooting instead of going to rescue shell.\n");
+      grub_reboot ();
+    }
   grub_boot_time ("Entering shell");
   grub_cmdline_run (0);
   nested_level--;
-- 
1.8.4.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]