syslinux: Support {vesa,}menu.c32.
This commit is contained in:
parent
1a33de8b56
commit
c9ee9bedef
1 changed files with 107 additions and 58 deletions
|
@ -839,6 +839,82 @@ simplify_filename (char *str)
|
||||||
*optr = '\0';
|
*optr = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
static grub_err_t
|
||||||
write_entry (struct output_buffer *outbuf,
|
write_entry (struct output_buffer *outbuf,
|
||||||
struct syslinux_menu *menu,
|
struct syslinux_menu *menu,
|
||||||
|
@ -1227,6 +1303,36 @@ write_entry (struct output_buffer *outbuf,
|
||||||
break;
|
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: gdb, GFXBoot, Hdt, Ifcpu, Ifplop, Kbdmap,
|
||||||
FIXME: Linux, Lua, Meminfo, rosh, Sanbboot */
|
FIXME: Linux, Lua, Meminfo, rosh, Sanbboot */
|
||||||
|
|
||||||
|
@ -1239,70 +1345,13 @@ write_entry (struct output_buffer *outbuf,
|
||||||
}
|
}
|
||||||
case KERNEL_CONFIG:
|
case KERNEL_CONFIG:
|
||||||
{
|
{
|
||||||
char *new_cwd, *new_target_cwd;
|
|
||||||
const char *ap;
|
const char *ap;
|
||||||
ap = curentry->append;
|
ap = curentry->append;
|
||||||
if (!ap)
|
if (!ap)
|
||||||
ap = curentry->argument;
|
ap = curentry->argument;
|
||||||
if (!ap)
|
if (!ap)
|
||||||
ap = "";
|
ap = "";
|
||||||
new_cwd = get_read_filename (menu, ap);
|
print_config (outbuf, menu, curentry->kernel_file, 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);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case KERNEL_NO_KERNEL:
|
case KERNEL_NO_KERNEL:
|
||||||
|
|
Loading…
Add table
Reference in a new issue