* 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:
Andrey Borzenkov 2013-06-07 18:36:42 +02:00 committed by Vladimir 'phcoder' Serbinenko
parent 63c2984922
commit 593e430cd6
7 changed files with 50 additions and 13 deletions

View file

@ -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

View file

@ -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

View file

@ -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;

View file

@ -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 ();

View file

@ -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)

View file

@ -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;
} }

View file

@ -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[]);