Something like this (completely untested) patch ought to do roughly the right thing. diff --git a/grub-core/commands/blscfg.c b/grub-core/commands/blscfg.c index 4274aca..c9c8fc0 100644 --- a/grub-core/commands/blscfg.c +++ b/grub-core/commands/blscfg.c @@ -54,8 +54,9 @@ static int parse_entry ( char *p; grub_file_t f = NULL; grub_off_t sz; - char *title = NULL, *options = NULL, *clinux = NULL, *initrd = NULL, *src = NULL; + char *title = NULL, *options = NULL, *clinux = NULL, *initrd = NULL, *src = NULL, *target = NULL; const char *args[2] = { NULL, NULL }; + int drive = -1, partition; if (filename[0] == '.') return 0; @@ -113,25 +114,51 @@ static int parse_entry ( if (!initrd) goto finish; } + else if (grub_strncmp (buf, "chainload-disk ", 15) == 0) + { + drive = (int) grub_strtoul (buf + 15, 0, 10); + if (grub_errno != GRUB_ERR_NONE) + goto fail; + } + else if (grub_strncmp (buf, "chainload-partition ", 20) == 0) + { + partition = (int) grub_strtoul (buf + 20, 0, 10); + if (grub_errno != GRUB_ERR_NONE) + goto fail; + } grub_free(buf); } - if (!linux) + if (!linux && drive < 0) { - grub_printf ("Skipping file %s with no 'linux' key.", p); + grub_printf ("Skipping file %s with no 'linux' or 'chainload-disk' key.", + p); goto finish; } args[0] = title ? title : filename; - src = grub_xasprintf ("load_video\n" - "set gfx_payload=keep\n" - "insmod gzio\n" - GRUB_LINUX_CMD " %s%s%s%s\n" - "%s%s%s%s", - GRUB_BOOT_DEVICE, clinux, options ? " " : "", options ? options : "", - initrd ? GRUB_INITRD_CMD " " : "", initrd ? GRUB_BOOT_DEVICE : "", initrd ? initrd : "", initrd ? "\n" : ""); + if (drive) { + if (partition) { + target = grub_xasprintf("chainloader (hd%d,%d)+1", drive, partition); + } else { + target = grub_xasprintf("chainloader (hd%d)+1", drive); + } + src = grub_xasprintf ("insmod part_msdos\n" + "insmod chain\n" + "%s\n", + target + ); + } else { + src = grub_xasprintf ("load_video\n" + "set gfx_payload=keep\n" + "insmod gzio\n" + GRUB_LINUX_CMD " %s%s%s%s\n" + "%s%s%s%s", + GRUB_BOOT_DEVICE, clinux, options ? " " : "", options ? options : "", + initrd ? GRUB_INITRD_CMD " " : "", initrd ? GRUB_BOOT_DEVICE : "", initrd ? initrd : "", initrd ? "\n" : ""); + } grub_normal_add_menu_entry (1, args, NULL, NULL, "bls", NULL, NULL, src, 0); @@ -142,6 +169,7 @@ finish: grub_free (clinux); grub_free (initrd); grub_free (src); + grub_free (target); if (f) grub_file_close (f); -- Matthew Garrett | mjg59@xxxxxxxxxxxxx -- desktop mailing list desktop@xxxxxxxxxxxxxxxxxxxxxxx https://admin.fedoraproject.org/mailman/listinfo/desktop