]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[script] Add "prompt" command
authorMichael Brown <mcb30@ipxe.org>
Mon, 7 Mar 2011 18:32:30 +0000 (18:32 +0000)
committerMichael Brown <mcb30@ipxe.org>
Mon, 7 Mar 2011 19:53:58 +0000 (19:53 +0000)
The "prompt" command exposes the prompt() function, allowing a script
to prompt the user for a keypress and take action depending on the
result.  For example

  #!ipxe

  prompt -k 0x197e -t 2000 Press F12 to boot from network... || exit
  autoboot

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/image/script.c

index 6069d80f76d7971beb139c51700d530546592034..b819693d3f066d9e663fd70ddb7abe9406e7b3b9 100644 (file)
@@ -35,6 +35,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #include <ipxe/parseopt.h>
 #include <ipxe/image.h>
 #include <ipxe/shell.h>
+#include <usr/prompt.h>
 
 /** Currently running script
  *
@@ -288,3 +289,69 @@ struct command goto_command __command = {
        .name = "goto",
        .exec = goto_exec,
 };
+
+/** "prompt" options */
+struct prompt_options {
+       /** Key to wait for */
+       unsigned int key;
+       /** Timeout */
+       unsigned int timeout;
+};
+
+/** "prompt" option list */
+static struct option_descriptor prompt_opts[] = {
+       OPTION_DESC ( "key", 'k', required_argument,
+                     struct prompt_options, key, parse_integer ),
+       OPTION_DESC ( "timeout", 't', required_argument,
+                     struct prompt_options, timeout, parse_integer ),
+};
+
+/** "prompt" command descriptor */
+static struct command_descriptor prompt_cmd =
+       COMMAND_DESC ( struct prompt_options, prompt_opts, 0, MAX_ARGUMENTS,
+                      "[--key <key>] [--timeout <timeout>] [<text>]" );
+
+/**
+ * "prompt" command
+ *
+ * @v argc             Argument count
+ * @v argv             Argument list
+ * @ret rc             Return status code
+ */
+static int prompt_exec ( int argc, char **argv ) {
+       struct prompt_options opts;
+       char *text;
+       int rc;
+
+       /* Parse options */
+       if ( ( rc = parse_options ( argc, argv, &prompt_cmd, &opts ) ) != 0 )
+               goto err_parse;
+
+       /* Parse prompt text */
+       text = concat_args ( &argv[optind] );
+       if ( ! text ) {
+               rc = -ENOMEM;
+               goto err_concat;
+       }
+
+       /* Display prompt and wait for key */
+       if ( ( rc = prompt ( text, opts.timeout, opts.key ) ) != 0 )
+               goto err_prompt;
+
+       /* Free prompt text */
+       free ( text );
+
+       return 0;
+
+ err_prompt:
+       free ( text );
+ err_concat:
+ err_parse:
+       return rc;
+}
+
+/** "prompt" command */
+struct command prompt_command __command = {
+       .name = "prompt",
+       .exec = prompt_exec,
+};