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."
2009-05-02  Robert Millan  <rmh.g...@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)
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to