diff --git a/ChangeLog b/ChangeLog index 960fc06..cc225a7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2009-10-16 Vladimir Serbinenko + * util/i386/pc/grub-setup.c (setup): Refuse to overwrite XFS superblock. + (options): New option --destroy-xfs. + (main): Handle --destroy-xfs. + +2009-10-16 Vladimir Serbinenko + Let user specify OpenBSD root device. * loader/i386/bsd.c (openbsd_root): New variable. diff --git a/util/i386/pc/grub-setup.c b/util/i386/pc/grub-setup.c index ccfbd1d..4ef746b 100644 --- a/util/i386/pc/grub-setup.c +++ b/util/i386/pc/grub-setup.c @@ -86,7 +86,8 @@ grub_refresh (void) static void setup (const char *dir, const char *boot_file, const char *core_file, - const char *root, const char *dest, int must_embed, int force) + const char *root, const char *dest, int must_embed, int force, + int destroy_xfs) { char *boot_path, *core_path, *core_path_dev; char *boot_img, *core_img; @@ -251,6 +252,13 @@ setup (const char *dir, if (grub_disk_read (dest_dev->disk, 0, 0, GRUB_DISK_SECTOR_SIZE, tmp_img)) grub_util_error ("%s", grub_errmsg); + if (memcmp (tmp_img, "XFSB", 4) == 0) + { + grub_util_warn ("This install would require destroying XFS."); + if (! destroy_xfs) + grub_util_error ("If you really want to destroy it use --destroy-xfs."); + } + /* Copy the possible DOS BPB. */ memcpy (boot_img + GRUB_BOOT_MACHINE_BPB_START, tmp_img + GRUB_BOOT_MACHINE_BPB_START, @@ -556,6 +564,7 @@ static struct option options[] = {"device-map", required_argument, 0, 'm'}, {"root-device", required_argument, 0, 'r'}, {"force", no_argument, 0, 'f'}, + {"destroy-xfs", no_argument, 0, 'X'}, {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'V'}, {"verbose", no_argument, 0, 'v'}, @@ -580,6 +589,7 @@ DEVICE must be a GRUB device (e.g. ``(hd0,1)'').\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\ + --destroy-xfs install even destroying XFS superblock\n\ -h, --help display this message and exit\n\ -V, --version print version information and exit\n\ -v, --verbose print verbose messages\n\ @@ -614,6 +624,7 @@ main (int argc, char *argv[]) char *root_dev = 0; char *dest_dev; int must_embed = 0, force = 0; + int destroy_xfs = 0; progname = "grub-setup"; @@ -666,6 +677,10 @@ main (int argc, char *argv[]) force = 1; break; + case 'X': + destroy_xfs = 1; + break; + case 'h': usage (0); break; @@ -767,7 +782,8 @@ main (int argc, char *argv[]) setup (dir ? : DEFAULT_DIRECTORY, boot_file ? : DEFAULT_BOOT_FILE, core_file ? : DEFAULT_CORE_FILE, - root_dev, grub_util_get_grub_dev (devicelist[i]), 1, force); + root_dev, grub_util_get_grub_dev (devicelist[i]), 1, force, + destroy_xfs); } } else @@ -776,7 +792,7 @@ main (int argc, char *argv[]) setup (dir ? : DEFAULT_DIRECTORY, boot_file ? : DEFAULT_BOOT_FILE, core_file ? : DEFAULT_CORE_FILE, - root_dev, dest_dev, must_embed, force); + root_dev, dest_dev, must_embed, force, destroy_xfs); /* Free resources. */ grub_fini_all ();