Fix menu title instability bug.
* grub-core/commands/menuentry.c (options): New option --id. (grub_normal_add_menu_entry): New argument id. All users updated. (grub_cmd_menuentry): Handle --id. (grub_menu_init): Accept unknown arguments. * grub-core/normal/main.c (features): Add feature_menuentry_id and feature_menuentry_options. * grub-core/normal/menu.c (grub_menu_execute_entry): Use id for saved_entry. (get_entry_number): Match with id as well. * include/grub/menu.h (grub_menu_entry): New member id. * util/grub-mkconfig_lib.in (grub_get_device_id): New function. * util/grub.d/00_header.in: Define menuentry_id_option. * util/grub.d/10_hurd.in: Define id. * util/grub.d/10_illumos.in: Likewise. * util/grub.d/10_kfreebsd.in: Likewise. * util/grub.d/10_linux.in: Likewise. * util/grub.d/10_netbsd.in: Likewise. * util/grub.d/10_windows.in: Likewise. * util/grub.d/20_linux_xen.in: Likewise. * util/grub.d/30_os-prober.in: Likewise.
This commit is contained in:
parent
0d31b7df86
commit
d9bef9bc43
17 changed files with 126 additions and 27 deletions
27
ChangeLog
27
ChangeLog
|
@ -1,4 +1,29 @@
|
||||||
2012-03-03 Vladimir Serbinenko <phcoder@gmail.com>
|
2012-03-04 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Fix menu title instability bug.
|
||||||
|
|
||||||
|
* grub-core/commands/menuentry.c (options): New option --id.
|
||||||
|
(grub_normal_add_menu_entry): New argument id. All users updated.
|
||||||
|
(grub_cmd_menuentry): Handle --id.
|
||||||
|
(grub_menu_init): Accept unknown arguments.
|
||||||
|
* grub-core/normal/main.c (features): Add feature_menuentry_id and
|
||||||
|
feature_menuentry_options.
|
||||||
|
* grub-core/normal/menu.c (grub_menu_execute_entry): Use id for
|
||||||
|
saved_entry.
|
||||||
|
(get_entry_number): Match with id as well.
|
||||||
|
* include/grub/menu.h (grub_menu_entry): New member id.
|
||||||
|
* util/grub-mkconfig_lib.in (grub_get_device_id): New function.
|
||||||
|
* util/grub.d/00_header.in: Define menuentry_id_option.
|
||||||
|
* util/grub.d/10_hurd.in: Define id.
|
||||||
|
* util/grub.d/10_illumos.in: Likewise.
|
||||||
|
* util/grub.d/10_kfreebsd.in: Likewise.
|
||||||
|
* util/grub.d/10_linux.in: Likewise.
|
||||||
|
* util/grub.d/10_netbsd.in: Likewise.
|
||||||
|
* util/grub.d/10_windows.in: Likewise.
|
||||||
|
* util/grub.d/20_linux_xen.in: Likewise.
|
||||||
|
* util/grub.d/30_os-prober.in: Likewise.
|
||||||
|
|
||||||
|
2012-03-04 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* grub-core/script/execute.c (grub_script_return): Replace ambiguous
|
* grub-core/script/execute.c (grub_script_return): Replace ambiguous
|
||||||
"scope" with "body".
|
"scope" with "body".
|
||||||
|
|
|
@ -123,7 +123,7 @@ legacy_file (const char *filename)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
}
|
}
|
||||||
args[0] = oldname;
|
args[0] = oldname;
|
||||||
grub_normal_add_menu_entry (1, args, NULL, NULL, NULL, NULL,
|
grub_normal_add_menu_entry (1, args, NULL, NULL, NULL, NULL, NULL,
|
||||||
entrysrc, 0);
|
entrysrc, 0);
|
||||||
grub_free (args);
|
grub_free (args);
|
||||||
entrysrc[0] = 0;
|
entrysrc[0] = 0;
|
||||||
|
@ -174,7 +174,8 @@ legacy_file (const char *filename)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
}
|
}
|
||||||
args[0] = entryname;
|
args[0] = entryname;
|
||||||
grub_normal_add_menu_entry (1, args, NULL, NULL, NULL, NULL, entrysrc, 0);
|
grub_normal_add_menu_entry (1, args, NULL, NULL, NULL,
|
||||||
|
NULL, NULL, entrysrc, 0);
|
||||||
grub_free (args);
|
grub_free (args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,8 @@ static const struct grub_arg_option options[] =
|
||||||
N_("Keyboard key to quickly boot this entry."), N_("KEYBOARD_KEY"), ARG_TYPE_STRING},
|
N_("Keyboard key to quickly boot this entry."), N_("KEYBOARD_KEY"), ARG_TYPE_STRING},
|
||||||
{"source", 4, 0,
|
{"source", 4, 0,
|
||||||
N_("Use STRING as menu entry body."), N_("STRING"), ARG_TYPE_STRING},
|
N_("Use STRING as menu entry body."), N_("STRING"), ARG_TYPE_STRING},
|
||||||
|
{"id", 1, GRUB_ARG_OPTION_REPEATABLE,
|
||||||
|
N_("Menu entry identifier."), N_("STRING"), ARG_TYPE_STRING},
|
||||||
{0, 0, 0, 0, 0, 0}
|
{0, 0, 0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -67,7 +69,8 @@ static struct
|
||||||
variable data slot `menu'). As the configuration file is read, the script
|
variable data slot `menu'). As the configuration file is read, the script
|
||||||
parser calls this when a menu entry is to be created. */
|
parser calls this when a menu entry is to be created. */
|
||||||
grub_err_t
|
grub_err_t
|
||||||
grub_normal_add_menu_entry (int argc, const char **args, char **classes,
|
grub_normal_add_menu_entry (int argc, const char **args,
|
||||||
|
char **classes, const char *id,
|
||||||
const char *users, const char *hotkey,
|
const char *users, const char *hotkey,
|
||||||
const char *prefix, const char *sourcecode,
|
const char *prefix, const char *sourcecode,
|
||||||
int submenu)
|
int submenu)
|
||||||
|
@ -77,6 +80,7 @@ grub_normal_add_menu_entry (int argc, const char **args, char **classes,
|
||||||
char *menu_users = NULL;
|
char *menu_users = NULL;
|
||||||
char *menu_title = NULL;
|
char *menu_title = NULL;
|
||||||
char *menu_sourcecode = NULL;
|
char *menu_sourcecode = NULL;
|
||||||
|
char *menu_id = NULL;
|
||||||
struct grub_menu_entry_class *menu_classes = NULL;
|
struct grub_menu_entry_class *menu_classes = NULL;
|
||||||
|
|
||||||
grub_menu_t menu;
|
grub_menu_t menu;
|
||||||
|
@ -139,6 +143,10 @@ grub_normal_add_menu_entry (int argc, const char **args, char **classes,
|
||||||
if (! menu_title)
|
if (! menu_title)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
menu_id = grub_strdup (id ? : menu_title);
|
||||||
|
if (! menu_id)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
/* Save argc, args to pass as parameters to block arg later. */
|
/* Save argc, args to pass as parameters to block arg later. */
|
||||||
menu_args = grub_malloc (sizeof (char*) * (argc + 1));
|
menu_args = grub_malloc (sizeof (char*) * (argc + 1));
|
||||||
if (! menu_args)
|
if (! menu_args)
|
||||||
|
@ -164,6 +172,7 @@ grub_normal_add_menu_entry (int argc, const char **args, char **classes,
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
(*last)->title = menu_title;
|
(*last)->title = menu_title;
|
||||||
|
(*last)->id = menu_id;
|
||||||
(*last)->hotkey = menu_hotkey;
|
(*last)->hotkey = menu_hotkey;
|
||||||
(*last)->classes = menu_classes;
|
(*last)->classes = menu_classes;
|
||||||
if (menu_users)
|
if (menu_users)
|
||||||
|
@ -196,6 +205,7 @@ grub_normal_add_menu_entry (int argc, const char **args, char **classes,
|
||||||
|
|
||||||
grub_free (menu_users);
|
grub_free (menu_users);
|
||||||
grub_free (menu_title);
|
grub_free (menu_title);
|
||||||
|
grub_free (menu_id);
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -257,7 +267,9 @@ grub_cmd_menuentry (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
if (! ctxt->script)
|
if (! ctxt->script)
|
||||||
return grub_normal_add_menu_entry (argc, (const char **) args,
|
return grub_normal_add_menu_entry (argc, (const char **) args,
|
||||||
(ctxt->state[0].set ? ctxt->state[0].args
|
(ctxt->state[0].set ? ctxt->state[0].args
|
||||||
: NULL), ctxt->state[1].arg,
|
: NULL),
|
||||||
|
ctxt->state[4].arg,
|
||||||
|
ctxt->state[1].arg,
|
||||||
ctxt->state[2].arg, 0,
|
ctxt->state[2].arg, 0,
|
||||||
ctxt->state[3].arg,
|
ctxt->state[3].arg,
|
||||||
ctxt->extcmd->cmd->name[0] == 's');
|
ctxt->extcmd->cmd->name[0] == 's');
|
||||||
|
@ -274,7 +286,8 @@ grub_cmd_menuentry (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
r = grub_normal_add_menu_entry (argc - 1, (const char **) args,
|
r = grub_normal_add_menu_entry (argc - 1, (const char **) args,
|
||||||
ctxt->state[0].args, ctxt->state[1].arg,
|
ctxt->state[0].args, ctxt->state[4].arg,
|
||||||
|
ctxt->state[1].arg,
|
||||||
ctxt->state[2].arg, prefix, src + 1,
|
ctxt->state[2].arg, prefix, src + 1,
|
||||||
ctxt->extcmd->cmd->name[0] == 's');
|
ctxt->extcmd->cmd->name[0] == 's');
|
||||||
|
|
||||||
|
@ -291,10 +304,12 @@ grub_menu_init (void)
|
||||||
{
|
{
|
||||||
cmd = grub_register_extcmd ("menuentry", grub_cmd_menuentry,
|
cmd = grub_register_extcmd ("menuentry", grub_cmd_menuentry,
|
||||||
GRUB_COMMAND_FLAG_BLOCKS
|
GRUB_COMMAND_FLAG_BLOCKS
|
||||||
|
| GRUB_COMMAND_ACCEPT_DASH
|
||||||
| GRUB_COMMAND_FLAG_EXTRACTOR,
|
| GRUB_COMMAND_FLAG_EXTRACTOR,
|
||||||
N_("BLOCK"), N_("Define a menu entry."), options);
|
N_("BLOCK"), N_("Define a menu entry."), options);
|
||||||
cmd_sub = grub_register_extcmd ("submenu", grub_cmd_menuentry,
|
cmd_sub = grub_register_extcmd ("submenu", grub_cmd_menuentry,
|
||||||
GRUB_COMMAND_FLAG_BLOCKS
|
GRUB_COMMAND_FLAG_BLOCKS
|
||||||
|
| GRUB_COMMAND_ACCEPT_DASH
|
||||||
| GRUB_COMMAND_FLAG_EXTRACTOR,
|
| GRUB_COMMAND_FLAG_EXTRACTOR,
|
||||||
N_("BLOCK"), N_("Define a submenu."),
|
N_("BLOCK"), N_("Define a submenu."),
|
||||||
options);
|
options);
|
||||||
|
|
|
@ -475,7 +475,8 @@ static grub_command_t cmd_clear;
|
||||||
static void (*grub_xputs_saved) (const char *str);
|
static void (*grub_xputs_saved) (const char *str);
|
||||||
static const char *features[] = {
|
static const char *features[] = {
|
||||||
"feature_chainloader_bpb", "feature_ntldr", "feature_platform_search_hint",
|
"feature_chainloader_bpb", "feature_ntldr", "feature_platform_search_hint",
|
||||||
"feature_default_font_path", "feature_all_video_module"
|
"feature_default_font_path", "feature_all_video_module",
|
||||||
|
"feature_menuentry_id", "feature_menuentry_options"
|
||||||
};
|
};
|
||||||
|
|
||||||
GRUB_MOD_INIT(normal)
|
GRUB_MOD_INIT(normal)
|
||||||
|
|
|
@ -188,7 +188,7 @@ grub_menu_execute_entry(grub_menu_entry_t entry, int auto_boot)
|
||||||
grub_env_set ("timeout", "0");
|
grub_env_set ("timeout", "0");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ptr = entry->title; *ptr; ptr++)
|
for (ptr = entry->id; *ptr; ptr++)
|
||||||
sz += (*ptr == '>') ? 2 : 1;
|
sz += (*ptr == '>') ? 2 : 1;
|
||||||
if (chosen)
|
if (chosen)
|
||||||
{
|
{
|
||||||
|
@ -217,7 +217,7 @@ grub_menu_execute_entry(grub_menu_entry_t entry, int auto_boot)
|
||||||
optr = grub_stpcpy (optr, chosen);
|
optr = grub_stpcpy (optr, chosen);
|
||||||
*optr++ = '>';
|
*optr++ = '>';
|
||||||
}
|
}
|
||||||
for (ptr = entry->title; *ptr; ptr++)
|
for (ptr = entry->id; *ptr; ptr++)
|
||||||
{
|
{
|
||||||
if (*ptr == '>')
|
if (*ptr == '>')
|
||||||
*optr++ = '>';
|
*optr++ = '>';
|
||||||
|
@ -411,10 +411,10 @@ grub_menu_register_viewer (struct grub_menu_viewer *viewer)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
menuentry_eq (const char *title, const char *spec)
|
menuentry_eq (const char *id, const char *spec)
|
||||||
{
|
{
|
||||||
const char *ptr1, *ptr2;
|
const char *ptr1, *ptr2;
|
||||||
ptr1 = title;
|
ptr1 = id;
|
||||||
ptr2 = spec;
|
ptr2 = spec;
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
@ -459,7 +459,8 @@ get_entry_number (grub_menu_t menu, const char *name)
|
||||||
|
|
||||||
for (i = 0; e; i++)
|
for (i = 0; e; i++)
|
||||||
{
|
{
|
||||||
if (menuentry_eq (e->title, val))
|
if (menuentry_eq (e->title, val)
|
||||||
|
|| menuentry_eq (e->id, val))
|
||||||
{
|
{
|
||||||
entry = i;
|
entry = i;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -32,6 +32,9 @@ struct grub_menu_entry
|
||||||
/* The title name. */
|
/* The title name. */
|
||||||
const char *title;
|
const char *title;
|
||||||
|
|
||||||
|
/* The identifier. */
|
||||||
|
const char *id;
|
||||||
|
|
||||||
/* If set means not everybody is allowed to boot this entry. */
|
/* If set means not everybody is allowed to boot this entry. */
|
||||||
int restricted;
|
int restricted;
|
||||||
|
|
||||||
|
|
|
@ -120,6 +120,7 @@ extern int grub_extractor_level;
|
||||||
|
|
||||||
grub_err_t
|
grub_err_t
|
||||||
grub_normal_add_menu_entry (int argc, const char **args, char **classes,
|
grub_normal_add_menu_entry (int argc, const char **args, char **classes,
|
||||||
|
const char *id,
|
||||||
const char *users, const char *hotkey,
|
const char *users, const char *hotkey,
|
||||||
const char *prefix, const char *sourcecode,
|
const char *prefix, const char *sourcecode,
|
||||||
int submenu);
|
int submenu);
|
||||||
|
|
|
@ -162,6 +162,16 @@ prepare_grub_to_access_device ()
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grub_get_device_id ()
|
||||||
|
{
|
||||||
|
device="$1"
|
||||||
|
if fs_uuid="`"${grub_probe}" --device "${device}" --target=fs_uuid 2> /dev/null`" ; then
|
||||||
|
echo "$fs_uuid";
|
||||||
|
else
|
||||||
|
echo "$device"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
grub_file_is_not_garbage ()
|
grub_file_is_not_garbage ()
|
||||||
{
|
{
|
||||||
if test -f "$1" ; then
|
if test -f "$1" ; then
|
||||||
|
|
|
@ -63,6 +63,15 @@ set default="${GRUB_DEFAULT}"
|
||||||
EOF
|
EOF
|
||||||
fi
|
fi
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
|
|
||||||
|
if [ x"\${feature_menuentry_id}" = xy ]; then
|
||||||
|
menuentry_id_option="--id"
|
||||||
|
else
|
||||||
|
menuentry_id_option=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
export menuentry_id_option
|
||||||
|
|
||||||
if [ "\${prev_saved_entry}" ]; then
|
if [ "\${prev_saved_entry}" ]; then
|
||||||
set saved_entry="\${prev_saved_entry}"
|
set saved_entry="\${prev_saved_entry}"
|
||||||
save_env saved_entry
|
save_env saved_entry
|
||||||
|
|
|
@ -85,9 +85,9 @@ do
|
||||||
KERNEL="using ${kernel_base}"
|
KERNEL="using ${kernel_base}"
|
||||||
|
|
||||||
cat << EOF
|
cat << EOF
|
||||||
menuentry "${OS} ${KERNEL}" ${CLASS} {
|
menuentry "${OS} ${KERNEL}" ${CLASS} \$menuentry_id_option 'gnuhurd-$kernel-false-$(grub_get_device_id "${GRUB_DEVICE_BOOT}")' {
|
||||||
EOF
|
EOF
|
||||||
prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/"
|
prepare_grub_to_access_device "${GRUB_DEVICE_BOOT}" | sed -e "s/^/\t/"
|
||||||
message="$(gettext_printf "Loading GNU Mach ...")"
|
message="$(gettext_printf "Loading GNU Mach ...")"
|
||||||
cat << EOF
|
cat << EOF
|
||||||
echo '$message'
|
echo '$message'
|
||||||
|
|
|
@ -34,9 +34,9 @@ case "${GRUB_DISTRIBUTOR}" in
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
echo "menuentry '${OS}' ${CLASS} {"
|
echo "menuentry '${OS}' ${CLASS} \$menuentry_id_option 'illumos-$(grub_get_device_id "${GRUB_DEVICE_BOOT}")' {"
|
||||||
save_default_entry | sed -e "s/^/\t/"
|
save_default_entry | sed -e "s/^/\t/"
|
||||||
prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/"
|
prepare_grub_to_access_device "${GRUB_DEVICE_BOOT}" | sed -e "s/^/\t/"
|
||||||
message="$(gettext_printf "Loading kernel of Illumos ...")"
|
message="$(gettext_printf "Loading kernel of Illumos ...")"
|
||||||
cat << EOF
|
cat << EOF
|
||||||
insmod gzio
|
insmod gzio
|
||||||
|
|
|
@ -74,7 +74,10 @@ kfreebsd_entry ()
|
||||||
else
|
else
|
||||||
title="$(gettext_quoted "%s, with kFreeBSD %s")"
|
title="$(gettext_quoted "%s, with kFreeBSD %s")"
|
||||||
fi
|
fi
|
||||||
printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${version}"
|
if [ -z "$boot_device_id" ]; then
|
||||||
|
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
|
||||||
|
fi
|
||||||
|
printf "menuentry '${title}' ${CLASS} \$menuentry_id_option 'kfreebsd-$version-$recovery-$boot_device_id' {\n" "${os}" "${version}"
|
||||||
if ! ${recovery} ; then
|
if ! ${recovery} ; then
|
||||||
save_default_entry | sed -e "s/^/\t/"
|
save_default_entry | sed -e "s/^/\t/"
|
||||||
fi
|
fi
|
||||||
|
@ -132,6 +135,7 @@ list=`for i in /boot/kfreebsd-* /boot/kernel/kernel ; do
|
||||||
if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
|
if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
|
||||||
done`
|
done`
|
||||||
prepare_boot_cache=
|
prepare_boot_cache=
|
||||||
|
boot_device_id=
|
||||||
|
|
||||||
while [ "x$list" != "x" ] ; do
|
while [ "x$list" != "x" ] ; do
|
||||||
kfreebsd=`version_find_latest $list`
|
kfreebsd=`version_find_latest $list`
|
||||||
|
|
|
@ -77,7 +77,10 @@ linux_entry ()
|
||||||
else
|
else
|
||||||
title="$(gettext_quoted "%s, with Linux %s")"
|
title="$(gettext_quoted "%s, with Linux %s")"
|
||||||
fi
|
fi
|
||||||
printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${version}"
|
if [ -z "$boot_device_id" ]; then
|
||||||
|
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
|
||||||
|
fi
|
||||||
|
printf "menuentry '${title}' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$recovery-$boot_device_id' {\n" "${os}" "${version}"
|
||||||
if ! ${recovery} ; then
|
if ! ${recovery} ; then
|
||||||
save_default_entry | sed -e "s/^/\t/"
|
save_default_entry | sed -e "s/^/\t/"
|
||||||
fi
|
fi
|
||||||
|
@ -151,6 +154,7 @@ esac
|
||||||
|
|
||||||
prepare_boot_cache=
|
prepare_boot_cache=
|
||||||
prepare_root_cache=
|
prepare_root_cache=
|
||||||
|
boot_device_id=
|
||||||
|
|
||||||
while [ "x$list" != "x" ] ; do
|
while [ "x$list" != "x" ] ; do
|
||||||
linux=`version_find_latest $list`
|
linux=`version_find_latest $list`
|
||||||
|
|
|
@ -99,7 +99,10 @@ netbsd_entry ()
|
||||||
title="$(gettext_quoted "%s, with kernel %s (via %s)")"
|
title="$(gettext_quoted "%s, with kernel %s (via %s)")"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
printf "menuentry \"${title}\" {\n" \
|
if [ -z "$boot_device_id" ]; then
|
||||||
|
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
|
||||||
|
fi
|
||||||
|
printf "menuentry \"${title}\" \$menuentry_id_option 'netbsd-$kernel-$recovery-$boot_device_id' {\n" \
|
||||||
"${OS}" "$(echo ${kernel} | sed -e 's,^.*/,,')" "${loader}"
|
"${OS}" "$(echo ${kernel} | sed -e 's,^.*/,,')" "${loader}"
|
||||||
printf "%s\n" "${prepare_boot_cache}"
|
printf "%s\n" "${prepare_boot_cache}"
|
||||||
case "${loader}" in
|
case "${loader}" in
|
||||||
|
@ -119,6 +122,7 @@ netbsd_entry ()
|
||||||
}
|
}
|
||||||
|
|
||||||
prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE} | sed -e 's,^, ,')"
|
prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE} | sed -e 's,^, ,')"
|
||||||
|
boot_device_id=
|
||||||
|
|
||||||
# We look for NetBSD kernels in / but not in subdirectories. We simply
|
# We look for NetBSD kernels in / but not in subdirectories. We simply
|
||||||
# pick all statically linked ELF executable files (or links) in / with a
|
# pick all statically linked ELF executable files (or links) in / with a
|
||||||
|
|
|
@ -63,14 +63,16 @@ for drv in $drives ; do
|
||||||
test -n "$dir" || continue
|
test -n "$dir" || continue
|
||||||
|
|
||||||
needmap=
|
needmap=
|
||||||
|
osid=
|
||||||
|
|
||||||
# Check for Vista bootmgr.
|
# Check for Vista bootmgr.
|
||||||
if [ -f "$dir"/bootmgr -a -f "$dir"/boot/bcd ] ; then
|
if [ -f "$dir"/bootmgr -a -f "$dir"/boot/bcd ] ; then
|
||||||
OS="$(gettext_quoted "Windows Vista/7 (loader)")"
|
OS="$(gettext_quoted "Windows Vista/7 (loader)")"
|
||||||
|
osid=bootmgr
|
||||||
# Check for NTLDR.
|
# Check for NTLDR.
|
||||||
elif [ -f "$dir"/ntldr -a -f "$dir"/ntdetect.com -a -f "$dir"/boot.ini ] ; then
|
elif [ -f "$dir"/ntldr -a -f "$dir"/ntdetect.com -a -f "$dir"/boot.ini ] ; then
|
||||||
OS=`get_os_name_from_boot_ini "$dir"/boot.ini` || OS="$(gettext_quoted "Windows NT/2000/XP (loader)")"
|
OS=`get_os_name_from_boot_ini "$dir"/boot.ini` || OS="$(gettext_quoted "Windows NT/2000/XP (loader)")"
|
||||||
|
osid=ntldr
|
||||||
needmap=t
|
needmap=t
|
||||||
|
|
||||||
else
|
else
|
||||||
|
@ -82,7 +84,7 @@ for drv in $drives ; do
|
||||||
|
|
||||||
gettext_printf "Found %s on %s (%s)\n" "$OS" "$drv" "$dev" >&2
|
gettext_printf "Found %s on %s (%s)\n" "$OS" "$drv" "$dev" >&2
|
||||||
cat << EOF
|
cat << EOF
|
||||||
menuentry "$OS" {
|
menuentry "$OS" \$menuentry_id_option '$osid-$(grub_get_device_id "${dev}")' {
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
save_default_entry | sed -e 's,^,\t,'
|
save_default_entry | sed -e 's,^,\t,'
|
||||||
|
|
|
@ -87,7 +87,10 @@ linux_entry ()
|
||||||
else
|
else
|
||||||
title="$(gettext_quoted "%s, with Xen %s and Linux %s")"
|
title="$(gettext_quoted "%s, with Xen %s and Linux %s")"
|
||||||
fi
|
fi
|
||||||
printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${xen_version}" "${version}"
|
if [ -z "$boot_device_id" ]; then
|
||||||
|
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
|
||||||
|
fi
|
||||||
|
printf "menuentry '${title}' ${CLASS} \$menuentry_id_option 'xen-gnulinux-$version-$recovery-$boot_device_id' {\n" "${os}" "${xen_version}" "${version}"
|
||||||
if ! ${recovery} ; then
|
if ! ${recovery} ; then
|
||||||
save_default_entry | sed -e "s/^/\t/"
|
save_default_entry | sed -e "s/^/\t/"
|
||||||
fi
|
fi
|
||||||
|
@ -139,6 +142,7 @@ xen_list=`for i in /boot/xen*; do
|
||||||
if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
|
if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
|
||||||
done`
|
done`
|
||||||
prepare_boot_cache=
|
prepare_boot_cache=
|
||||||
|
boot_device_id=
|
||||||
|
|
||||||
while [ "x${xen_list}" != "x" ] ; do
|
while [ "x${xen_list}" != "x" ] ; do
|
||||||
list="${linux_list}"
|
list="${linux_list}"
|
||||||
|
@ -147,7 +151,10 @@ while [ "x${xen_list}" != "x" ] ; do
|
||||||
xen_dirname=`dirname ${current_xen}`
|
xen_dirname=`dirname ${current_xen}`
|
||||||
rel_xen_dirname=`make_system_path_relative_to_its_root $xen_dirname`
|
rel_xen_dirname=`make_system_path_relative_to_its_root $xen_dirname`
|
||||||
xen_version=`echo $xen_basename | sed -e "s,.gz$,,g;s,^xen-,,g"`
|
xen_version=`echo $xen_basename | sed -e "s,.gz$,,g;s,^xen-,,g"`
|
||||||
echo "submenu \"Xen ${xen_version}\" {"
|
if [ -z "$boot_device_id" ]; then
|
||||||
|
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
|
||||||
|
fi
|
||||||
|
echo "submenu \"Xen ${xen_version}\" \$menuentry_id_option 'xen-hypervisor-$xen_version-$boot_device_id' {"
|
||||||
while [ "x$list" != "x" ] ; do
|
while [ "x$list" != "x" ] ; do
|
||||||
linux=`version_find_latest $list`
|
linux=`version_find_latest $list`
|
||||||
gettext_printf "Found linux image: %s\n" "$linux" >&2
|
gettext_printf "Found linux image: %s\n" "$linux" >&2
|
||||||
|
|
|
@ -52,7 +52,7 @@ osx_entry() {
|
||||||
# TRANSLATORS: it refers on the OS residing on device %s
|
# TRANSLATORS: it refers on the OS residing on device %s
|
||||||
onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
|
onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
|
||||||
cat << EOF
|
cat << EOF
|
||||||
menuentry "${LONGNAME} $bitstr $onstr" --class osx --class darwin --class os {
|
menuentry "${LONGNAME} $bitstr $onstr" --class osx --class darwin --class os \$menuentry_id_option 'osprober-xnu-$2-$(grub_get_device_id "${DEVICE}")' {
|
||||||
EOF
|
EOF
|
||||||
save_default_entry | sed -e "s/^/\t/"
|
save_default_entry | sed -e "s/^/\t/"
|
||||||
prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"
|
prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"
|
||||||
|
@ -104,6 +104,8 @@ EOF
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
used_osprober_linux_ids=
|
||||||
|
|
||||||
for OS in ${OSPROBED} ; do
|
for OS in ${OSPROBED} ; do
|
||||||
DEVICE="`echo ${OS} | cut -d ':' -f 1`"
|
DEVICE="`echo ${OS} | cut -d ':' -f 1`"
|
||||||
LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`"
|
LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`"
|
||||||
|
@ -121,7 +123,7 @@ for OS in ${OSPROBED} ; do
|
||||||
|
|
||||||
onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
|
onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
|
||||||
cat << EOF
|
cat << EOF
|
||||||
menuentry "${LONGNAME} $onstr" --class windows --class os {
|
menuentry "${LONGNAME} $onstr" --class windows --class os \$menuentry_id_option 'osprober-chain-$(grub_get_device_id "${DEVICE}")' {
|
||||||
EOF
|
EOF
|
||||||
save_default_entry | sed -e "s/^/\t/"
|
save_default_entry | sed -e "s/^/\t/"
|
||||||
prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"
|
prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"
|
||||||
|
@ -144,6 +146,7 @@ EOF
|
||||||
linux)
|
linux)
|
||||||
LINUXPROBED="`linux-boot-prober ${DEVICE} 2> /dev/null | tr ' ' '^' | paste -s -d ' '`"
|
LINUXPROBED="`linux-boot-prober ${DEVICE} 2> /dev/null | tr ' ' '^' | paste -s -d ' '`"
|
||||||
prepare_boot_cache=
|
prepare_boot_cache=
|
||||||
|
boot_device_id=
|
||||||
|
|
||||||
for LINUX in ${LINUXPROBED} ; do
|
for LINUX in ${LINUXPROBED} ; do
|
||||||
LROOT="`echo ${LINUX} | cut -d ':' -f 1`"
|
LROOT="`echo ${LINUX} | cut -d ':' -f 1`"
|
||||||
|
@ -163,8 +166,17 @@ EOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
|
onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
|
||||||
|
recovery_params="$(echo "${LPARAMS}" | grep single)"
|
||||||
|
counter=1
|
||||||
|
while echo "$used_osprober_linux_ids" | grep 'osprober-gnulinux-$LKERNEL-${recovery_params}-$counter-$boot_device_id' > /dev/null; do
|
||||||
|
counter=$((counter+1));
|
||||||
|
done
|
||||||
|
if [ -z "$boot_device_id" ]; then
|
||||||
|
boot_device_id="$(grub_get_device_id "${DEVICE}")"
|
||||||
|
fi
|
||||||
|
used_osprober_linux_ids="$used_osprober_linux_ids 'osprober-gnulinux-$LKERNEL-${recovery_params}-$counter-$boot_device_id'"
|
||||||
cat << EOF
|
cat << EOF
|
||||||
menuentry "${LLABEL} $onstr" --class gnu-linux --class gnu --class os {
|
menuentry "${LLABEL} $onstr" --class gnu-linux --class gnu --class os \$menuentry_id_option 'osprober-gnulinux-$LKERNEL-${recovery_params}-$boot_device_id' {
|
||||||
EOF
|
EOF
|
||||||
save_default_entry | sed -e "s/^/\t/"
|
save_default_entry | sed -e "s/^/\t/"
|
||||||
if [ -z "${prepare_boot_cache}" ]; then
|
if [ -z "${prepare_boot_cache}" ]; then
|
||||||
|
@ -192,7 +204,7 @@ EOF
|
||||||
hurd)
|
hurd)
|
||||||
onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
|
onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
|
||||||
cat << EOF
|
cat << EOF
|
||||||
menuentry "${LONGNAME} $onstr" --class hurd --class gnu --class os {
|
menuentry "${LONGNAME} $onstr" --class hurd --class gnu --class os \$menuentry_id_option 'osprober-gnuhurd-/boot/gnumach.gz-false-$(grub_get_device_id "${DEVICE}")' {
|
||||||
EOF
|
EOF
|
||||||
save_default_entry | sed -e "s/^/\t/"
|
save_default_entry | sed -e "s/^/\t/"
|
||||||
prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"
|
prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"
|
||||||
|
|
Loading…
Reference in a new issue