209 lines
5.5 KiB
Diff
209 lines
5.5 KiB
Diff
|
From c9ee9bedefe71df6bb18868e47ff2189e79d821e Mon Sep 17 00:00:00 2001
|
||
|
From: Lunar <lunar@torproject.org>
|
||
|
Date: Fri, 27 Mar 2015 15:15:13 +0100
|
||
|
Subject: [PATCH 380/506] syslinux: Support {vesa,}menu.c32.
|
||
|
|
||
|
---
|
||
|
grub-core/lib/syslinux_parse.c | 165 ++++++++++++++++++++++++++---------------
|
||
|
1 file changed, 107 insertions(+), 58 deletions(-)
|
||
|
|
||
|
diff --git a/grub-core/lib/syslinux_parse.c b/grub-core/lib/syslinux_parse.c
|
||
|
index 22389eb..153260b 100644
|
||
|
--- a/grub-core/lib/syslinux_parse.c
|
||
|
+++ b/grub-core/lib/syslinux_parse.c
|
||
|
@@ -840,6 +840,82 @@ simplify_filename (char *str)
|
||
|
}
|
||
|
|
||
|
static grub_err_t
|
||
|
+print_config (struct output_buffer *outbuf,
|
||
|
+ struct syslinux_menu *menu,
|
||
|
+ const char *filename, const char *basedir)
|
||
|
+{
|
||
|
+ struct syslinux_menu *menuptr;
|
||
|
+ grub_err_t err = GRUB_ERR_NONE;
|
||
|
+ char *new_cwd = NULL;
|
||
|
+ char *new_target_cwd = NULL;
|
||
|
+ char *newname = NULL;
|
||
|
+ int depth = 0;
|
||
|
+
|
||
|
+ new_cwd = get_read_filename (menu, basedir);
|
||
|
+ if (!new_cwd)
|
||
|
+ {
|
||
|
+ err = grub_errno;
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
+ new_target_cwd = get_target_filename (menu, basedir);
|
||
|
+ if (!new_target_cwd)
|
||
|
+ {
|
||
|
+ err = grub_errno;
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
+ newname = get_read_filename (menu, filename);
|
||
|
+ if (!newname)
|
||
|
+ {
|
||
|
+ err = grub_errno;
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
+ simplify_filename (newname);
|
||
|
+
|
||
|
+ print_string ("#");
|
||
|
+ print_file (outbuf, menu, filename, NULL);
|
||
|
+ print_string (" ");
|
||
|
+ print (outbuf, newname, grub_strlen (newname));
|
||
|
+ print_string (":\n");
|
||
|
+
|
||
|
+ for (menuptr = menu; menuptr; menuptr = menuptr->parent, depth++)
|
||
|
+ if (grub_strcmp (menuptr->filename, newname) == 0
|
||
|
+ || depth > 20)
|
||
|
+ break;
|
||
|
+ if (menuptr)
|
||
|
+ {
|
||
|
+ print_string (" syslinux_configfile -r ");
|
||
|
+ print_file (outbuf, menu, "/", NULL);
|
||
|
+ print_string (" -c ");
|
||
|
+ print_file (outbuf, menu, basedir, NULL);
|
||
|
+ print_string (" ");
|
||
|
+ print_file (outbuf, menu, filename, NULL);
|
||
|
+ print_string ("\n");
|
||
|
+ }
|
||
|
+ else
|
||
|
+ {
|
||
|
+ err = config_file (outbuf, menu->root_read_directory,
|
||
|
+ menu->root_target_directory, new_cwd, new_target_cwd,
|
||
|
+ newname, menu, menu->flavour);
|
||
|
+ if (err == GRUB_ERR_FILE_NOT_FOUND
|
||
|
+ || err == GRUB_ERR_BAD_FILENAME)
|
||
|
+ {
|
||
|
+ grub_errno = err = GRUB_ERR_NONE;
|
||
|
+ print_string ("# File ");
|
||
|
+ err = print (outbuf, newname, grub_strlen (newname));
|
||
|
+ if (err)
|
||
|
+ goto out;
|
||
|
+ print_string (" not found\n");
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ out:
|
||
|
+ grub_free (newname);
|
||
|
+ grub_free (new_cwd);
|
||
|
+ grub_free (new_target_cwd);
|
||
|
+ return err;
|
||
|
+}
|
||
|
+
|
||
|
+static grub_err_t
|
||
|
write_entry (struct output_buffer *outbuf,
|
||
|
struct syslinux_menu *menu,
|
||
|
struct syslinux_menuentry *curentry)
|
||
|
@@ -1227,6 +1303,36 @@ write_entry (struct output_buffer *outbuf,
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
+ if (grub_strcasecmp (basename, "menu.c32") == 0 ||
|
||
|
+ grub_strcasecmp (basename, "vesamenu.c32") == 0)
|
||
|
+ {
|
||
|
+ char *ptr;
|
||
|
+ char *end;
|
||
|
+
|
||
|
+ ptr = curentry->append;
|
||
|
+ if (!ptr)
|
||
|
+ return grub_errno;
|
||
|
+
|
||
|
+ while (*ptr)
|
||
|
+ {
|
||
|
+ end = ptr;
|
||
|
+ for (end = ptr; *end && !grub_isspace (*end); end++);
|
||
|
+ if (*end)
|
||
|
+ *end++ = '\0';
|
||
|
+
|
||
|
+ /* "~" is supposed to be current file, so let's skip it */
|
||
|
+ if (grub_strcmp (ptr, "~") != 0)
|
||
|
+ {
|
||
|
+ err = print_config (outbuf, menu, ptr, "");
|
||
|
+ if (err != GRUB_ERR_NONE)
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ for (ptr = end; *ptr && grub_isspace (*ptr); ptr++);
|
||
|
+ }
|
||
|
+ err = GRUB_ERR_NONE;
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
/* FIXME: gdb, GFXBoot, Hdt, Ifcpu, Ifplop, Kbdmap,
|
||
|
FIXME: Linux, Lua, Meminfo, rosh, Sanbboot */
|
||
|
|
||
|
@@ -1239,70 +1345,13 @@ write_entry (struct output_buffer *outbuf,
|
||
|
}
|
||
|
case KERNEL_CONFIG:
|
||
|
{
|
||
|
- char *new_cwd, *new_target_cwd;
|
||
|
const char *ap;
|
||
|
ap = curentry->append;
|
||
|
if (!ap)
|
||
|
ap = curentry->argument;
|
||
|
if (!ap)
|
||
|
ap = "";
|
||
|
- new_cwd = get_read_filename (menu, ap);
|
||
|
- if (!new_cwd)
|
||
|
- return grub_errno;
|
||
|
- new_target_cwd = get_target_filename (menu, ap);
|
||
|
- if (!new_target_cwd)
|
||
|
- return grub_errno;
|
||
|
-
|
||
|
- struct syslinux_menu *menuptr;
|
||
|
- char *newname;
|
||
|
- int depth = 0;
|
||
|
-
|
||
|
- newname = get_read_filename (menu, curentry->kernel_file);
|
||
|
- if (!newname)
|
||
|
- return grub_errno;
|
||
|
- simplify_filename (newname);
|
||
|
-
|
||
|
- print_string ("#");
|
||
|
- print_file (outbuf, menu, curentry->kernel_file, NULL);
|
||
|
- print_string (" ");
|
||
|
- print (outbuf, newname, grub_strlen (newname));
|
||
|
- print_string (":\n");
|
||
|
-
|
||
|
- for (menuptr = menu; menuptr; menuptr = menuptr->parent, depth++)
|
||
|
- if (grub_strcmp (menuptr->filename, newname) == 0
|
||
|
- || depth > 20)
|
||
|
- break;
|
||
|
- if (menuptr)
|
||
|
- {
|
||
|
- print_string (" syslinux_configfile -r ");
|
||
|
- print_file (outbuf, menu, "/", NULL);
|
||
|
- print_string (" -c ");
|
||
|
- print_file (outbuf, menu, ap, NULL);
|
||
|
- print_string (" ");
|
||
|
- print_file (outbuf, menu, curentry->kernel_file, NULL);
|
||
|
- print_string ("\n");
|
||
|
- }
|
||
|
- else
|
||
|
- {
|
||
|
- err = config_file (outbuf, menu->root_read_directory,
|
||
|
- menu->root_target_directory, new_cwd, new_target_cwd,
|
||
|
- newname, menu, menu->flavour);
|
||
|
- if (err == GRUB_ERR_FILE_NOT_FOUND
|
||
|
- || err == GRUB_ERR_BAD_FILENAME)
|
||
|
- {
|
||
|
- grub_errno = err = GRUB_ERR_NONE;
|
||
|
- print_string ("# File ");
|
||
|
- err = print (outbuf, newname, grub_strlen (newname));
|
||
|
- if (err)
|
||
|
- return err;
|
||
|
- print_string (" not found\n");
|
||
|
- }
|
||
|
- if (err)
|
||
|
- return err;
|
||
|
- }
|
||
|
- grub_free (newname);
|
||
|
- grub_free (new_cwd);
|
||
|
- grub_free (new_target_cwd);
|
||
|
+ print_config (outbuf, menu, curentry->kernel_file, ap);
|
||
|
}
|
||
|
break;
|
||
|
case KERNEL_NO_KERNEL:
|
||
|
--
|
||
|
2.4.3
|
||
|
|