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. v2: Added GRUB_FILE_TYPE_READ_ENVVAR as file type by read_file sub-command tracked by verifier framework. --- 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 @@ -88,16 +89,49 @@ 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++], GRUB_FILE_TYPE_READ_ENVVAR); + 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_extcmd_t cmd; +static grub_command_t cme; GRUB_MOD_INIT(read) { cmd = grub_register_extcmd ("read", grub_cmd_read, 0, N_("[-s] [ENVVAR]"), N_("Set variable with user input."), options); + 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_extcmd (cmd); + grub_unregister_command (cme); } --- a/include/grub/file.h +++ b/include/grub/file.h @@ -126,6 +126,7 @@ GRUB_FILE_TYPE_FS_SEARCH, GRUB_FILE_TYPE_AUDIO, GRUB_FILE_TYPE_VBE_DUMP, + GRUB_FILE_TYPE_READ_ENVVAR, GRUB_FILE_TYPE_LOADENV, GRUB_FILE_TYPE_SAVEENV,