All of lore.kernel.org
 help / color / mirror / Atom feed
From: Robert Millan <rmh@aybabtu.com>
To: grub-devel@gnu.org
Subject: [PATCH] improve error messages in grub-setup
Date: Sat, 2 May 2009 13:15:47 +0200	[thread overview]
Message-ID: <20090502111547.GA28211@thorin> (raw)

[-- Attachment #1: Type: text/plain, Size: 559 bytes --]


This patch improves error messages in grub-setup, and adds a few
warnings when requested to install in odd layouts.

Since there was no facility to emmit a warning that is always
visible (regardless of verbosity), but doesn't abort execution,
I added one (grub_util_warn ()).  Is everyone fine with using
this interface?

-- 
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."

[-- Attachment #2: embedding_warnings.diff --]
[-- Type: text/x-diff, Size: 3778 bytes --]

2009-05-02  Robert Millan  <rmh.grub@aybabtu.com>

	* util/misc.c (grub_util_warn): New function.  Emmits a warning
	unconditionally.
	* include/grub/util/misc.h (grub_util_warn): New declaration.

	* util/i386/pc/grub-setup.c (setup): Improve error messages and
	add warnings when requested to install in odd layouts.

Index: include/grub/util/misc.h
===================================================================
--- include/grub/util/misc.h	(revision 2154)
+++ include/grub/util/misc.h	(working copy)
@@ -40,6 +40,7 @@ extern char *progname;
 extern int verbosity;
 extern jmp_buf main_env;
 
+void grub_util_warn (const char *fmt, ...);
 void grub_util_info (const char *fmt, ...);
 void grub_util_error (const char *fmt, ...) __attribute__ ((noreturn));
 
Index: util/i386/pc/grub-setup.c
===================================================================
--- util/i386/pc/grub-setup.c	(revision 2154)
+++ util/i386/pc/grub-setup.c	(working copy)
@@ -109,7 +109,7 @@ setup (const char *dir,
   FILE *fp;
   struct { grub_uint64_t start; grub_uint64_t end; } embed_region;
   embed_region.start = embed_region.end = ~0UL;
-  int able_to_embed = 1;
+  int embedding_area_exists = 0, able_to_embed = 0;
   
   auto void NESTED_FUNC_ATTR save_first_sector (grub_disk_addr_t sector, unsigned offset,
 			       unsigned length);
@@ -304,6 +304,12 @@ setup (const char *dir,
   
   grub_util_info ("dos partition is %d, bsd partition is %d",
 		  dos_part, bsd_part);
+
+  if (! dest_dev->disk->has_partitions)
+    grub_util_warn ("Attempting to install GRUB to a partitionless disk.  This is a BAD idea.");
+
+  if (dest_dev->disk->partition)
+    grub_util_warn ("Attempting to install GRUB to a partition instead of the MBR.  This is a BAD idea.");
   
   /* If the destination device can have partitions and it is the MBR,
      try to embed the core image into after the MBR.  */
@@ -311,11 +317,16 @@ setup (const char *dir,
     {
       grub_partition_iterate (dest_dev->disk, find_usable_region);
 
+      if (embed_region.end != 0)
+	embedding_area_exists = 1;
+
       /* If there is enough space...  */
       if ((unsigned long) core_sectors <= embed_region.end - embed_region.start)
 	{
 	  grub_util_info ("will embed the core image at sector 0x%llx", embed_region.start);
 
+	  able_to_embed = 1;
+
 	  *install_dos_part = grub_cpu_to_le32 (dos_part);
 	  *install_bsd_part = grub_cpu_to_le32 (bsd_part);
 
@@ -349,16 +360,20 @@ setup (const char *dir,
 
 	  goto finish;
 	}
+    }
+
+  if (! able_to_embed)
+    {
+      if (embedding_area_exists)
+	grub_util_warn ("Embedding area is too small for core.img.");
       else
-        able_to_embed = 0;
+	grub_util_warn ("Embedding area not present at all!");
+
+      if (must_embed)
+	grub_util_error ("Embedding is not possible, but this is required when "
+			 "the root device is on a RAID array or LVM volume.");
     }
-  else
-    able_to_embed = 0;
 
-  if (must_embed && ! able_to_embed)
-    grub_util_error ("Core image is too big for embedding, but this is required when\n"
-		     "the root device is on a RAID array or LVM volume.");
-  
   /* The core image must be put on a filesystem unfortunately.  */
   grub_util_info ("will leave the core image on the filesystem");
   
Index: util/misc.c
===================================================================
--- util/misc.c	(revision 2154)
+++ util/misc.c	(working copy)
@@ -52,6 +52,19 @@ char *progname = 0;
 int verbosity = 0;
 
 void
+grub_util_warn (const char *fmt, ...)
+{
+  va_list ap;
+  
+  fprintf (stderr, "%s: warn: ", progname);
+  va_start (ap, fmt);
+  vfprintf (stderr, fmt, ap);
+  va_end (ap);
+  fputc ('\n', stderr);
+  fflush (stderr);
+}
+
+void
 grub_util_info (const char *fmt, ...)
 {
   if (verbosity > 0)

             reply	other threads:[~2009-05-02 11:16 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-02 11:15 Robert Millan [this message]
2009-05-03  4:35 ` [PATCH] improve error messages in grub-setup Pavel Roskin
2009-05-03 16:55   ` Robert Millan
2009-05-03 17:04     ` Pavel Roskin
2009-05-03 20:54       ` Robert Millan
2009-05-03 21:02         ` Pavel Roskin
2009-05-04 16:23           ` Robert Millan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090502111547.GA28211@thorin \
    --to=rmh@aybabtu.com \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.