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."); - - /* 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) { + grub_util_warn ("Attempting to install GRUB to a partition instead of the MBR. This is a BAD idea."); + goto unable_to_embed; + } + /* 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 "