From: Raymund Will <rw@suse.com>
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 <grub/dl.h>
 #include <grub/misc.h>
 #include <grub/mm.h>
+#include <grub/normal.h>
 #include <grub/env.h>
 #include <grub/term.h>
 #include <grub/types.h>
@@ -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,
