2009-05-02 Robert Millan * 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)