/* * 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 #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; /* Parse options */ if ( ( rc = parse_options ( argc, argv, &show_cmd, &opts ) ) != 0 ) return rc; /* 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", name, strerror ( rc ) ); return rc; } /* 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; /* 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 = optind + 1 ; i < argc ; i++ ) len += ( 1 /* possible space */ + strlen ( argv[i] ) ); { char buf[len]; char *ptr = buf; /* Assemble command line */ buf[0] = '\0'; 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 ( name, buf ) ) != 0 ) { printf ( "Could not set \"%s\"=\"%s\": %s\n", 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; /* Parse options */ if ( ( rc = parse_options ( argc, argv, &clear_cmd, &opts ) ) != 0 ) return rc; /* Parse setting name */ name = argv[optind]; /* Clear setting */ if ( ( rc = delete_named_setting ( name ) ) != 0 ) { printf ( "Could not clear \"%s\": %s\n", name, strerror ( rc ) ); return rc; } return 0; } /** Non-volatile option commands */ struct command nvo_commands[] __command = { { .name = "show", .exec = show_exec, }, { .name = "set", .exec = set_exec, }, { .name = "clear", .exec = clear_exec, }, };