diff options
author | Francis Rowe <info@gluglug.org.uk> | 2015-03-17 16:58:01 +0000 |
---|---|---|
committer | Francis Rowe <info@gluglug.org.uk> | 2015-03-17 17:29:34 +0000 |
commit | d4a3ecd091d45611a4196a55b43139fad2275238 (patch) | |
tree | 4dd6a4b62b79d8b45864bca0d844951d2d35ecb4 /resources/grub/patch/0002-lib-syslinux_parse-add-support-for-vesa-menu.c32.patch | |
parent | 1c18bf754c4e80f43962310a7f30e0faebf55b62 (diff) | |
download | librebootfr-d4a3ecd091d45611a4196a55b43139fad2275238.tar.gz librebootfr-d4a3ecd091d45611a4196a55b43139fad2275238.zip |
GRUB: add vesamenu.c32 support (fixes tails ISOLINUX menu)
Debian ISOLINUX menu is still broken (syslinux_configfile -i just
puts you back to the main screen but with the Debian background).
(same issue on gnewsense)
Diffstat (limited to 'resources/grub/patch/0002-lib-syslinux_parse-add-support-for-vesa-menu.c32.patch')
-rw-r--r-- | resources/grub/patch/0002-lib-syslinux_parse-add-support-for-vesa-menu.c32.patch | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/resources/grub/patch/0002-lib-syslinux_parse-add-support-for-vesa-menu.c32.patch b/resources/grub/patch/0002-lib-syslinux_parse-add-support-for-vesa-menu.c32.patch new file mode 100644 index 00000000..69bdde52 --- /dev/null +++ b/resources/grub/patch/0002-lib-syslinux_parse-add-support-for-vesa-menu.c32.patch @@ -0,0 +1,209 @@ +From 191aeee1b67ff30d6c868320a51cb9fb766874be Mon Sep 17 00:00:00 2001 +From: Lunar <lunar@torproject.org> +Date: Fri, 13 Feb 2015 22:08:11 +0100 +Subject: [PATCH] lib/syslinux_parse: add support for (vesa)menu.c32 + +Fixes Savannah bug #44238. +--- + 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: +-- +1.9.1 + |