This conforms to the behavior of the -s option of the bash read command. docs/grub: Document the -s option for the read command.
Signed-off-by: Glenn Washburn <developm...@efficientek.com> --- docs/grub.texi | 5 +++-- grub-core/commands/read.c | 29 +++++++++++++++++++---------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/docs/grub.texi b/docs/grub.texi index eeb3118eb..5f5b67e3b 100644 --- a/docs/grub.texi +++ b/docs/grub.texi @@ -4924,10 +4924,11 @@ and the system will reboot. @node read @subsection read -@deffn Command read [var] +@deffn Command read [-s] [var] Read a line of input from the user. If an environment variable @var{var} is given, set that environment variable to the line of input that was read, -with no terminating newline. +with no terminating newline. If the parameter @option{-s} is used, enable +silent mode where input is not printed to the terminal. @end deffn diff --git a/grub-core/commands/read.c b/grub-core/commands/read.c index fe3e88b15..0fba58996 100644 --- a/grub-core/commands/read.c +++ b/grub-core/commands/read.c @@ -23,13 +23,19 @@ #include <grub/env.h> #include <grub/term.h> #include <grub/types.h> -#include <grub/command.h> +#include <grub/extcmd.h> #include <grub/i18n.h> GRUB_MOD_LICENSE ("GPLv3+"); +static const struct grub_arg_option options[] = + { + {"silent", 's', 0, N_("Do not echo input"), 0, 0}, + {0, 0, 0, 0, 0, 0} + }; + static char * -grub_getline (void) +grub_getline (int silent) { int i; char *line; @@ -48,7 +54,7 @@ grub_getline (void) break; line[i] = c; - if (grub_isprint (c)) + if (!silent && grub_isprint (c)) grub_printf ("%c", c); i++; tmp = grub_realloc (line, 1 + i + sizeof('\0')); @@ -65,9 +71,12 @@ grub_getline (void) } static grub_err_t -grub_cmd_read (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) +grub_cmd_read (grub_extcmd_context_t ctxt, int argc, char **args) { - char *line = grub_getline (); + + struct grub_arg_list *state = ctxt->state; + + char *line = grub_getline (state[0].set); if (! line) return grub_errno; if (argc > 0) @@ -77,16 +86,16 @@ grub_cmd_read (grub_command_t cmd __attribute__ ((unused)), int argc, char **arg return 0; } -static grub_command_t cmd; +static grub_extcmd_t cmd; GRUB_MOD_INIT(read) { - cmd = grub_register_command ("read", grub_cmd_read, - N_("[ENVVAR]"), - N_("Set variable with user input.")); + cmd = grub_register_extcmd ("read", grub_cmd_read, 0, + N_("[-s] [ENVVAR]"), + N_("Set variable with user input."), options); } GRUB_MOD_FINI(read) { - grub_unregister_command (cmd); + grub_unregister_extcmd (cmd); } -- 2.27.0 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel