Blame SOURCES/0234-Make-exit-take-a-return-code.patch

4fe85b
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
4fe85b
From: Peter Jones <pjones@redhat.com>
4fe85b
Date: Wed, 26 Feb 2014 21:49:12 -0500
4fe85b
Subject: [PATCH] Make "exit" take a return code.
4fe85b
4fe85b
This adds "exit" with a return code.  With this patch, any "exit"
4fe85b
command /may/ include a return code, and on platforms that support
4fe85b
returning with an exit status, we will do so.  By default we return the
4fe85b
same exit status we did before this patch.
4fe85b
4fe85b
Signed-off-by: Peter Jones <pjones@redhat.com>
4fe85b
---
4fe85b
 grub-core/commands/minicmd.c         | 20 ++++++++++++++++----
4fe85b
 grub-core/kern/efi/efi.c             |  9 +++++++--
4fe85b
 grub-core/kern/emu/main.c            |  6 ++++++
4fe85b
 grub-core/kern/emu/misc.c            |  5 +++--
4fe85b
 grub-core/kern/i386/coreboot/init.c  |  2 +-
4fe85b
 grub-core/kern/i386/qemu/init.c      |  2 +-
4fe85b
 grub-core/kern/ieee1275/init.c       |  2 +-
4fe85b
 grub-core/kern/mips/arc/init.c       |  2 +-
4fe85b
 grub-core/kern/mips/loongson/init.c  |  2 +-
4fe85b
 grub-core/kern/mips/qemu_mips/init.c |  2 +-
4fe85b
 grub-core/kern/misc.c                |  2 +-
4fe85b
 grub-core/kern/uboot/init.c          |  6 +++---
4fe85b
 grub-core/kern/xen/init.c            |  2 +-
4fe85b
 include/grub/misc.h                  |  2 +-
4fe85b
 14 files changed, 44 insertions(+), 20 deletions(-)
4fe85b
4fe85b
diff --git a/grub-core/commands/minicmd.c b/grub-core/commands/minicmd.c
4fe85b
index a3a11824172..b25ca4b9f17 100644
4fe85b
--- a/grub-core/commands/minicmd.c
4fe85b
+++ b/grub-core/commands/minicmd.c
4fe85b
@@ -176,12 +176,24 @@ grub_mini_cmd_lsmod (struct grub_command *cmd __attribute__ ((unused)),
4fe85b
 }
4fe85b
 
4fe85b
 /* exit */
4fe85b
-static grub_err_t __attribute__ ((noreturn))
4fe85b
+static grub_err_t
4fe85b
 grub_mini_cmd_exit (struct grub_command *cmd __attribute__ ((unused)),
4fe85b
-		    int argc __attribute__ ((unused)),
4fe85b
-		    char *argv[] __attribute__ ((unused)))
4fe85b
+		    int argc, char *argv[])
4fe85b
 {
4fe85b
-  grub_exit ();
4fe85b
+  int retval = -1;
4fe85b
+  unsigned long n;
4fe85b
+
4fe85b
+  if (argc < 0 || argc > 1)
4fe85b
+    return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
4fe85b
+
4fe85b
+  if (argc == 1)
4fe85b
+    {
4fe85b
+      n = grub_strtoul (argv[0], 0, 10);
4fe85b
+      if (n != ~0UL)
4fe85b
+	retval = n;
4fe85b
+    }
4fe85b
+
4fe85b
+  grub_exit (retval);
4fe85b
   /* Not reached.  */
4fe85b
 }
4fe85b
 
4fe85b
diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c
4fe85b
index 7dfe2ef1455..453f97a7595 100644
4fe85b
--- a/grub-core/kern/efi/efi.c
4fe85b
+++ b/grub-core/kern/efi/efi.c
4fe85b
@@ -155,11 +155,16 @@ grub_efi_get_loaded_image (grub_efi_handle_t image_handle)
4fe85b
 }
4fe85b
 
4fe85b
 void
4fe85b
-grub_exit (void)
4fe85b
+grub_exit (int retval)
4fe85b
 {
4fe85b
+  int rc = GRUB_EFI_LOAD_ERROR;
4fe85b
+
4fe85b
+  if (retval == 0)
4fe85b
+    rc = GRUB_EFI_SUCCESS;
4fe85b
+
4fe85b
   grub_machine_fini (GRUB_LOADER_FLAG_NORETURN);
4fe85b
   efi_call_4 (grub_efi_system_table->boot_services->exit,
4fe85b
-              grub_efi_image_handle, GRUB_EFI_LOAD_ERROR, 0, 0);
4fe85b
+              grub_efi_image_handle, rc, 0, 0);
4fe85b
   for (;;) ;
4fe85b
 }
4fe85b
 
4fe85b
diff --git a/grub-core/kern/emu/main.c b/grub-core/kern/emu/main.c
4fe85b
index 4b509139c4a..d7c880c0c1f 100644
4fe85b
--- a/grub-core/kern/emu/main.c
4fe85b
+++ b/grub-core/kern/emu/main.c
4fe85b
@@ -65,6 +65,12 @@ grub_reboot (void)
4fe85b
   longjmp (main_env, 1);
4fe85b
 }
4fe85b
 
4fe85b
+void
4fe85b
+grub_exit (int retval __attribute__((unused)))
4fe85b
+{
4fe85b
+  grub_reboot ();
4fe85b
+}
4fe85b
+
4fe85b
 void
4fe85b
 grub_machine_init (void)
4fe85b
 {
4fe85b
diff --git a/grub-core/kern/emu/misc.c b/grub-core/kern/emu/misc.c
4fe85b
index bb606da2803..258a5649e2d 100644
4fe85b
--- a/grub-core/kern/emu/misc.c
4fe85b
+++ b/grub-core/kern/emu/misc.c
4fe85b
@@ -135,9 +135,10 @@ xasprintf (const char *fmt, ...)
4fe85b
 #endif
4fe85b
 
4fe85b
 void
4fe85b
-grub_exit (void)
4fe85b
+__attribute__ ((noreturn))
4fe85b
+grub_exit (int rc)
4fe85b
 {
4fe85b
-  exit (1);
4fe85b
+  exit (rc < 0 ? 1 : rc);
4fe85b
 }
4fe85b
 
4fe85b
 grub_uint64_t
4fe85b
diff --git a/grub-core/kern/i386/coreboot/init.c b/grub-core/kern/i386/coreboot/init.c
4fe85b
index 3314f027fec..36f9134b7b7 100644
4fe85b
--- a/grub-core/kern/i386/coreboot/init.c
4fe85b
+++ b/grub-core/kern/i386/coreboot/init.c
4fe85b
@@ -41,7 +41,7 @@ extern grub_uint8_t _end[];
4fe85b
 extern grub_uint8_t _edata[];
4fe85b
 
4fe85b
 void  __attribute__ ((noreturn))
4fe85b
-grub_exit (void)
4fe85b
+grub_exit (int rc __attribute__((unused)))
4fe85b
 {
4fe85b
   /* We can't use grub_fatal() in this function.  This would create an infinite
4fe85b
      loop, since grub_fatal() calls grub_abort() which in turn calls grub_exit().  */
4fe85b
diff --git a/grub-core/kern/i386/qemu/init.c b/grub-core/kern/i386/qemu/init.c
4fe85b
index 271b6fbfabd..9fafe98f015 100644
4fe85b
--- a/grub-core/kern/i386/qemu/init.c
4fe85b
+++ b/grub-core/kern/i386/qemu/init.c
4fe85b
@@ -42,7 +42,7 @@ extern grub_uint8_t _end[];
4fe85b
 extern grub_uint8_t _edata[];
4fe85b
 
4fe85b
 void  __attribute__ ((noreturn))
4fe85b
-grub_exit (void)
4fe85b
+grub_exit (int rc __attribute__((unused)))
4fe85b
 {
4fe85b
   /* We can't use grub_fatal() in this function.  This would create an infinite
4fe85b
      loop, since grub_fatal() calls grub_abort() which in turn calls grub_exit().  */
4fe85b
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
4fe85b
index 8ca4bf79f09..e2540bc41ce 100644
4fe85b
--- a/grub-core/kern/ieee1275/init.c
4fe85b
+++ b/grub-core/kern/ieee1275/init.c
4fe85b
@@ -60,7 +60,7 @@ grub_addr_t grub_ieee1275_original_stack;
4fe85b
 #endif
4fe85b
 
4fe85b
 void
4fe85b
-grub_exit (void)
4fe85b
+grub_exit (int rc __attribute__((unused)))
4fe85b
 {
4fe85b
   grub_ieee1275_exit ();
4fe85b
 }
4fe85b
diff --git a/grub-core/kern/mips/arc/init.c b/grub-core/kern/mips/arc/init.c
4fe85b
index b4f50e49642..90049cb53ce 100644
4fe85b
--- a/grub-core/kern/mips/arc/init.c
4fe85b
+++ b/grub-core/kern/mips/arc/init.c
4fe85b
@@ -276,7 +276,7 @@ grub_halt (void)
4fe85b
 }
4fe85b
 
4fe85b
 void
4fe85b
-grub_exit (void)
4fe85b
+grub_exit (int rc __attribute__((unused)))
4fe85b
 {
4fe85b
   GRUB_ARC_FIRMWARE_VECTOR->exit ();
4fe85b
 
4fe85b
diff --git a/grub-core/kern/mips/loongson/init.c b/grub-core/kern/mips/loongson/init.c
4fe85b
index 7b96531b983..dff598ca7b0 100644
4fe85b
--- a/grub-core/kern/mips/loongson/init.c
4fe85b
+++ b/grub-core/kern/mips/loongson/init.c
4fe85b
@@ -304,7 +304,7 @@ grub_halt (void)
4fe85b
 }
4fe85b
 
4fe85b
 void
4fe85b
-grub_exit (void)
4fe85b
+grub_exit (int rc __attribute__((unused)))
4fe85b
 {
4fe85b
   grub_halt ();
4fe85b
 }
4fe85b
diff --git a/grub-core/kern/mips/qemu_mips/init.c b/grub-core/kern/mips/qemu_mips/init.c
4fe85b
index be88b77d22d..8b6c55ffc01 100644
4fe85b
--- a/grub-core/kern/mips/qemu_mips/init.c
4fe85b
+++ b/grub-core/kern/mips/qemu_mips/init.c
4fe85b
@@ -75,7 +75,7 @@ grub_machine_fini (int flags __attribute__ ((unused)))
4fe85b
 }
4fe85b
 
4fe85b
 void
4fe85b
-grub_exit (void)
4fe85b
+grub_exit (int rc __attribute__((unused)))
4fe85b
 {
4fe85b
   grub_halt ();
4fe85b
 }
4fe85b
diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c
4fe85b
index 392c697db03..240396c55f3 100644
4fe85b
--- a/grub-core/kern/misc.c
4fe85b
+++ b/grub-core/kern/misc.c
4fe85b
@@ -1278,7 +1278,7 @@ grub_abort (void)
4fe85b
       grub_getkey ();
4fe85b
     }
4fe85b
 
4fe85b
-  grub_exit ();
4fe85b
+  grub_exit (1);
4fe85b
 }
4fe85b
 
4fe85b
 #if defined (__clang__) && !defined (GRUB_UTIL)
4fe85b
diff --git a/grub-core/kern/uboot/init.c b/grub-core/kern/uboot/init.c
4fe85b
index 5dcc106ed9b..430c62b66e0 100644
4fe85b
--- a/grub-core/kern/uboot/init.c
4fe85b
+++ b/grub-core/kern/uboot/init.c
4fe85b
@@ -43,9 +43,9 @@ extern grub_uint32_t grub_uboot_machine_type;
4fe85b
 extern grub_addr_t grub_uboot_boot_data;
4fe85b
 
4fe85b
 void
4fe85b
-grub_exit (void)
4fe85b
+grub_exit (int rc)
4fe85b
 {
4fe85b
-  grub_uboot_return (0);
4fe85b
+  grub_uboot_return (rc < 0 ? 1 : rc);
4fe85b
 }
4fe85b
 
4fe85b
 grub_uint32_t
4fe85b
@@ -94,7 +94,7 @@ grub_machine_init (void)
4fe85b
   if (!ver)
4fe85b
     {
4fe85b
       /* Don't even have a console to log errors to... */
4fe85b
-      grub_exit ();
4fe85b
+      grub_exit (-1);
4fe85b
     }
4fe85b
   else if (ver > API_SIG_VERSION)
4fe85b
     {
4fe85b
diff --git a/grub-core/kern/xen/init.c b/grub-core/kern/xen/init.c
4fe85b
index 0559c033c3d..fce526d417b 100644
4fe85b
--- a/grub-core/kern/xen/init.c
4fe85b
+++ b/grub-core/kern/xen/init.c
4fe85b
@@ -549,7 +549,7 @@ grub_machine_init (void)
4fe85b
 }
4fe85b
 
4fe85b
 void
4fe85b
-grub_exit (void)
4fe85b
+grub_exit (int rc __attribute__((unused)))
4fe85b
 {
4fe85b
   struct sched_shutdown arg;
4fe85b
 
4fe85b
diff --git a/include/grub/misc.h b/include/grub/misc.h
4fe85b
index 34250291908..c6851fb9dcf 100644
4fe85b
--- a/include/grub/misc.h
4fe85b
+++ b/include/grub/misc.h
4fe85b
@@ -398,7 +398,7 @@ int EXPORT_FUNC(grub_vsnprintf) (char *str, grub_size_t n, const char *fmt,
4fe85b
 char *EXPORT_FUNC(grub_xasprintf) (const char *fmt, ...)
4fe85b
      __attribute__ ((format (GNU_PRINTF, 1, 2))) WARN_UNUSED_RESULT;
4fe85b
 char *EXPORT_FUNC(grub_xvasprintf) (const char *fmt, va_list args) WARN_UNUSED_RESULT;
4fe85b
-void EXPORT_FUNC(grub_exit) (void) __attribute__ ((noreturn));
4fe85b
+void EXPORT_FUNC(grub_exit) (int rc) __attribute__ ((noreturn));
4fe85b
 grub_uint64_t EXPORT_FUNC(grub_divmod64) (grub_uint64_t n,
4fe85b
 					  grub_uint64_t d,
4fe85b
 					  grub_uint64_t *r);