From 9e9c9adf1058c77cc7df5651221dd74de3a3282c Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sun, 21 Nov 2010 16:57:58 +0000 Subject: [PATCH] [settings] Use generic option-parsing library Total cost: 75 bytes. Signed-off-by: Michael Brown --- src/hci/commands/config_cmd.c | 103 +++++++++++++++++++----- src/hci/commands/nvo_cmd.c | 146 ++++++++++++++++++++++++++++------ src/include/ipxe/errfile.h | 1 + 3 files changed, 206 insertions(+), 44 deletions(-) diff --git a/src/hci/commands/config_cmd.c b/src/hci/commands/config_cmd.c index 53b10f91..84c2e32a 100644 --- a/src/hci/commands/config_cmd.c +++ b/src/hci/commands/config_cmd.c @@ -1,38 +1,103 @@ +/* + * Copyright (C) 2010 Michael Brown . + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + #include #include +#include +#include #include +#include #include #include FILE_LICENCE ( GPL2_OR_LATER ); -static int config_exec ( int argc, char **argv ) { - char *settings_name; - struct settings *settings; - int rc; +/** @file + * + * Configuration UI commands + * + */ - if ( argc > 2 ) { - printf ( "Usage: %s [scope]\n" - "Opens the option configuration console\n", argv[0] ); - return 1; - } +/** "config" options */ +struct config_options {}; - settings_name = ( ( argc == 2 ) ? argv[1] : "" ); - settings = find_settings ( settings_name ); - if ( ! settings ) { - printf ( "No such scope \"%s\"\n", settings_name ); - return 1; - } +/** "config" option list */ +static struct option_descriptor config_opts[] = {}; - if ( ( rc = settings_ui ( settings ) ) != 0 ) { - printf ( "Could not save settings: %s\n", - strerror ( rc ) ); - return 1; +/** "config" command descriptor */ +static struct command_descriptor config_cmd = + COMMAND_DESC ( struct config_options, config_opts, 0, 1, + "[]", + "Open the option configuration console" ); + +/** + * Parse settings scope name + * + * @v text Text + * @ret value Integer value + * @ret rc Return status code + */ +static int parse_settings ( const char *text, struct settings **value ) { + + /* Sanity check */ + assert ( text != NULL ); + + /* Parse scope name */ + *value = find_settings ( text ); + if ( ! *value ) { + printf ( "\"%s\": no such scope\n", text ); + return -EINVAL; } return 0; } +/** + * "config" command + * + * @v argc Argument count + * @v argv Argument list + * @ret rc Return status code + */ +static int config_exec ( int argc, char **argv ) { + struct config_options opts; + struct settings *settings; + int rc; + + /* Parse options */ + if ( ( rc = parse_options ( argc, argv, &config_cmd, &opts ) ) != 0 ) + return rc; + + /* Parse settings option, if present */ + if ( ( rc = parse_settings ( ( ( optind < argc ) ? argv[optind] : "" ), + &settings ) ) != 0 ) + return rc; + + /* Run settings UI */ + if ( ( rc = settings_ui ( settings ) ) != 0 ) { + printf ( "Could not save settings: %s\n", strerror ( rc ) ); + return rc; + } + + return 0; +} + +/** Configuration UI commands */ struct command config_command __command = { .name = "config", .exec = config_exec, diff --git a/src/hci/commands/nvo_cmd.c b/src/hci/commands/nvo_cmd.c index cebb8949..87bdd8a1 100644 --- a/src/hci/commands/nvo_cmd.c +++ b/src/hci/commands/nvo_cmd.c @@ -1,3 +1,21 @@ +/* + * Copyright (C) 2010 Michael Brown . + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + #include #include #include @@ -6,42 +24,96 @@ #include #include #include +#include FILE_LICENCE ( GPL2_OR_LATER ); +/** @file + * + * Non-volatile option commands + * + */ + +/** "show" options */ +struct show_options {}; + +/** "show" option list */ +static struct option_descriptor show_opts[] = {}; + +/** "show" command descriptor */ +static struct command_descriptor show_cmd = + COMMAND_DESC ( struct show_options, show_opts, 1, 1, + "", "" ); + +/** + * "show" command + * + * @v argc Argument count + * @v argv Argument list + * @ret rc Return status code + */ static int show_exec ( int argc, char **argv ) { + struct show_options opts; + const char *name; char buf[256]; int rc; - if ( argc != 2 ) { - printf ( "Syntax: %s \n", argv[0] ); - return 1; - } + /* Parse options */ + if ( ( rc = parse_options ( argc, argv, &show_cmd, &opts ) ) != 0 ) + return rc; - if ( ( rc = fetchf_named_setting ( argv[1], buf, - sizeof ( buf ) ) ) < 0 ){ + /* Parse setting name */ + name = argv[optind]; + + /* Fetch setting */ + if ( ( rc = fetchf_named_setting ( name, buf, + sizeof ( buf ) ) ) < 0 ) { printf ( "Could not find \"%s\": %s\n", - argv[1], strerror ( rc ) ); - return 1; + name, strerror ( rc ) ); + return rc; } - printf ( "%s = %s\n", argv[1], buf ); + /* Print setting value */ + printf ( "%s = %s\n", name, buf ); + return 0; } +/** "set" options */ +struct set_options {}; + +/** "set" option list */ +static struct option_descriptor set_opts[] = {}; + +/** "set" command descriptor */ +static struct command_descriptor set_cmd = + COMMAND_DESC ( struct set_options, set_opts, 2, MAX_ARGUMENTS, + " ", "" ); + +/** + * "set" command + * + * @v argc Argument count + * @v argv Argument list + * @ret rc Return status code + */ static int set_exec ( int argc, char **argv ) { + struct set_options opts; + const char *name; size_t len; int i; int rc; - if ( argc < 3 ) { - printf ( "Syntax: %s \n", argv[0] ); - return 1; - } + /* Parse options */ + if ( ( rc = parse_options ( argc, argv, &set_cmd, &opts ) ) != 0 ) + return rc; + + /* Parse setting name */ + name = argv[optind]; /* Determine total length of command line */ len = 1; /* NUL */ - for ( i = 2 ; i < argc ; i++ ) + for ( i = optind + 1 ; i < argc ; i++ ) len += ( 1 /* possible space */ + strlen ( argv[i] ) ); { @@ -50,39 +122,63 @@ static int set_exec ( int argc, char **argv ) { /* Assemble command line */ buf[0] = '\0'; - for ( i = 2 ; i < argc ; i++ ) { + for ( i = optind + 1 ; i < argc ; i++ ) { ptr += sprintf ( ptr, "%s%s", ( buf[0] ? " " : "" ), argv[i] ); } assert ( ptr < ( buf + len ) ); - if ( ( rc = storef_named_setting ( argv[1], buf ) ) != 0 ) { + if ( ( rc = storef_named_setting ( name, buf ) ) != 0 ) { printf ( "Could not set \"%s\"=\"%s\": %s\n", - argv[1], buf, strerror ( rc ) ); - return 1; + name, buf, strerror ( rc ) ); + return rc; } } return 0; } +/** "clear" options */ +struct clear_options {}; + +/** "clear" option list */ +static struct option_descriptor clear_opts[] = {}; + +/** "clear" command descriptor */ +static struct command_descriptor clear_cmd = + COMMAND_DESC ( struct clear_options, clear_opts, 1, 1, + "", "" ); + +/** + * "clear" command + * + * @v argc Argument count + * @v argv Argument list + * @ret rc Return status code + */ static int clear_exec ( int argc, char **argv ) { + struct clear_options opts; + const char *name; int rc; - if ( argc != 2 ) { - printf ( "Syntax: %s \n", argv[0] ); - return 1; - } + /* Parse options */ + if ( ( rc = parse_options ( argc, argv, &clear_cmd, &opts ) ) != 0 ) + return rc; - if ( ( rc = delete_named_setting ( argv[1] ) ) != 0 ) { + /* Parse setting name */ + name = argv[optind]; + + /* Clear setting */ + if ( ( rc = delete_named_setting ( name ) ) != 0 ) { printf ( "Could not clear \"%s\": %s\n", - argv[1], strerror ( rc ) ); - return 1; + name, strerror ( rc ) ); + return rc; } return 0; } +/** Non-volatile option commands */ struct command nvo_commands[] __command = { { .name = "show", diff --git a/src/include/ipxe/errfile.h b/src/include/ipxe/errfile.h index 7b415928..5b989ed2 100644 --- a/src/include/ipxe/errfile.h +++ b/src/include/ipxe/errfile.h @@ -228,6 +228,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #define ERRFILE_iwmgmt ( ERRFILE_OTHER | 0x00190000 ) #define ERRFILE_linux_smbios ( ERRFILE_OTHER | 0x001a0000 ) #define ERRFILE_lotest ( ERRFILE_OTHER | 0x001b0000 ) +#define ERRFILE_config_cmd ( ERRFILE_OTHER | 0x001c0000 ) /** @} */