From: robertmh Date: Wed, 13 May 2009 20:59:45 +0000 (+0000) Subject: 2009-05-13 Robert Millan X-Git-Tag: 1.98~916 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=15fbf4c4421f025b56abe6d32ac25b39fece20bd;p=thirdparty%2Fgrub.git 2009-05-13 Robert Millan * util/i386/pc/grub-setup.c (setup): Restructure code flow to make it easier to understand / work with. --- diff --git a/ChangeLog b/ChangeLog index 74b1d3a32..412d55043 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2009-05-13 Robert Millan + + * util/i386/pc/grub-setup.c (setup): Restructure code flow to make + it easier to understand / work with. + 2009-05-13 Pavel Roskin * loader/i386/pc/multiboot2.c: Add necessary includes for diff --git a/util/i386/pc/grub-setup.c b/util/i386/pc/grub-setup.c index f0f79f419..3b23446f8 100644 --- a/util/i386/pc/grub-setup.c +++ b/util/i386/pc/grub-setup.c @@ -310,17 +310,19 @@ setup (const char *dir, 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."); + goto unable_to_embed; + } if (dest_dev->disk->partition) + { grub_util_warn ("Attempting to install GRUB to a partition instead of the MBR. This is a BAD idea."); + goto unable_to_embed; + } - /* If the destination device can have partitions and it is the MBR, - try to embed the core image into after the MBR. */ - if (dest_dev->disk->has_partitions && ! dest_dev->disk->partition) - { /* Unlike root_dev, with dest_dev we're interested in the partition map even - if dest_dev itself is a whole disk. */ + if dest_dev itself is a whole disk. */ auto int NESTED_FUNC_ATTR identify_partmap (grub_disk_t disk, const grub_partition_t p); int NESTED_FUNC_ATTR identify_partmap (grub_disk_t disk __attribute__ ((unused)), @@ -330,16 +332,22 @@ setup (const char *dir, return 1; } grub_partition_iterate (dest_dev->disk, identify_partmap); - + grub_partition_iterate (dest_dev->disk, (strcmp (dest_partmap, "pc_partition_map") ? find_usable_region_gpt : find_usable_region_msdos)); - - if (embed_region.end != embed_region.start) - embedding_area_exists = 1; - - /* If there is enough space... */ - if ((unsigned long) core_sectors <= embed_region.end - embed_region.start) - { + if (embed_region.end == embed_region.start) + { + grub_util_warn ("Embedding area is not present at all!"); + goto unable_to_embed; + } + + if ((unsigned long) core_sectors > embed_region.end - embed_region.start) + { + grub_util_warn ("Embedding area is too small for core.img."); + goto unable_to_embed; + } + + grub_util_info ("will embed the core image at sector 0x%llx", embed_region.start); *install_dos_part = grub_cpu_to_le32 (dos_part); @@ -374,15 +382,8 @@ setup (const char *dir, grub_util_error ("%s", grub_errmsg); goto finish; - } - } - /* 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 - grub_util_warn ("Embedding area is not present at all!"); +unable_to_embed: if (must_embed) grub_util_error ("Embedding is not possible, but this is required when "