Implement hiddenmenu (not tested)
This commit is contained in:
parent
237a43b1c1
commit
6c6850ae13
4 changed files with 62 additions and 13 deletions
|
@ -37,6 +37,18 @@ legacy_file (const char *filename)
|
||||||
grub_file_t file;
|
grub_file_t file;
|
||||||
char *entryname = NULL, *entrysrc = NULL;
|
char *entryname = NULL, *entrysrc = NULL;
|
||||||
grub_menu_t menu;
|
grub_menu_t menu;
|
||||||
|
char *suffix = grub_strdup ("");
|
||||||
|
|
||||||
|
auto grub_err_t getline (char **line, int cont);
|
||||||
|
grub_err_t getline (char **line,
|
||||||
|
int cont __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
*line = 0;
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!suffix)
|
||||||
|
return grub_errno;
|
||||||
|
|
||||||
file = grub_file_open (filename);
|
file = grub_file_open (filename);
|
||||||
if (! file)
|
if (! file)
|
||||||
|
@ -68,10 +80,32 @@ legacy_file (const char *filename)
|
||||||
|
|
||||||
{
|
{
|
||||||
char *oldname = NULL;
|
char *oldname = NULL;
|
||||||
|
int is_suffix;
|
||||||
|
|
||||||
oldname = entryname;
|
oldname = entryname;
|
||||||
parsed = grub_legacy_parse (buf, &entryname);
|
parsed = grub_legacy_parse (buf, &entryname, &is_suffix);
|
||||||
grub_free (buf);
|
grub_free (buf);
|
||||||
|
if (is_suffix)
|
||||||
|
{
|
||||||
|
char *t;
|
||||||
|
|
||||||
|
t = suffix;
|
||||||
|
suffix = grub_realloc (suffix, grub_strlen (suffix)
|
||||||
|
+ grub_strlen (parsed) + 1);
|
||||||
|
if (!suffix)
|
||||||
|
{
|
||||||
|
grub_free (t);
|
||||||
|
grub_free (entrysrc);
|
||||||
|
grub_free (parsed);
|
||||||
|
grub_free (suffix);
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
grub_memcpy (entrysrc + grub_strlen (entrysrc), parsed,
|
||||||
|
grub_strlen (parsed) + 1);
|
||||||
|
grub_free (parsed);
|
||||||
|
parsed = NULL;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (oldname != entryname && oldname)
|
if (oldname != entryname && oldname)
|
||||||
{
|
{
|
||||||
const char **args = grub_malloc (sizeof (args[0]));
|
const char **args = grub_malloc (sizeof (args[0]));
|
||||||
|
@ -88,13 +122,6 @@ legacy_file (const char *filename)
|
||||||
|
|
||||||
if (parsed && !entryname)
|
if (parsed && !entryname)
|
||||||
{
|
{
|
||||||
auto grub_err_t getline (char **line, int cont);
|
|
||||||
grub_err_t getline (char **line __attribute__ ((unused)),
|
|
||||||
int cont __attribute__ ((unused)))
|
|
||||||
{
|
|
||||||
return GRUB_ERR_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
grub_normal_parse_line (parsed, getline);
|
grub_normal_parse_line (parsed, getline);
|
||||||
grub_print_error ();
|
grub_print_error ();
|
||||||
grub_free (parsed);
|
grub_free (parsed);
|
||||||
|
@ -114,6 +141,7 @@ legacy_file (const char *filename)
|
||||||
{
|
{
|
||||||
grub_free (t);
|
grub_free (t);
|
||||||
grub_free (parsed);
|
grub_free (parsed);
|
||||||
|
grub_free (suffix);
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
}
|
}
|
||||||
grub_memcpy (entrysrc + grub_strlen (entrysrc), parsed,
|
grub_memcpy (entrysrc + grub_strlen (entrysrc), parsed,
|
||||||
|
@ -137,6 +165,10 @@ legacy_file (const char *filename)
|
||||||
grub_normal_add_menu_entry (1, args, NULL, NULL, NULL, NULL, entrysrc);
|
grub_normal_add_menu_entry (1, args, NULL, NULL, NULL, NULL, entrysrc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grub_normal_parse_line (suffix, getline);
|
||||||
|
grub_print_error ();
|
||||||
|
grub_free (suffix);
|
||||||
|
|
||||||
if (menu && menu->size)
|
if (menu && menu->size)
|
||||||
grub_show_menu (menu, 1);
|
grub_show_menu (menu, 1);
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,8 @@ struct legacy_command
|
||||||
TYPE_REST_VERBATIM
|
TYPE_REST_VERBATIM
|
||||||
} argt[4];
|
} argt[4];
|
||||||
enum {
|
enum {
|
||||||
FLAG_IGNORE_REST = 1
|
FLAG_IGNORE_REST = 1,
|
||||||
|
FLAG_SUFFIX = 2
|
||||||
} flags;
|
} flags;
|
||||||
const char *shortdesc;
|
const char *shortdesc;
|
||||||
const char *longdesc;
|
const char *longdesc;
|
||||||
|
@ -108,7 +109,8 @@ struct legacy_command legacy_commands[] =
|
||||||
"Halt your system. If APM is available on it, turn off the power using"
|
"Halt your system. If APM is available on it, turn off the power using"
|
||||||
" the APM BIOS, unless you specify the option `--no-apm'."},
|
" the APM BIOS, unless you specify the option `--no-apm'."},
|
||||||
/* FIXME: help unsupported. */ /* NUL_TERMINATE */
|
/* FIXME: help unsupported. */ /* NUL_TERMINATE */
|
||||||
/* FIXME: hiddenmenu unsupported. */
|
{"hiddenmenu", "if sleep -i $timeout; then timeout=0; else timeout=-1; fi\n",
|
||||||
|
0, {}, FLAG_SUFFIX, "", "Hide the menu."},
|
||||||
{"hide", "parttool '%s' hidden+\n", 1, {TYPE_PARTITION}, 0, "PARTITION",
|
{"hide", "parttool '%s' hidden+\n", 1, {TYPE_PARTITION}, 0, "PARTITION",
|
||||||
"Hide PARTITION by setting the \"hidden\" bit in"
|
"Hide PARTITION by setting the \"hidden\" bit in"
|
||||||
" its partition type code."},
|
" its partition type code."},
|
||||||
|
@ -354,12 +356,14 @@ is_option (enum arg_type opt, const char *curarg, grub_size_t len)
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
grub_legacy_parse (const char *buf, char **entryname)
|
grub_legacy_parse (const char *buf, char **entryname, int *suffix)
|
||||||
{
|
{
|
||||||
const char *ptr;
|
const char *ptr;
|
||||||
const char *cmdname;
|
const char *cmdname;
|
||||||
unsigned i, cmdnum;
|
unsigned i, cmdnum;
|
||||||
|
|
||||||
|
*suffix = 0;
|
||||||
|
|
||||||
for (ptr = buf; *ptr && grub_isspace (*ptr); ptr++);
|
for (ptr = buf; *ptr && grub_isspace (*ptr); ptr++);
|
||||||
if (!*ptr || *ptr == '#')
|
if (!*ptr || *ptr == '#')
|
||||||
return grub_strdup (buf);
|
return grub_strdup (buf);
|
||||||
|
@ -392,6 +396,8 @@ grub_legacy_parse (const char *buf, char **entryname)
|
||||||
if (cmdnum == ARRAY_SIZE (legacy_commands))
|
if (cmdnum == ARRAY_SIZE (legacy_commands))
|
||||||
return grub_xasprintf ("# Unsupported legacy command: %s\n", buf);
|
return grub_xasprintf ("# Unsupported legacy command: %s\n", buf);
|
||||||
|
|
||||||
|
*suffix = !!(legacy_commands[cmdnum].flags & FLAG_SUFFIX);
|
||||||
|
|
||||||
for (; grub_isspace (*ptr) || *ptr == '='; ptr++);
|
for (; grub_isspace (*ptr) || *ptr == '='; ptr++);
|
||||||
|
|
||||||
char *args[ARRAY_SIZE (legacy_commands[0].argt)];
|
char *args[ARRAY_SIZE (legacy_commands[0].argt)];
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
#include <grub/types.h>
|
#include <grub/types.h>
|
||||||
|
|
||||||
char *grub_legacy_parse (const char *buf, char **entryname);
|
char *grub_legacy_parse (const char *buf, char **entryname, int *suffix);
|
||||||
char *grub_legacy_escape (const char *in, grub_size_t len);
|
char *grub_legacy_escape (const char *in, grub_size_t len);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -28,6 +28,9 @@ main (int argc, char **argv)
|
||||||
char *entryname = NULL;
|
char *entryname = NULL;
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
size_t bufsize = 0;
|
size_t bufsize = 0;
|
||||||
|
char *suffix = xstrdup ("");
|
||||||
|
int suffixlen = 0;
|
||||||
|
int is_suffix = 0;
|
||||||
|
|
||||||
if (argc >= 2 && argv[1][0] == '-')
|
if (argc >= 2 && argv[1][0] == '-')
|
||||||
{
|
{
|
||||||
|
@ -74,7 +77,14 @@ main (int argc, char **argv)
|
||||||
char *oldname = NULL;
|
char *oldname = NULL;
|
||||||
|
|
||||||
oldname = entryname;
|
oldname = entryname;
|
||||||
parsed = grub_legacy_parse (buf, &entryname);
|
parsed = grub_legacy_parse (buf, &entryname, &is_suffix);
|
||||||
|
if (is_suffix)
|
||||||
|
{
|
||||||
|
suffixlen += strlen (parsed);
|
||||||
|
suffix = xrealloc (suffix, suffixlen + 1);
|
||||||
|
strcat (suffix, parsed);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (oldname != entryname && oldname)
|
if (oldname != entryname && oldname)
|
||||||
fprintf (out, "}\n\n");
|
fprintf (out, "}\n\n");
|
||||||
if (oldname != entryname)
|
if (oldname != entryname)
|
||||||
|
@ -89,6 +99,7 @@ main (int argc, char **argv)
|
||||||
if (entryname)
|
if (entryname)
|
||||||
fprintf (out, "}\n\n");
|
fprintf (out, "}\n\n");
|
||||||
|
|
||||||
|
fwrite (out, 1, suffixlen, suffix);
|
||||||
|
|
||||||
if (in != stdin)
|
if (in != stdin)
|
||||||
fclose (in);
|
fclose (in);
|
||||||
|
|
Loading…
Add table
Reference in a new issue