* grub-core/script/execute.c (grub_script_execute_sourcecode): Split
off new function grub_script_execute_new_scope. Change callers to use either of them as appropriate. * grub-core/commands/eval.c: New command eval. * docs/grub.texi (Commands): Document it.
This commit is contained in:
parent
63c2984922
commit
593e430cd6
7 changed files with 50 additions and 13 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2013-06-07 Andrey Borzenkov <arvidjaar@gmail.com>
|
||||||
|
|
||||||
|
* grub-core/script/execute.c (grub_script_execute_sourcecode): Split
|
||||||
|
off new function grub_script_execute_new_scope. Change callers to use
|
||||||
|
either of them as appropriate.
|
||||||
|
* grub-core/commands/eval.c: New command eval.
|
||||||
|
* docs/grub.texi (Commands): Document it.
|
||||||
|
|
||||||
2013-06-07 Andrey Borzenkov <arvidjaar@gmail.com>
|
2013-06-07 Andrey Borzenkov <arvidjaar@gmail.com>
|
||||||
|
|
||||||
* grub-core/kern/corecmd.c (grub_core_cmd_set): Use grub_env_get
|
* grub-core/kern/corecmd.c (grub_core_cmd_set): Use grub_env_get
|
||||||
|
|
|
@ -3435,6 +3435,7 @@ you forget a command, you can run the command @command{help}
|
||||||
* date:: Display or set current date and time
|
* date:: Display or set current date and time
|
||||||
* drivemap:: Map a drive to another
|
* drivemap:: Map a drive to another
|
||||||
* echo:: Display a line of text
|
* echo:: Display a line of text
|
||||||
|
* eval:: Evaluate agruments as GRUB commands
|
||||||
* export:: Export an environment variable
|
* export:: Export an environment variable
|
||||||
* false:: Do nothing, unsuccessfully
|
* false:: Do nothing, unsuccessfully
|
||||||
* gettext:: Translate a string
|
* gettext:: Translate a string
|
||||||
|
@ -3812,6 +3813,15 @@ character will print that character.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
|
@node eval
|
||||||
|
@subsection eval
|
||||||
|
|
||||||
|
@deffn Command eval string ...
|
||||||
|
Concatenate arguments together using single space as separator and evaluate
|
||||||
|
result as sequence of GRUB commands.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
@node export
|
@node export
|
||||||
@subsection export
|
@subsection export
|
||||||
|
|
||||||
|
|
|
@ -703,6 +703,11 @@ module = {
|
||||||
common = commands/echo.c;
|
common = commands/echo.c;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
module = {
|
||||||
|
name = eval;
|
||||||
|
common = commands/eval.c;
|
||||||
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
name = extcmd;
|
name = extcmd;
|
||||||
common = commands/extcmd.c;
|
common = commands/extcmd.c;
|
||||||
|
|
|
@ -245,7 +245,7 @@ grub_menu_execute_entry(grub_menu_entry_t entry, int auto_boot)
|
||||||
else
|
else
|
||||||
grub_env_unset ("default");
|
grub_env_unset ("default");
|
||||||
|
|
||||||
grub_script_execute_sourcecode (entry->sourcecode, entry->argc, entry->args);
|
grub_script_execute_new_scope (entry->sourcecode, entry->argc, entry->args);
|
||||||
|
|
||||||
if (errs_before != grub_err_printed_errors)
|
if (errs_before != grub_err_printed_errors)
|
||||||
grub_wait_after_message ();
|
grub_wait_after_message ();
|
||||||
|
|
|
@ -1181,7 +1181,7 @@ run (struct screen *screen)
|
||||||
}
|
}
|
||||||
script[size] = '\0';
|
script[size] = '\0';
|
||||||
}
|
}
|
||||||
grub_script_execute_sourcecode (script, 0, dummy);
|
grub_script_execute_new_scope (script, 0, dummy);
|
||||||
grub_free (script);
|
grub_free (script);
|
||||||
|
|
||||||
if (errs_before != grub_err_printed_errors)
|
if (errs_before != grub_err_printed_errors)
|
||||||
|
|
|
@ -856,19 +856,10 @@ grub_script_execute_sourcecode_getline (char **line,
|
||||||
|
|
||||||
/* Execute a source script. */
|
/* Execute a source script. */
|
||||||
grub_err_t
|
grub_err_t
|
||||||
grub_script_execute_sourcecode (const char *source, int argc, char **args)
|
grub_script_execute_sourcecode (const char *source)
|
||||||
{
|
{
|
||||||
grub_err_t ret = 0;
|
grub_err_t ret = 0;
|
||||||
struct grub_script *parsed_script;
|
struct grub_script *parsed_script;
|
||||||
struct grub_script_scope new_scope;
|
|
||||||
struct grub_script_scope *old_scope;
|
|
||||||
|
|
||||||
new_scope.argv.argc = argc;
|
|
||||||
new_scope.argv.args = args;
|
|
||||||
new_scope.flags = 0;
|
|
||||||
|
|
||||||
old_scope = scope;
|
|
||||||
scope = &new_scope;
|
|
||||||
|
|
||||||
while (source)
|
while (source)
|
||||||
{
|
{
|
||||||
|
@ -880,13 +871,35 @@ grub_script_execute_sourcecode (const char *source, int argc, char **args)
|
||||||
if (! parsed_script)
|
if (! parsed_script)
|
||||||
{
|
{
|
||||||
ret = grub_errno;
|
ret = grub_errno;
|
||||||
|
grub_free (line);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = grub_script_execute (parsed_script);
|
ret = grub_script_execute (parsed_script);
|
||||||
|
grub_script_free (parsed_script);
|
||||||
grub_free (line);
|
grub_free (line);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Execute a source script in new scope. */
|
||||||
|
grub_err_t
|
||||||
|
grub_script_execute_new_scope (const char *source, int argc, char **args)
|
||||||
|
{
|
||||||
|
grub_err_t ret = 0;
|
||||||
|
struct grub_script_scope new_scope;
|
||||||
|
struct grub_script_scope *old_scope;
|
||||||
|
|
||||||
|
new_scope.argv.argc = argc;
|
||||||
|
new_scope.argv.args = args;
|
||||||
|
new_scope.flags = 0;
|
||||||
|
|
||||||
|
old_scope = scope;
|
||||||
|
scope = &new_scope;
|
||||||
|
|
||||||
|
ret = grub_script_execute_sourcecode (source);
|
||||||
|
|
||||||
scope = old_scope;
|
scope = old_scope;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -329,7 +329,8 @@ grub_err_t grub_script_execute_cmdwhile (struct grub_script_cmd *cmd);
|
||||||
|
|
||||||
/* Execute any GRUB pre-parsed command or script. */
|
/* Execute any GRUB pre-parsed command or script. */
|
||||||
grub_err_t grub_script_execute (struct grub_script *script);
|
grub_err_t grub_script_execute (struct grub_script *script);
|
||||||
grub_err_t grub_script_execute_sourcecode (const char *source, int argc, char **args);
|
grub_err_t grub_script_execute_sourcecode (const char *source);
|
||||||
|
grub_err_t grub_script_execute_new_scope (const char *source, int argc, char **args);
|
||||||
|
|
||||||
/* Break command for loops. */
|
/* Break command for loops. */
|
||||||
grub_err_t grub_script_break (grub_command_t cmd, int argc, char *argv[]);
|
grub_err_t grub_script_break (grub_command_t cmd, int argc, char *argv[]);
|
||||||
|
|
Loading…
Reference in a new issue