From e87fc5e74346d7dc6f164e6d6931f938aaabcdb9 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 7 Mar 2011 18:32:30 +0000 Subject: [script] Add "prompt" command 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 --- src/image/script.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) (limited to 'src/image') diff --git a/src/image/script.c b/src/image/script.c index 6069d80f..b819693d 100644 --- a/src/image/script.c +++ b/src/image/script.c @@ -35,6 +35,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include #include #include +#include /** 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 ] [--timeout ] []" ); + +/** + * "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, +}; -- cgit v1.2.3-55-g7522