[2176] 2009-05-04 Robert Millan <[email protected]>

Robert Millan <[email protected]>
Newsgroups gmane.comp.boot-loaders.grub.cvs
Message-ID <[email protected]>
Revision: 2176
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2176
Author:   robertmh
Date:     2009-05-04 16:16:03 +0000 (Mon, 04 May 2009)
Log Message:
-----------
2009-05-04  Robert Millan  <[email protected]>

        * 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-install.in: Understand --force and pass it down
        to grub-setup.

        * util/i386/pc/grub-setup.c (main): Understand --force and pass it
        down to setup().
        (setup): Improve error messages and add warnings when requested to
        install in odd layouts.  Refuse to install using blocklists unless
        --force was set.

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/include/grub/util/misc.h
    trunk/grub2/util/i386/pc/grub-install.in
    trunk/grub2/util/i386/pc/grub-setup.c
    trunk/grub2/util/misc.c

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog	2009-05-04 16:15:21 UTC (rev 2175)
+++ trunk/grub2/ChangeLog	2009-05-04 16:16:03 UTC (rev 2176)
@@ -1,3 +1,18 @@
+2009-05-04  Robert Millan  <[email protected]>
+
+	* 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-install.in: Understand --force and pass it down
+	to grub-setup.
+
+	* util/i386/pc/grub-setup.c (main): Understand --force and pass it
+	down to setup().
+	(setup): Improve error messages and add warnings when requested to
+	install in odd layouts.  Refuse to install using blocklists unless
+	--force was set.
+
 2009-05-04  martin f. krafft <[email protected]>
 
 	* disk/raid.c (grub_raid_scan_device): Improve debug message.

Modified: trunk/grub2/include/grub/util/misc.h
===================================================================
--- trunk/grub2/include/grub/util/misc.h	2009-05-04 16:15:21 UTC (rev 2175)
+++ trunk/grub2/include/grub/util/misc.h	2009-05-04 16:16:03 UTC (rev 2176)
@@ -40,6 +40,7 @@
 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));
 

Modified: trunk/grub2/util/i386/pc/grub-install.in
===================================================================
--- trunk/grub2/util/i386/pc/grub-install.in	2009-05-04 16:15:21 UTC (rev 2175)
+++ trunk/grub2/util/i386/pc/grub-install.in	2009-05-04 16:16:03 UTC (rev 2176)
@@ -67,6 +67,7 @@
   --grub-probe=FILE       use FILE as grub-probe
   --no-floppy             do not probe any floppy drive
   --recheck               probe a device map even if it already exists
+  --force                 install even if problems are detected
 
 INSTALL_DEVICE can be a GRUB device name or a system device filename.
 
@@ -106,6 +107,8 @@
     # This is an undocumented feature...
     --debug)
 	debug=yes ;;
+    -f | --force)
+        setup_force="--force" ;;
     -*)
 	echo "Unrecognized option \`$option'" 1>&2
 	usage
@@ -297,7 +300,7 @@
     $grub_mkimage --output=${grubdir}/core.img --prefix=${prefix_drive}${relative_grubdir} $modules || exit 1
 
     # Now perform the installation.
-    $grub_setup ${setup_verbose} --directory=${grubdir} --device-map=${device_map} \
+    $grub_setup ${setup_verbose} ${setup_force} --directory=${grubdir} --device-map=${device_map} \
         ${install_device} || exit 1
 else
     $grub_mkimage -d ${pkglibdir} --output=/boot/multiboot.img --prefix=${prefix_drive}${relative_grubdir} $modules || exit 1

Modified: trunk/grub2/util/i386/pc/grub-setup.c
===================================================================
--- trunk/grub2/util/i386/pc/grub-setup.c	2009-05-04 16:15:21 UTC (rev 2175)
+++ trunk/grub2/util/i386/pc/grub-setup.c	2009-05-04 16:16:03 UTC (rev 2176)
@@ -86,7 +86,7 @@
 static void
 setup (const char *dir,
        const char *boot_file, const char *core_file,
-       const char *root, const char *dest, int must_embed)
+       const char *root, const char *dest, int must_embed, int force)
 {
   char *boot_path, *core_path, *core_path_dev;
   char *boot_img, *core_img;
@@ -109,7 +109,7 @@
   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;
   
   auto void NESTED_FUNC_ATTR save_first_sector (grub_disk_addr_t sector, unsigned offset,
 			       unsigned length);
@@ -304,6 +304,12 @@
   
   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,6 +317,9 @@
     {
       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)
 	{
@@ -349,18 +358,24 @@
 
 	  goto finish;
 	}
-      else
-        able_to_embed = 0;
     }
+
+  /* If we reached this point, it means we were unable to embed.  */
+
+  if (embedding_area_exists)
+    grub_util_warn ("Embedding area is too small for core.img.");
   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"
+    grub_util_warn ("Embedding area is 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.");
   
-  /* The core image must be put on a filesystem unfortunately.  */
-  grub_util_info ("will leave the core image on the filesystem");
+  grub_util_warn ("Embedding is not possible.  GRUB can only be installed in this "
+		  "setup by using blocklists.  However, blocklists are UNRELIABLE and "
+		  "its use is discouraged.");
+  if (! force)
+    grub_util_error ("If you really want blocklists, use --force.");
   
   /* Make sure that GRUB reads the identical image as the OS.  */
   tmp_img = xmalloc (core_size);
@@ -510,6 +525,7 @@
     {"directory", required_argument, 0, 'd'},
     {"device-map", required_argument, 0, 'm'},
     {"root-device", required_argument, 0, 'r'},
+    {"force", no_argument, 0, 'f'},
     {"help", no_argument, 0, 'h'},
     {"version", no_argument, 0, 'V'},
     {"verbose", no_argument, 0, 'v'},
@@ -533,6 +549,7 @@
   -d, --directory=DIR     use GRUB files in the directory DIR [default=%s]\n\
   -m, --device-map=FILE   use FILE as the device map [default=%s]\n\
   -r, --root-device=DEV   use DEV as the root device [default=guessed]\n\
+  -f, --force             install even if problems are detected\n\
   -h, --help              display this message and exit\n\
   -V, --version           print version information and exit\n\
   -v, --verbose           print verbose messages\n\
@@ -566,14 +583,14 @@
   char *dev_map = 0;
   char *root_dev = 0;
   char *dest_dev;
-  int must_embed = 0;
+  int must_embed = 0, force = 0;
   
   progname = "grub-setup";
 
   /* Check for options.  */
   while (1)
     {
-      int c = getopt_long (argc, argv, "b:c:d:m:r:hVv", options, 0);
+      int c = getopt_long (argc, argv, "b:c:d:m:r:hVvf", options, 0);
 
       if (c == -1)
 	break;
@@ -615,6 +632,10 @@
 	    root_dev = xstrdup (optarg);
 	    break;
 	    
+	  case 'f':
+	    force = 1;
+	    break;
+
 	  case 'h':
 	    usage (0);
 	    break;
@@ -716,7 +737,7 @@
 	  setup (dir ? : DEFAULT_DIRECTORY,
 		 boot_file ? : DEFAULT_BOOT_FILE,
 		 core_file ? : DEFAULT_CORE_FILE,
-		 root_dev, grub_util_get_grub_dev (devicelist[i]), 1);
+		 root_dev, grub_util_get_grub_dev (devicelist[i]), 1, force);
 	}
     }
   else
@@ -725,7 +746,7 @@
     setup (dir ? : DEFAULT_DIRECTORY,
 	   boot_file ? : DEFAULT_BOOT_FILE,
 	   core_file ? : DEFAULT_CORE_FILE,
-	   root_dev, dest_dev, must_embed);
+	   root_dev, dest_dev, must_embed, force);
 
   /* Free resources.  */
   grub_fini_all ();

Modified: trunk/grub2/util/misc.c
===================================================================
--- trunk/grub2/util/misc.c	2009-05-04 16:15:21 UTC (rev 2175)
+++ trunk/grub2/util/misc.c	2009-05-04 16:16:03 UTC (rev 2176)
@@ -52,6 +52,19 @@
 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)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.