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

8e15ce
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
8e15ce
From: Peter Jones <pjones@redhat.com>
8e15ce
Date: Wed, 26 Feb 2014 21:49:12 -0500
8e15ce
Subject: [PATCH] Make "exit" take a return code.
8e15ce
8e15ce
This adds "exit" with a return code.  With this patch, any "exit"
8e15ce
command /may/ include a return code, and on platforms that support
8e15ce
returning with an exit status, we will do so.  By default we return the
8e15ce
same exit status we did before this patch.
8e15ce
8e15ce
Signed-off-by: Peter Jones <pjones@redhat.com>
8e15ce
---
8e15ce
 grub-core/commands/minicmd.c         | 20 ++++++++++++++++----
8e15ce
 grub-core/kern/efi/efi.c             |  9 +++++++--
8e15ce
 grub-core/kern/emu/main.c            |  2 +-
8e15ce
 grub-core/kern/emu/misc.c            |  5 +++--
8e15ce
 grub-core/kern/i386/coreboot/init.c  |  2 +-
8e15ce
 grub-core/kern/i386/qemu/init.c      |  2 +-
8e15ce
 grub-core/kern/ieee1275/init.c       |  2 +-
8e15ce
 grub-core/kern/mips/arc/init.c       |  2 +-
8e15ce
 grub-core/kern/mips/loongson/init.c  |  2 +-
8e15ce
 grub-core/kern/mips/qemu_mips/init.c |  2 +-
8e15ce
 grub-core/kern/misc.c                | 11 ++++++++++-
8e15ce
 grub-core/kern/uboot/init.c          |  6 +++---
8e15ce
 grub-core/kern/xen/init.c            |  2 +-
8e15ce
 include/grub/misc.h                  |  2 +-
8e15ce
 14 files changed, 48 insertions(+), 21 deletions(-)
8e15ce
8e15ce
diff --git a/grub-core/commands/minicmd.c b/grub-core/commands/minicmd.c
8e15ce
index fa498931ed2..2bd3ac76f2d 100644
8e15ce
--- a/grub-core/commands/minicmd.c
8e15ce
+++ b/grub-core/commands/minicmd.c
8e15ce
@@ -182,12 +182,24 @@ grub_mini_cmd_lsmod (struct grub_command *cmd __attribute__ ((unused)),
8e15ce
 }
8e15ce
 
8e15ce
 /* exit */
8e15ce
-static grub_err_t __attribute__ ((noreturn))
8e15ce
+static grub_err_t
8e15ce
 grub_mini_cmd_exit (struct grub_command *cmd __attribute__ ((unused)),
8e15ce
-		    int argc __attribute__ ((unused)),
8e15ce
-		    char *argv[] __attribute__ ((unused)))
8e15ce
+		    int argc, char *argv[])
8e15ce
 {
8e15ce
-  grub_exit ();
8e15ce
+  int retval = -1;
8e15ce
+  unsigned long n;
8e15ce
+
8e15ce
+  if (argc < 0 || argc > 1)
8e15ce
+    return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
8e15ce
+
8e15ce
+  if (argc == 1)
8e15ce
+    {
8e15ce
+      n = grub_strtoul (argv[0], 0, 10);
8e15ce
+      if (n != ~0UL)
8e15ce
+	retval = n;
8e15ce
+    }
8e15ce
+
8e15ce
+  grub_exit (retval);
8e15ce
   /* Not reached.  */
8e15ce
 }
8e15ce
 
8e15ce
diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c
8e15ce
index 8cff7be0289..05d8237a9b2 100644
8e15ce
--- a/grub-core/kern/efi/efi.c
8e15ce
+++ b/grub-core/kern/efi/efi.c
8e15ce
@@ -165,11 +165,16 @@ grub_reboot (void)
8e15ce
 }
8e15ce
 
8e15ce
 void
8e15ce
-grub_exit (void)
8e15ce
+grub_exit (int retval)
8e15ce
 {
8e15ce
+  int rc = GRUB_EFI_LOAD_ERROR;
8e15ce
+
8e15ce
+  if (retval == 0)
8e15ce
+    rc = GRUB_EFI_SUCCESS;
8e15ce
+
8e15ce
   grub_machine_fini (GRUB_LOADER_FLAG_NORETURN);
8e15ce
   efi_call_4 (grub_efi_system_table->boot_services->exit,
8e15ce
-              grub_efi_image_handle, GRUB_EFI_SUCCESS, 0, 0);
8e15ce
+              grub_efi_image_handle, rc, 0, 0);
8e15ce
   for (;;) ;
8e15ce
 }
8e15ce
 
8e15ce
diff --git a/grub-core/kern/emu/main.c b/grub-core/kern/emu/main.c
8e15ce
index 425bb960347..55ea5a11ccd 100644
8e15ce
--- a/grub-core/kern/emu/main.c
8e15ce
+++ b/grub-core/kern/emu/main.c
8e15ce
@@ -67,7 +67,7 @@ grub_reboot (void)
8e15ce
 }
8e15ce
 
8e15ce
 void
8e15ce
-grub_exit (void)
8e15ce
+grub_exit (int retval __attribute__((unused)))
8e15ce
 {
8e15ce
   grub_reboot ();
8e15ce
 }
8e15ce
diff --git a/grub-core/kern/emu/misc.c b/grub-core/kern/emu/misc.c
8e15ce
index dfd8a8ec488..0ff13bcaf8c 100644
8e15ce
--- a/grub-core/kern/emu/misc.c
8e15ce
+++ b/grub-core/kern/emu/misc.c
8e15ce
@@ -151,9 +151,10 @@ xasprintf (const char *fmt, ...)
8e15ce
 
8e15ce
 #if !defined (GRUB_MACHINE_EMU) || defined (GRUB_UTIL)
8e15ce
 void
8e15ce
-grub_exit (void)
8e15ce
+__attribute__ ((noreturn))
8e15ce
+grub_exit (int rc)
8e15ce
 {
8e15ce
-  exit (1);
8e15ce
+  exit (rc < 0 ? 1 : rc);
8e15ce
 }
8e15ce
 #endif
8e15ce
 
8e15ce
diff --git a/grub-core/kern/i386/coreboot/init.c b/grub-core/kern/i386/coreboot/init.c
8e15ce
index 3314f027fec..36f9134b7b7 100644
8e15ce
--- a/grub-core/kern/i386/coreboot/init.c
8e15ce
+++ b/grub-core/kern/i386/coreboot/init.c
8e15ce
@@ -41,7 +41,7 @@ extern grub_uint8_t _end[];
8e15ce
 extern grub_uint8_t _edata[];
8e15ce
 
8e15ce
 void  __attribute__ ((noreturn))
8e15ce
-grub_exit (void)
8e15ce
+grub_exit (int rc __attribute__((unused)))
8e15ce
 {
8e15ce
   /* We can't use grub_fatal() in this function.  This would create an infinite
8e15ce
      loop, since grub_fatal() calls grub_abort() which in turn calls grub_exit().  */
8e15ce
diff --git a/grub-core/kern/i386/qemu/init.c b/grub-core/kern/i386/qemu/init.c
8e15ce
index 271b6fbfabd..9fafe98f015 100644
8e15ce
--- a/grub-core/kern/i386/qemu/init.c
8e15ce
+++ b/grub-core/kern/i386/qemu/init.c
8e15ce
@@ -42,7 +42,7 @@ extern grub_uint8_t _end[];
8e15ce
 extern grub_uint8_t _edata[];
8e15ce
 
8e15ce
 void  __attribute__ ((noreturn))
8e15ce
-grub_exit (void)
8e15ce
+grub_exit (int rc __attribute__((unused)))
8e15ce
 {
8e15ce
   /* We can't use grub_fatal() in this function.  This would create an infinite
8e15ce
      loop, since grub_fatal() calls grub_abort() which in turn calls grub_exit().  */
8e15ce
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
8e15ce
index d483e35eed2..e71d1584164 100644
8e15ce
--- a/grub-core/kern/ieee1275/init.c
8e15ce
+++ b/grub-core/kern/ieee1275/init.c
8e15ce
@@ -71,7 +71,7 @@ grub_addr_t grub_ieee1275_original_stack;
8e15ce
 #endif
8e15ce
 
8e15ce
 void
8e15ce
-grub_exit (void)
8e15ce
+grub_exit (int rc __attribute__((unused)))
8e15ce
 {
8e15ce
   grub_ieee1275_exit ();
8e15ce
 }
8e15ce
diff --git a/grub-core/kern/mips/arc/init.c b/grub-core/kern/mips/arc/init.c
8e15ce
index 2ed3ff3191e..5c40c34078d 100644
8e15ce
--- a/grub-core/kern/mips/arc/init.c
8e15ce
+++ b/grub-core/kern/mips/arc/init.c
8e15ce
@@ -276,7 +276,7 @@ grub_halt (void)
8e15ce
 }
8e15ce
 
8e15ce
 void
8e15ce
-grub_exit (void)
8e15ce
+grub_exit (int rc __attribute__((unused)))
8e15ce
 {
8e15ce
   GRUB_ARC_FIRMWARE_VECTOR->exit ();
8e15ce
 
8e15ce
diff --git a/grub-core/kern/mips/loongson/init.c b/grub-core/kern/mips/loongson/init.c
8e15ce
index 7b96531b983..dff598ca7b0 100644
8e15ce
--- a/grub-core/kern/mips/loongson/init.c
8e15ce
+++ b/grub-core/kern/mips/loongson/init.c
8e15ce
@@ -304,7 +304,7 @@ grub_halt (void)
8e15ce
 }
8e15ce
 
8e15ce
 void
8e15ce
-grub_exit (void)
8e15ce
+grub_exit (int rc __attribute__((unused)))
8e15ce
 {
8e15ce
   grub_halt ();
8e15ce
 }
8e15ce
diff --git a/grub-core/kern/mips/qemu_mips/init.c b/grub-core/kern/mips/qemu_mips/init.c
8e15ce
index be88b77d22d..8b6c55ffc01 100644
8e15ce
--- a/grub-core/kern/mips/qemu_mips/init.c
8e15ce
+++ b/grub-core/kern/mips/qemu_mips/init.c
8e15ce
@@ -75,7 +75,7 @@ grub_machine_fini (int flags __attribute__ ((unused)))
8e15ce
 }
8e15ce
 
8e15ce
 void
8e15ce
-grub_exit (void)
8e15ce
+grub_exit (int rc __attribute__((unused)))
8e15ce
 {
8e15ce
   grub_halt ();
8e15ce
 }
8e15ce
diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c
8e15ce
index 3af336ee227..63b586d09cb 100644
8e15ce
--- a/grub-core/kern/misc.c
8e15ce
+++ b/grub-core/kern/misc.c
8e15ce
@@ -1209,9 +1209,18 @@ grub_abort (void)
8e15ce
       grub_getkey ();
8e15ce
     }
8e15ce
 
8e15ce
-  grub_exit ();
8e15ce
+  grub_exit (1);
8e15ce
 }
8e15ce
 
8e15ce
+#if defined (__clang__) && !defined (GRUB_UTIL)
8e15ce
+/* clang emits references to abort().  */
8e15ce
+void __attribute__ ((noreturn))
8e15ce
+abort (void)
8e15ce
+{
8e15ce
+  grub_abort ();
8e15ce
+}
8e15ce
+#endif
8e15ce
+
8e15ce
 void
8e15ce
 grub_fatal (const char *fmt, ...)
8e15ce
 {
8e15ce
diff --git a/grub-core/kern/uboot/init.c b/grub-core/kern/uboot/init.c
8e15ce
index 3e338645c57..be2a5be1d07 100644
8e15ce
--- a/grub-core/kern/uboot/init.c
8e15ce
+++ b/grub-core/kern/uboot/init.c
8e15ce
@@ -39,9 +39,9 @@ extern grub_size_t grub_total_module_size;
8e15ce
 static unsigned long timer_start;
8e15ce
 
8e15ce
 void
8e15ce
-grub_exit (void)
8e15ce
+grub_exit (int rc)
8e15ce
 {
8e15ce
-  grub_uboot_return (0);
8e15ce
+  grub_uboot_return (rc < 0 ? 1 : rc);
8e15ce
 }
8e15ce
 
8e15ce
 static grub_uint64_t
8e15ce
@@ -78,7 +78,7 @@ grub_machine_init (void)
8e15ce
   if (!ver)
8e15ce
     {
8e15ce
       /* Don't even have a console to log errors to... */
8e15ce
-      grub_exit ();
8e15ce
+      grub_exit (-1);
8e15ce
     }
8e15ce
   else if (ver > API_SIG_VERSION)
8e15ce
     {
8e15ce
diff --git a/grub-core/kern/xen/init.c b/grub-core/kern/xen/init.c
8e15ce
index 782ca72952a..708b060f324 100644
8e15ce
--- a/grub-core/kern/xen/init.c
8e15ce
+++ b/grub-core/kern/xen/init.c
8e15ce
@@ -584,7 +584,7 @@ grub_machine_init (void)
8e15ce
 }
8e15ce
 
8e15ce
 void
8e15ce
-grub_exit (void)
8e15ce
+grub_exit (int rc __attribute__((unused)))
8e15ce
 {
8e15ce
   struct sched_shutdown arg;
8e15ce
 
8e15ce
diff --git a/include/grub/misc.h b/include/grub/misc.h
8e15ce
index 7d2b5519690..fd18e6320b8 100644
8e15ce
--- a/include/grub/misc.h
8e15ce
+++ b/include/grub/misc.h
8e15ce
@@ -353,7 +353,7 @@ int EXPORT_FUNC(grub_vsnprintf) (char *str, grub_size_t n, const char *fmt,
8e15ce
 char *EXPORT_FUNC(grub_xasprintf) (const char *fmt, ...)
8e15ce
      __attribute__ ((format (GNU_PRINTF, 1, 2))) WARN_UNUSED_RESULT;
8e15ce
 char *EXPORT_FUNC(grub_xvasprintf) (const char *fmt, va_list args) WARN_UNUSED_RESULT;
8e15ce
-void EXPORT_FUNC(grub_exit) (void) __attribute__ ((noreturn));
8e15ce
+void EXPORT_FUNC(grub_exit) (int rc) __attribute__ ((noreturn));
8e15ce
 grub_uint64_t EXPORT_FUNC(grub_divmod64) (grub_uint64_t n,
8e15ce
 					  grub_uint64_t d,
8e15ce
 					  grub_uint64_t *r);