281 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			281 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | |
| From: Peter Jones <pjones@redhat.com>
 | |
| Date: Wed, 26 Feb 2014 21:49:12 -0500
 | |
| Subject: [PATCH] Make "exit" take a return code.
 | |
| 
 | |
| This adds "exit" with a return code.  With this patch, any "exit"
 | |
| command /may/ include a return code, and on platforms that support
 | |
| returning with an exit status, we will do so.  By default we return the
 | |
| same exit status we did before this patch.
 | |
| 
 | |
| Signed-off-by: Peter Jones <pjones@redhat.com>
 | |
| ---
 | |
|  grub-core/commands/minicmd.c         | 20 ++++++++++++++++----
 | |
|  grub-core/kern/efi/efi.c             |  9 +++++++--
 | |
|  grub-core/kern/emu/main.c            |  2 +-
 | |
|  grub-core/kern/emu/misc.c            |  9 +++++----
 | |
|  grub-core/kern/i386/coreboot/init.c  |  2 +-
 | |
|  grub-core/kern/i386/qemu/init.c      |  2 +-
 | |
|  grub-core/kern/ieee1275/init.c       |  2 +-
 | |
|  grub-core/kern/mips/arc/init.c       |  2 +-
 | |
|  grub-core/kern/mips/loongson/init.c  |  2 +-
 | |
|  grub-core/kern/mips/qemu_mips/init.c |  2 +-
 | |
|  grub-core/kern/misc.c                | 11 ++++++++++-
 | |
|  grub-core/kern/uboot/init.c          |  6 +++---
 | |
|  grub-core/kern/xen/init.c            |  2 +-
 | |
|  include/grub/misc.h                  |  2 +-
 | |
|  14 files changed, 50 insertions(+), 23 deletions(-)
 | |
| 
 | |
| diff --git a/grub-core/commands/minicmd.c b/grub-core/commands/minicmd.c
 | |
| index fa498931ed2..2bd3ac76f2d 100644
 | |
| --- a/grub-core/commands/minicmd.c
 | |
| +++ b/grub-core/commands/minicmd.c
 | |
| @@ -182,12 +182,24 @@ grub_mini_cmd_lsmod (struct grub_command *cmd __attribute__ ((unused)),
 | |
|  }
 | |
|  
 | |
|  /* exit */
 | |
| -static grub_err_t __attribute__ ((noreturn))
 | |
| +static grub_err_t
 | |
|  grub_mini_cmd_exit (struct grub_command *cmd __attribute__ ((unused)),
 | |
| -		    int argc __attribute__ ((unused)),
 | |
| -		    char *argv[] __attribute__ ((unused)))
 | |
| +		    int argc, char *argv[])
 | |
|  {
 | |
| -  grub_exit ();
 | |
| +  int retval = -1;
 | |
| +  unsigned long n;
 | |
| +
 | |
| +  if (argc < 0 || argc > 1)
 | |
| +    return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
 | |
| +
 | |
| +  if (argc == 1)
 | |
| +    {
 | |
| +      n = grub_strtoul (argv[0], 0, 10);
 | |
| +      if (n != ~0UL)
 | |
| +	retval = n;
 | |
| +    }
 | |
| +
 | |
| +  grub_exit (retval);
 | |
|    /* Not reached.  */
 | |
|  }
 | |
|  
 | |
| diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c
 | |
| index b93ae3aba12..885d7c6420e 100644
 | |
| --- a/grub-core/kern/efi/efi.c
 | |
| +++ b/grub-core/kern/efi/efi.c
 | |
| @@ -175,11 +175,16 @@ grub_reboot (void)
 | |
|  }
 | |
|  
 | |
|  void
 | |
| -grub_exit (void)
 | |
| +grub_exit (int retval)
 | |
|  {
 | |
| +  int rc = GRUB_EFI_LOAD_ERROR;
 | |
| +
 | |
| +  if (retval == 0)
 | |
| +    rc = GRUB_EFI_SUCCESS;
 | |
| +
 | |
|    grub_machine_fini (GRUB_LOADER_FLAG_NORETURN);
 | |
|    grub_efi_system_table->boot_services->exit (grub_efi_image_handle,
 | |
| -					      GRUB_EFI_SUCCESS, 0, 0);
 | |
| +					      rc, 0, 0);
 | |
|    for (;;) ;
 | |
|  }
 | |
|  
 | |
| diff --git a/grub-core/kern/emu/main.c b/grub-core/kern/emu/main.c
 | |
| index 855b11c3dec..38c1576a2ef 100644
 | |
| --- a/grub-core/kern/emu/main.c
 | |
| +++ b/grub-core/kern/emu/main.c
 | |
| @@ -67,7 +67,7 @@ grub_reboot (void)
 | |
|  }
 | |
|  
 | |
|  void
 | |
| -grub_exit (void)
 | |
| +grub_exit (int retval __attribute__((unused)))
 | |
|  {
 | |
|    grub_reboot ();
 | |
|  }
 | |
| diff --git a/grub-core/kern/emu/misc.c b/grub-core/kern/emu/misc.c
 | |
| index 521220b49d2..16c79bc9488 100644
 | |
| --- a/grub-core/kern/emu/misc.c
 | |
| +++ b/grub-core/kern/emu/misc.c
 | |
| @@ -83,7 +83,7 @@ grub_util_error (const char *fmt, ...)
 | |
|    vfprintf (stderr, fmt, ap);
 | |
|    va_end (ap);
 | |
|    fprintf (stderr, ".\n");
 | |
| -  grub_exit ();
 | |
| +  grub_exit (1);
 | |
|  }
 | |
|  
 | |
|  void *
 | |
| @@ -152,12 +152,13 @@ xasprintf (const char *fmt, ...)
 | |
|  
 | |
|  #if !defined (GRUB_MACHINE_EMU) || defined (GRUB_UTIL)
 | |
|  void
 | |
| -grub_exit (void)
 | |
| +__attribute__ ((noreturn))
 | |
| +grub_exit (int rc)
 | |
|  {
 | |
| -#if defined (GRUB_KERNEL)
 | |
| +#if defined (GRUB_KERNEL) && !defined (GRUB_MACHINE_EFI)
 | |
|    grub_reboot ();
 | |
|  #endif
 | |
| -  exit (1);
 | |
| +  exit (rc < 0 ? 1 : rc);
 | |
|  }
 | |
|  #endif
 | |
|  
 | |
| diff --git a/grub-core/kern/i386/coreboot/init.c b/grub-core/kern/i386/coreboot/init.c
 | |
| index 4fae8b571f1..feaf9295e30 100644
 | |
| --- a/grub-core/kern/i386/coreboot/init.c
 | |
| +++ b/grub-core/kern/i386/coreboot/init.c
 | |
| @@ -41,7 +41,7 @@ extern grub_uint8_t _end[];
 | |
|  extern grub_uint8_t _edata[];
 | |
|  
 | |
|  void  __attribute__ ((noreturn))
 | |
| -grub_exit (void)
 | |
| +grub_exit (int rc __attribute__((unused)))
 | |
|  {
 | |
|    /* We can't use grub_fatal() in this function.  This would create an infinite
 | |
|       loop, since grub_fatal() calls grub_abort() which in turn calls grub_exit().  */
 | |
| diff --git a/grub-core/kern/i386/qemu/init.c b/grub-core/kern/i386/qemu/init.c
 | |
| index 08f81d25e68..604fc94b5a0 100644
 | |
| --- a/grub-core/kern/i386/qemu/init.c
 | |
| +++ b/grub-core/kern/i386/qemu/init.c
 | |
| @@ -42,7 +42,7 @@ extern grub_uint8_t _end[];
 | |
|  extern grub_uint8_t _edata[];
 | |
|  
 | |
|  void  __attribute__ ((noreturn))
 | |
| -grub_exit (void)
 | |
| +grub_exit (int rc __attribute__((unused)))
 | |
|  {
 | |
|    /* We can't use grub_fatal() in this function.  This would create an infinite
 | |
|       loop, since grub_fatal() calls grub_abort() which in turn calls grub_exit().  */
 | |
| diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
 | |
| index fb7d1a3bacf..50c65b2f6e5 100644
 | |
| --- a/grub-core/kern/ieee1275/init.c
 | |
| +++ b/grub-core/kern/ieee1275/init.c
 | |
| @@ -114,7 +114,7 @@ grub_addr_t grub_ieee1275_original_stack;
 | |
|  #define BYTE22              (DY_MEM_V2 | DRC_INFO)
 | |
|  
 | |
|  void
 | |
| -grub_exit (void)
 | |
| +grub_exit (int rc __attribute__((unused)))
 | |
|  {
 | |
|    grub_ieee1275_exit ();
 | |
|  }
 | |
| diff --git a/grub-core/kern/mips/arc/init.c b/grub-core/kern/mips/arc/init.c
 | |
| index 2ed3ff3191e..5c40c34078d 100644
 | |
| --- a/grub-core/kern/mips/arc/init.c
 | |
| +++ b/grub-core/kern/mips/arc/init.c
 | |
| @@ -276,7 +276,7 @@ grub_halt (void)
 | |
|  }
 | |
|  
 | |
|  void
 | |
| -grub_exit (void)
 | |
| +grub_exit (int rc __attribute__((unused)))
 | |
|  {
 | |
|    GRUB_ARC_FIRMWARE_VECTOR->exit ();
 | |
|  
 | |
| diff --git a/grub-core/kern/mips/loongson/init.c b/grub-core/kern/mips/loongson/init.c
 | |
| index 5bd721260f6..97b09b0eeea 100644
 | |
| --- a/grub-core/kern/mips/loongson/init.c
 | |
| +++ b/grub-core/kern/mips/loongson/init.c
 | |
| @@ -304,7 +304,7 @@ grub_halt (void)
 | |
|  }
 | |
|  
 | |
|  void
 | |
| -grub_exit (void)
 | |
| +grub_exit (int rc __attribute__((unused)))
 | |
|  {
 | |
|    grub_halt ();
 | |
|  }
 | |
| diff --git a/grub-core/kern/mips/qemu_mips/init.c b/grub-core/kern/mips/qemu_mips/init.c
 | |
| index b5477b87ffa..69488a34e7c 100644
 | |
| --- a/grub-core/kern/mips/qemu_mips/init.c
 | |
| +++ b/grub-core/kern/mips/qemu_mips/init.c
 | |
| @@ -75,7 +75,7 @@ grub_machine_fini (int flags __attribute__ ((unused)))
 | |
|  }
 | |
|  
 | |
|  void
 | |
| -grub_exit (void)
 | |
| +grub_exit (int rc __attribute__((unused)))
 | |
|  {
 | |
|    grub_halt ();
 | |
|  }
 | |
| diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c
 | |
| index 7cee5d75c3c..11037dc0227 100644
 | |
| --- a/grub-core/kern/misc.c
 | |
| +++ b/grub-core/kern/misc.c
 | |
| @@ -1311,9 +1311,18 @@ grub_abort (void)
 | |
|        grub_getkey ();
 | |
|      }
 | |
|  
 | |
| -  grub_exit ();
 | |
| +  grub_exit (1);
 | |
|  }
 | |
|  
 | |
| +#if defined (__clang__) && !defined (GRUB_UTIL)
 | |
| +/* clang emits references to abort().  */
 | |
| +void __attribute__ ((noreturn))
 | |
| +abort (void)
 | |
| +{
 | |
| +  grub_abort ();
 | |
| +}
 | |
| +#endif
 | |
| +
 | |
|  void
 | |
|  grub_fatal (const char *fmt, ...)
 | |
|  {
 | |
| diff --git a/grub-core/kern/uboot/init.c b/grub-core/kern/uboot/init.c
 | |
| index 3e338645c57..be2a5be1d07 100644
 | |
| --- a/grub-core/kern/uboot/init.c
 | |
| +++ b/grub-core/kern/uboot/init.c
 | |
| @@ -39,9 +39,9 @@ extern grub_size_t grub_total_module_size;
 | |
|  static unsigned long timer_start;
 | |
|  
 | |
|  void
 | |
| -grub_exit (void)
 | |
| +grub_exit (int rc)
 | |
|  {
 | |
| -  grub_uboot_return (0);
 | |
| +  grub_uboot_return (rc < 0 ? 1 : rc);
 | |
|  }
 | |
|  
 | |
|  static grub_uint64_t
 | |
| @@ -78,7 +78,7 @@ grub_machine_init (void)
 | |
|    if (!ver)
 | |
|      {
 | |
|        /* Don't even have a console to log errors to... */
 | |
| -      grub_exit ();
 | |
| +      grub_exit (-1);
 | |
|      }
 | |
|    else if (ver > API_SIG_VERSION)
 | |
|      {
 | |
| diff --git a/grub-core/kern/xen/init.c b/grub-core/kern/xen/init.c
 | |
| index 782ca72952a..708b060f324 100644
 | |
| --- a/grub-core/kern/xen/init.c
 | |
| +++ b/grub-core/kern/xen/init.c
 | |
| @@ -584,7 +584,7 @@ grub_machine_init (void)
 | |
|  }
 | |
|  
 | |
|  void
 | |
| -grub_exit (void)
 | |
| +grub_exit (int rc __attribute__((unused)))
 | |
|  {
 | |
|    struct sched_shutdown arg;
 | |
|  
 | |
| diff --git a/include/grub/misc.h b/include/grub/misc.h
 | |
| index 1b35a167fde..72aff15750d 100644
 | |
| --- a/include/grub/misc.h
 | |
| +++ b/include/grub/misc.h
 | |
| @@ -385,7 +385,7 @@ char *EXPORT_FUNC(grub_xasprintf) (const char *fmt, ...)
 | |
|       __attribute__ ((format (GNU_PRINTF, 1, 2))) WARN_UNUSED_RESULT;
 | |
|  char *EXPORT_FUNC(grub_xvasprintf) (const char *fmt, va_list args) WARN_UNUSED_RESULT;
 | |
|  
 | |
| -void EXPORT_FUNC(grub_exit) (void) __attribute__ ((noreturn));
 | |
| +void EXPORT_FUNC(grub_exit) (int rc) __attribute__ ((noreturn));
 | |
|  void EXPORT_FUNC(grub_abort) (void) __attribute__ ((noreturn));
 | |
|  grub_uint64_t EXPORT_FUNC(grub_divmod64) (grub_uint64_t n,
 | |
|  					  grub_uint64_t d,
 |