Basic menuentry-retrieveing jail

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2010-09-16 23:48:32 +02:00
parent cb731b5e81
commit 7756d44436
11 changed files with 115 additions and 30 deletions

View file

@ -52,8 +52,8 @@ grub_env_set_menu (grub_menu_t nmenu)
current_menu->menu = nmenu;
}
grub_err_t
grub_env_context_open (int export)
static grub_err_t
grub_env_new_context (int export_all)
{
struct grub_env_context *context;
int i;
@ -78,23 +78,36 @@ grub_env_context_open (int export)
struct grub_env_var *var;
for (var = context->prev->vars[i]; var; var = var->next)
{
if (export && var->global)
{
if (grub_env_set (var->name, var->value) != GRUB_ERR_NONE)
{
grub_env_context_close ();
return grub_errno;
}
grub_env_export (var->name);
grub_register_variable_hook (var->name, var->read_hook, var->write_hook);
}
}
if (var->global || export_all)
{
if (grub_env_set (var->name, var->value) != GRUB_ERR_NONE)
{
grub_env_context_close ();
return grub_errno;
}
grub_env_export (var->name);
grub_register_variable_hook (var->name, var->read_hook, var->write_hook);
}
}
return GRUB_ERR_NONE;
}
grub_err_t
grub_env_context_open (void)
{
return grub_env_new_context (0);
}
int grub_jail_level = 0;
grub_err_t
grub_env_jail_open (int source)
{
grub_jail_level++;
return grub_env_new_context (source);
}
grub_err_t
grub_env_context_close (void)
{
@ -132,6 +145,36 @@ grub_env_context_close (void)
return GRUB_ERR_NONE;
}
grub_err_t
grub_env_jail_close (int source)
{
grub_menu_t menu, menu2;
grub_menu_entry_t *last;
grub_err_t err;
if (source)
{
menu = grub_env_get_menu ();
grub_env_unset_menu ();
}
err = grub_env_context_close ();
if (source)
{
menu2 = grub_env_get_menu ();
last = &menu2->entry_list;
while (*last)
last = &(*last)->next;
*last = menu->entry_list;
menu2->size += menu->size;
}
grub_jail_level--;
return err;
}
grub_err_t
grub_env_export (const char *name)
{