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

d9d99f
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
d9d99f
From: Peter Jones <pjones@redhat.com>
d9d99f
Date: Wed, 26 Feb 2014 21:49:12 -0500
d9d99f
Subject: [PATCH] Make "exit" take a return code.
d9d99f
d9d99f
This adds "exit" with a return code.  With this patch, any "exit"
d9d99f
command /may/ include a return code, and on platforms that support
d9d99f
returning with an exit status, we will do so.  By default we return the
d9d99f
same exit status we did before this patch.
d9d99f
d9d99f
Signed-off-by: Peter Jones <pjones@redhat.com>
d9d99f
---
d9d99f
 grub-core/commands/minicmd.c         | 20 ++++++++++++++++----
d9d99f
 grub-core/kern/efi/efi.c             |  9 +++++++--
d9d99f
 grub-core/kern/emu/main.c            |  2 +-
d9d99f
 grub-core/kern/emu/misc.c            |  5 +++--
d9d99f
 grub-core/kern/i386/coreboot/init.c  |  2 +-
d9d99f
 grub-core/kern/i386/qemu/init.c      |  2 +-
d9d99f
 grub-core/kern/ieee1275/init.c       |  2 +-
d9d99f
 grub-core/kern/mips/arc/init.c       |  2 +-
d9d99f
 grub-core/kern/mips/loongson/init.c  |  2 +-
d9d99f
 grub-core/kern/mips/qemu_mips/init.c |  2 +-
d9d99f
 grub-core/kern/misc.c                |  2 +-
d9d99f
 grub-core/kern/uboot/init.c          |  6 +++---
d9d99f
 grub-core/kern/xen/init.c            |  2 +-
d9d99f
 include/grub/misc.h                  |  2 +-
d9d99f
 14 files changed, 39 insertions(+), 21 deletions(-)
d9d99f
d9d99f
diff --git a/grub-core/commands/minicmd.c b/grub-core/commands/minicmd.c
d9d99f
index a3a11824172..b25ca4b9f17 100644
d9d99f
--- a/grub-core/commands/minicmd.c
d9d99f
+++ b/grub-core/commands/minicmd.c
d9d99f
@@ -176,12 +176,24 @@ grub_mini_cmd_lsmod (struct grub_command *cmd __attribute__ ((unused)),
d9d99f
 }
d9d99f
 
d9d99f
 /* exit */
d9d99f
-static grub_err_t __attribute__ ((noreturn))
d9d99f
+static grub_err_t
d9d99f
 grub_mini_cmd_exit (struct grub_command *cmd __attribute__ ((unused)),
d9d99f
-		    int argc __attribute__ ((unused)),
d9d99f
-		    char *argv[] __attribute__ ((unused)))
d9d99f
+		    int argc, char *argv[])
d9d99f
 {
d9d99f
-  grub_exit ();
d9d99f
+  int retval = -1;
d9d99f
+  unsigned long n;
d9d99f
+
d9d99f
+  if (argc < 0 || argc > 1)
d9d99f
+    return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
d9d99f
+
d9d99f
+  if (argc == 1)
d9d99f
+    {
d9d99f
+      n = grub_strtoul (argv[0], 0, 10);
d9d99f
+      if (n != ~0UL)
d9d99f
+	retval = n;
d9d99f
+    }
d9d99f
+
d9d99f
+  grub_exit (retval);
d9d99f
   /* Not reached.  */
d9d99f
 }
d9d99f
 
d9d99f
diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c
d9d99f
index 708581fcbde..e339f264b3a 100644
d9d99f
--- a/grub-core/kern/efi/efi.c
d9d99f
+++ b/grub-core/kern/efi/efi.c
d9d99f
@@ -164,11 +164,16 @@ grub_reboot (void)
d9d99f
 }
d9d99f
 
d9d99f
 void
d9d99f
-grub_exit (void)
d9d99f
+grub_exit (int retval)
d9d99f
 {
d9d99f
+  int rc = GRUB_EFI_LOAD_ERROR;
d9d99f
+
d9d99f
+  if (retval == 0)
d9d99f
+    rc = GRUB_EFI_SUCCESS;
d9d99f
+
d9d99f
   grub_machine_fini (GRUB_LOADER_FLAG_NORETURN);
d9d99f
   efi_call_4 (grub_efi_system_table->boot_services->exit,
d9d99f
-              grub_efi_image_handle, GRUB_EFI_SUCCESS, 0, 0);
d9d99f
+              grub_efi_image_handle, rc, 0, 0);
d9d99f
   for (;;) ;
d9d99f
 }
d9d99f
 
d9d99f
diff --git a/grub-core/kern/emu/main.c b/grub-core/kern/emu/main.c
d9d99f
index 425bb960347..55ea5a11ccd 100644
d9d99f
--- a/grub-core/kern/emu/main.c
d9d99f
+++ b/grub-core/kern/emu/main.c
d9d99f
@@ -67,7 +67,7 @@ grub_reboot (void)
d9d99f
 }
d9d99f
 
d9d99f
 void
d9d99f
-grub_exit (void)
d9d99f
+grub_exit (int retval __attribute__((unused)))
d9d99f
 {
d9d99f
   grub_reboot ();
d9d99f
 }
d9d99f
diff --git a/grub-core/kern/emu/misc.c b/grub-core/kern/emu/misc.c
d9d99f
index 76661337f10..82012a72fcb 100644
d9d99f
--- a/grub-core/kern/emu/misc.c
d9d99f
+++ b/grub-core/kern/emu/misc.c
d9d99f
@@ -137,9 +137,10 @@ xasprintf (const char *fmt, ...)
d9d99f
 
d9d99f
 #if !defined (GRUB_MACHINE_EMU) || defined (GRUB_UTIL)
d9d99f
 void
d9d99f
-grub_exit (void)
d9d99f
+__attribute__ ((noreturn))
d9d99f
+grub_exit (int rc)
d9d99f
 {
d9d99f
-  exit (1);
d9d99f
+  exit (rc < 0 ? 1 : rc);
d9d99f
 }
d9d99f
 #endif
d9d99f
 
d9d99f
diff --git a/grub-core/kern/i386/coreboot/init.c b/grub-core/kern/i386/coreboot/init.c
d9d99f
index 3314f027fec..36f9134b7b7 100644
d9d99f
--- a/grub-core/kern/i386/coreboot/init.c
d9d99f
+++ b/grub-core/kern/i386/coreboot/init.c
d9d99f
@@ -41,7 +41,7 @@ extern grub_uint8_t _end[];
d9d99f
 extern grub_uint8_t _edata[];
d9d99f
 
d9d99f
 void  __attribute__ ((noreturn))
d9d99f
-grub_exit (void)
d9d99f
+grub_exit (int rc __attribute__((unused)))
d9d99f
 {
d9d99f
   /* We can't use grub_fatal() in this function.  This would create an infinite
d9d99f
      loop, since grub_fatal() calls grub_abort() which in turn calls grub_exit().  */
d9d99f
diff --git a/grub-core/kern/i386/qemu/init.c b/grub-core/kern/i386/qemu/init.c
d9d99f
index 271b6fbfabd..9fafe98f015 100644
d9d99f
--- a/grub-core/kern/i386/qemu/init.c
d9d99f
+++ b/grub-core/kern/i386/qemu/init.c
d9d99f
@@ -42,7 +42,7 @@ extern grub_uint8_t _end[];
d9d99f
 extern grub_uint8_t _edata[];
d9d99f
 
d9d99f
 void  __attribute__ ((noreturn))
d9d99f
-grub_exit (void)
d9d99f
+grub_exit (int rc __attribute__((unused)))
d9d99f
 {
d9d99f
   /* We can't use grub_fatal() in this function.  This would create an infinite
d9d99f
      loop, since grub_fatal() calls grub_abort() which in turn calls grub_exit().  */
d9d99f
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
d9d99f
index 0d8ebf58b95..f5423ce27d9 100644
d9d99f
--- a/grub-core/kern/ieee1275/init.c
d9d99f
+++ b/grub-core/kern/ieee1275/init.c
d9d99f
@@ -68,7 +68,7 @@ grub_addr_t grub_ieee1275_original_stack;
d9d99f
 #endif
d9d99f
 
d9d99f
 void
d9d99f
-grub_exit (void)
d9d99f
+grub_exit (int rc __attribute__((unused)))
d9d99f
 {
d9d99f
   grub_ieee1275_exit ();
d9d99f
 }
d9d99f
diff --git a/grub-core/kern/mips/arc/init.c b/grub-core/kern/mips/arc/init.c
d9d99f
index 3834a149093..86b3a25ec40 100644
d9d99f
--- a/grub-core/kern/mips/arc/init.c
d9d99f
+++ b/grub-core/kern/mips/arc/init.c
d9d99f
@@ -276,7 +276,7 @@ grub_halt (void)
d9d99f
 }
d9d99f
 
d9d99f
 void
d9d99f
-grub_exit (void)
d9d99f
+grub_exit (int rc __attribute__((unused)))
d9d99f
 {
d9d99f
   GRUB_ARC_FIRMWARE_VECTOR->exit ();
d9d99f
 
d9d99f
diff --git a/grub-core/kern/mips/loongson/init.c b/grub-core/kern/mips/loongson/init.c
d9d99f
index 7b96531b983..dff598ca7b0 100644
d9d99f
--- a/grub-core/kern/mips/loongson/init.c
d9d99f
+++ b/grub-core/kern/mips/loongson/init.c
d9d99f
@@ -304,7 +304,7 @@ grub_halt (void)
d9d99f
 }
d9d99f
 
d9d99f
 void
d9d99f
-grub_exit (void)
d9d99f
+grub_exit (int rc __attribute__((unused)))
d9d99f
 {
d9d99f
   grub_halt ();
d9d99f
 }
d9d99f
diff --git a/grub-core/kern/mips/qemu_mips/init.c b/grub-core/kern/mips/qemu_mips/init.c
d9d99f
index be88b77d22d..8b6c55ffc01 100644
d9d99f
--- a/grub-core/kern/mips/qemu_mips/init.c
d9d99f
+++ b/grub-core/kern/mips/qemu_mips/init.c
d9d99f
@@ -75,7 +75,7 @@ grub_machine_fini (int flags __attribute__ ((unused)))
d9d99f
 }
d9d99f
 
d9d99f
 void
d9d99f
-grub_exit (void)
d9d99f
+grub_exit (int rc __attribute__((unused)))
d9d99f
 {
d9d99f
   grub_halt ();
d9d99f
 }
d9d99f
diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c
d9d99f
index 3b633d51f4c..952411d5dc6 100644
d9d99f
--- a/grub-core/kern/misc.c
d9d99f
+++ b/grub-core/kern/misc.c
d9d99f
@@ -1095,7 +1095,7 @@ grub_abort (void)
d9d99f
       grub_getkey ();
d9d99f
     }
d9d99f
 
d9d99f
-  grub_exit ();
d9d99f
+  grub_exit (1);
d9d99f
 }
d9d99f
 
d9d99f
 void
d9d99f
diff --git a/grub-core/kern/uboot/init.c b/grub-core/kern/uboot/init.c
d9d99f
index 3e338645c57..be2a5be1d07 100644
d9d99f
--- a/grub-core/kern/uboot/init.c
d9d99f
+++ b/grub-core/kern/uboot/init.c
d9d99f
@@ -39,9 +39,9 @@ extern grub_size_t grub_total_module_size;
d9d99f
 static unsigned long timer_start;
d9d99f
 
d9d99f
 void
d9d99f
-grub_exit (void)
d9d99f
+grub_exit (int rc)
d9d99f
 {
d9d99f
-  grub_uboot_return (0);
d9d99f
+  grub_uboot_return (rc < 0 ? 1 : rc);
d9d99f
 }
d9d99f
 
d9d99f
 static grub_uint64_t
d9d99f
@@ -78,7 +78,7 @@ grub_machine_init (void)
d9d99f
   if (!ver)
d9d99f
     {
d9d99f
       /* Don't even have a console to log errors to... */
d9d99f
-      grub_exit ();
d9d99f
+      grub_exit (-1);
d9d99f
     }
d9d99f
   else if (ver > API_SIG_VERSION)
d9d99f
     {
d9d99f
diff --git a/grub-core/kern/xen/init.c b/grub-core/kern/xen/init.c
d9d99f
index 0559c033c3d..fce526d417b 100644
d9d99f
--- a/grub-core/kern/xen/init.c
d9d99f
+++ b/grub-core/kern/xen/init.c
d9d99f
@@ -549,7 +549,7 @@ grub_machine_init (void)
d9d99f
 }
d9d99f
 
d9d99f
 void
d9d99f
-grub_exit (void)
d9d99f
+grub_exit (int rc __attribute__((unused)))
d9d99f
 {
d9d99f
   struct sched_shutdown arg;
d9d99f
 
d9d99f
diff --git a/include/grub/misc.h b/include/grub/misc.h
d9d99f
index 372f009e84f..83fd69f4ada 100644
d9d99f
--- a/include/grub/misc.h
d9d99f
+++ b/include/grub/misc.h
d9d99f
@@ -334,7 +334,7 @@ int EXPORT_FUNC(grub_vsnprintf) (char *str, grub_size_t n, const char *fmt,
d9d99f
 char *EXPORT_FUNC(grub_xasprintf) (const char *fmt, ...)
d9d99f
      __attribute__ ((format (GNU_PRINTF, 1, 2))) WARN_UNUSED_RESULT;
d9d99f
 char *EXPORT_FUNC(grub_xvasprintf) (const char *fmt, va_list args) WARN_UNUSED_RESULT;
d9d99f
-void EXPORT_FUNC(grub_exit) (void) __attribute__ ((noreturn));
d9d99f
+void EXPORT_FUNC(grub_exit) (int rc) __attribute__ ((noreturn));
d9d99f
 grub_uint64_t EXPORT_FUNC(grub_divmod64) (grub_uint64_t n,
d9d99f
 					  grub_uint64_t d,
d9d99f
 					  grub_uint64_t *r);