[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bug #44238] Add support for menu.c32 and vesamenu.c32 in lib/syslin
From: |
Lunar |
Subject: |
Re: [bug #44238] Add support for menu.c32 and vesamenu.c32 in lib/syslinux_parse |
Date: |
Fri, 13 Feb 2015 21:20:23 +0100 |
User-agent: |
Mutt/1.5.23 (2014-03-12) |
Andrei Borzenkov:
> Follow-up Comment #1, bug #44238 (project grub):
>
> + 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)
> + continue;
>
> If you hit "~" you get endless loop.
Thanks for spotting the mistake.
> Could you post fixed version to grub-devel for easier review?
Attached.
--
Lunar <address@hidden>
From 9b441e5e6c602c71e522c594ca6cff72a12c078c Mon Sep 17 00:00:00 2001
From: Lunar <address@hidden>
Date: Sat, 14 Feb 2015 14:14:25 +0100
Subject: [PATCH 1/2] lib/syslinux_parse: add support for (vesa)menu.c32
Fixes Savannah bug #44238.
---
grub-core/lib/syslinux_parse.c | 157 ++++++++++++++++++++++++++---------------
1 file changed, 99 insertions(+), 58 deletions(-)
diff --git a/grub-core/lib/syslinux_parse.c b/grub-core/lib/syslinux_parse.c
index 2c874b1..b0d5f9e 100644
--- a/grub-core/lib/syslinux_parse.c
+++ b/grub-core/lib/syslinux_parse.c
@@ -840,6 +840,74 @@ simplify_filename (char *str)
}
static grub_err_t
+print_config (struct output_buffer *outbuf,
+ struct syslinux_menu *menu,
+ const char *filename, const char *basedir)
+{
+ grub_err_t err;
+ char *new_cwd, *new_target_cwd;
+
+ new_cwd = get_read_filename (menu, basedir);
+ if (!new_cwd)
+ return grub_errno;
+ new_target_cwd = get_target_filename (menu, basedir);
+ if (!new_target_cwd)
+ return grub_errno;
+
+ struct syslinux_menu *menuptr;
+ char *newname;
+ int depth = 0;
+
+ newname = get_read_filename (menu, filename);
+ if (!newname)
+ return grub_errno;
+ 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)
+ return err;
+ print_string (" not found\n");
+ }
+ if (err)
+ return err;
+ }
+ grub_free (newname);
+ grub_free (new_cwd);
+ grub_free (new_target_cwd);
+ return GRUB_ERR_NONE;
+}
+
+static grub_err_t
write_entry (struct output_buffer *outbuf,
struct syslinux_menu *menu,
struct syslinux_menuentry *curentry)
@@ -1240,6 +1308,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 */
@@ -1252,70 +1350,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:
--
1.9.1
signature.asc
Description: Digital signature
- Re: [bug #44238] Add support for menu.c32 and vesamenu.c32 in lib/syslinux_parse,
Lunar <=