[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/2] script: Add script language construct "builtin"
From: |
Glenn Washburn |
Subject: |
[PATCH 2/2] script: Add script language construct "builtin" |
Date: |
Sun, 21 Mar 2021 23:52:22 -0500 |
Provide a way to access builtin commands which have been hidden by a user-
defined function of the same name.
Signed-off-by: Glenn Washburn <development@efficientek.com>
---
Makefile.util.def | 6 ++++++
grub-core/script/execute.c | 27 ++++++++++++++++-----------
tests/grub_cmd_builtin.in | 37 +++++++++++++++++++++++++++++++++++++
3 files changed, 59 insertions(+), 11 deletions(-)
create mode 100644 tests/grub_cmd_builtin.in
diff --git a/Makefile.util.def b/Makefile.util.def
index 756158ffd..877784279 100644
--- a/Makefile.util.def
+++ b/Makefile.util.def
@@ -1043,6 +1043,12 @@ script = {
common = tests/grub_script_return.in;
};
+script = {
+ testcase;
+ name = grub_cmd_builtin;
+ common = tests/grub_cmd_builtin.in;
+};
+
script = {
testcase;
name = grub_cmd_regexp;
diff --git a/grub-core/script/execute.c b/grub-core/script/execute.c
index 6ce8850ff..1128b1ba5 100644
--- a/grub-core/script/execute.c
+++ b/grub-core/script/execute.c
@@ -931,7 +931,7 @@ grub_err_t
grub_script_execute_cmdline (struct grub_script_cmd *cmd)
{
struct grub_script_cmdline *cmdline = (struct grub_script_cmdline *) cmd;
- grub_command_t grubcmd;
+ grub_command_t grubcmd = 0;
grub_err_t ret = 0;
grub_script_function_t func = 0;
char errnobuf[18];
@@ -940,6 +940,7 @@ grub_script_execute_cmdline (struct grub_script_cmd *cmd)
unsigned int i;
char **args;
int invert;
+ int builtin;
struct grub_script_argv argv = { 0, 0, 0 };
/* Lookup the command. */
@@ -966,11 +967,10 @@ grub_script_execute_cmdline (struct grub_script_cmd *cmd)
cmdstring[cmdlen - 1] = '\0';
grub_verify_string (cmdstring, GRUB_VERIFY_COMMAND);
grub_free (cmdstring);
- invert = 0;
- argc = argv.argc - 1;
- args = argv.args + 1;
cmdname = argv.args[0];
- if (grub_strcmp (cmdname, "!") == 0)
+ invert = !grub_strcmp (cmdname, "!");
+ builtin = !grub_strcmp (cmdname, "builtin");
+ if (invert || builtin)
{
if (argv.argc < 2 || ! argv.args[1])
{
@@ -979,14 +979,19 @@ grub_script_execute_cmdline (struct grub_script_cmd *cmd)
N_("no command is specified"));
}
- invert = 1;
- argc = argv.argc - 2;
- args = argv.args + 2;
- cmdname = argv.args[1];
+ argc = argv.argc - (1 + invert + builtin);
+ args = argv.args + 1 + invert + builtin;
+ cmdname = argv.args[invert + builtin];
+ }
+ else
+ {
+ argc = argv.argc - 1;
+ args = argv.args + 1;
}
/* Allow user functions to override built in commands. */
- func = grub_script_function_find (cmdname);
- if (! func)
+ if (! builtin)
+ func = grub_script_function_find (cmdname);
+ if (! func || builtin)
{
grub_errno = GRUB_ERR_NONE;
diff --git a/tests/grub_cmd_builtin.in b/tests/grub_cmd_builtin.in
new file mode 100644
index 000000000..ec753e2df
--- /dev/null
+++ b/tests/grub_cmd_builtin.in
@@ -0,0 +1,37 @@
+#! @BUILD_SHEBANG@
+set -e
+
+. "@builddir@/grub-core/modinfo.sh"
+
+function hook_insmod {
+ @builddir@/grub-shell <<EOF
+insmod test
+function insmod {
+ if [ "\$1" != "parttool" ]; then
+ builtin insmod "\$1"
+ fi
+}
+insmod "$1"
+lsmod
+EOF
+}
+
+lsmod_original_file=`mktemp "${TMPDIR:-/tmp}/tmp.lsmod_original.XXXXXXXXXX"`
|| exit 1
+lsmod_hooked_file=`mktemp "${TMPDIR:-/tmp}/tmp.lsmod_hooked.XXXXXXXXXX"` ||
exit 1
+
+echo 'insmod test; insmod luks; lsmod' | @builddir@/grub-shell
>$lsmod_original_file
+hook_insmod luks >$lsmod_hooked_file
+
+if ! cmp $lsmod_original_file $lsmod_hooked_file; then
+ echo "lsmod output not identical:"
+ diff -u $lsmod_original_file $lsmod_hooked_file
+ exit 1
+fi
+
+
+hook_insmod parttool >$lsmod_hooked_file
+
+if grep -q ^parttool $lsmod_hooked_file; then
+ echo "parttool module was inserted, but should not have been"
+ exit 1
+fi
--
2.27.0