From: Raymund Will Subject: Introduce a 'read_file' sub-command. References: bsc#892852, bsc#891946 Patch-Mainline: not yet Needed to allow s390x-emu to be telecontrolled via LOADPARM. --- grub-core/commands/read.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) --- a/grub-core/commands/read.c +++ b/grub-core/commands/read.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -77,16 +78,49 @@ grub_cmd_read (grub_command_t cmd __attr return 0; } +static grub_err_t +grub_cmd_read_from_file (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) +{ + char *line; + int i = 0; + grub_file_t file; + + if (argc < 1) + return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("file name expected")); + if (argc < 2) + return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("variable name expected")); + file = grub_file_open (args[i++]); + if (! file) + return grub_errno; + while ( i < argc ) + { + line = grub_file_getline (file); + if ( !line ) + break; + grub_env_set (args[i++], line); + grub_free (line); + } + grub_file_close (file); + if (i != argc) + return GRUB_ERR_OUT_OF_RANGE; + return 0; +} + static grub_command_t cmd; +static grub_command_t cme; GRUB_MOD_INIT(read) { cmd = grub_register_command ("read", grub_cmd_read, N_("[ENVVAR]"), N_("Set variable with user input.")); + cme = grub_register_command ("read_file", grub_cmd_read_from_file, + N_("FILE ENVVAR [...]"), + N_("Set variable(s) with line(s) from FILE.")); } GRUB_MOD_FINI(read) { grub_unregister_command (cmd); + grub_unregister_command (cme); }