diff options
author | Michael Brown <mcb30@ipxe.org> | 2010-11-21 16:39:36 +0000 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2010-11-21 20:38:39 +0000 |
commit | 17b337d4a8ae0a355a8e61e967f5015907590e9e (patch) | |
tree | fce8671e09fb9dabfcf3b2d7e2556dbb3aa86fa6 /src | |
parent | 2877af3ff585065a3b43630cbfd30ccd4f8d65c9 (diff) | |
download | ipxe-17b337d4a8ae0a355a8e61e967f5015907590e9e.tar.gz |
[autoboot] Use generic option-parsing library
Total saving: 32 bytes.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/hci/commands/autoboot_cmd.c | 121 | ||||
-rw-r--r-- | src/include/usr/autoboot.h | 2 | ||||
-rw-r--r-- | src/usr/autoboot.c | 8 |
3 files changed, 95 insertions, 36 deletions
diff --git a/src/hci/commands/autoboot_cmd.c b/src/hci/commands/autoboot_cmd.c index 17bd6bcfc..33788682e 100644 --- a/src/hci/commands/autoboot_cmd.c +++ b/src/hci/commands/autoboot_cmd.c @@ -1,53 +1,110 @@ +/* + * Copyright (C) 2010 Michael Brown <mbrown@fensystems.co.uk>. + * + * 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 <stdio.h> +#include <getopt.h> #include <ipxe/command.h> +#include <ipxe/parseopt.h> #include <ipxe/netdevice.h> #include <usr/autoboot.h> FILE_LICENCE ( GPL2_OR_LATER ); +/** @file + * + * Booting commands + * + */ + +/** "autoboot" options */ +struct autoboot_options {}; + +/** "autoboot" option list */ +static struct option_descriptor autoboot_opts[] = {}; + +/** "autoboot" command descriptor */ +static struct command_descriptor autoboot_cmd = + COMMAND_DESC ( struct autoboot_options, autoboot_opts, 0, 0, + "", + "Attempt to boot the system" ); + +/** + * "autoboot" command + * + * @v argc Argument count + * @v argv Argument list + * @ret rc Return status code + */ static int autoboot_exec ( int argc, char **argv ) { + struct autoboot_options opts; + int rc; - if ( argc != 1 ) { - printf ( "Usage:\n" - " %s\n" - "\n" - "Attempts to boot the system\n", - argv[0] ); - return 1; - } + /* Parse options */ + if ( ( rc = parse_options ( argc, argv, &autoboot_cmd, &opts ) ) != 0 ) + return rc; - autoboot(); + /* Try to boot */ + if ( ( rc = autoboot() ) != 0 ) + return rc; - /* Can never return success by definition */ - return 1; + return 0; } +/** "netboot" options */ +struct netboot_options {}; + +/** "netboot" option list */ +static struct option_descriptor netboot_opts[] = {}; + +/** "netboot" command descriptor */ +static struct command_descriptor netboot_cmd = + COMMAND_DESC ( struct netboot_options, netboot_opts, 1, 1, + "<interface>", + "Attempt to boot the system from <interface>" ); + +/** + * "netboot" command + * + * @v argc Argument count + * @v argv Argument list + * @ret rc Return status code + */ static int netboot_exec ( int argc, char **argv ) { - const char *netdev_name; + struct netboot_options opts; struct net_device *netdev; + int rc; + + /* Parse options */ + if ( ( rc = parse_options ( argc, argv, &netboot_cmd, &opts ) ) != 0 ) + return rc; + + /* Parse interface */ + if ( ( rc = parse_netdev ( argv[optind], &netdev ) ) != 0 ) + return rc; + + /* Try to boot */ + if ( ( rc = netboot ( netdev ) ) != 0 ) + return rc; - if ( argc != 2 ) { - printf ( "Usage:\n" - " %s <interface>\n" - "\n" - "Attempts to boot the system from <interface>\n", - argv[0] ); - return 1; - } - netdev_name = argv[1]; - - netdev = find_netdev ( netdev_name ); - if ( ! netdev ) { - printf ( "%s: no such interface\n", netdev_name ); - return 1; - } - - netboot ( netdev ); - - /* Can never return success by definition */ - return 1; + return 0; } +/** Booting commands */ struct command autoboot_commands[] __command = { { .name = "autoboot", diff --git a/src/include/usr/autoboot.h b/src/include/usr/autoboot.h index 46e3b4816..e9abf833f 100644 --- a/src/include/usr/autoboot.h +++ b/src/include/usr/autoboot.h @@ -15,7 +15,7 @@ struct net_device; extern int shutdown_exit_flags; extern int netboot ( struct net_device *netdev ); -extern void autoboot ( void ); +extern int autoboot ( void ); extern int boot_next_server_and_filename ( struct in_addr next_server, const char *filename ); extern int boot_root_path ( const char *root_path ); diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c index d87e36270..c7492ea7c 100644 --- a/src/usr/autoboot.c +++ b/src/usr/autoboot.c @@ -293,22 +293,24 @@ static void close_all_netdevs ( void ) { /** * Boot the system */ -void autoboot ( void ) { +int autoboot ( void ) { struct net_device *boot_netdev; struct net_device *netdev; + int rc = -ENODEV; /* If we have an identifable boot device, try that first */ close_all_netdevs(); if ( ( boot_netdev = find_boot_netdev() ) ) - netboot ( boot_netdev ); + rc = netboot ( boot_netdev ); /* If that fails, try booting from any of the other devices */ for_each_netdev ( netdev ) { if ( netdev == boot_netdev ) continue; close_all_netdevs(); - netboot ( netdev ); + rc = netboot ( netdev ); } printf ( "No more network devices\n" ); + return rc; } |