aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2010-11-21 16:39:36 +0000
committerMichael Brown <mcb30@ipxe.org>2010-11-21 20:38:39 +0000
commit17b337d4a8ae0a355a8e61e967f5015907590e9e (patch)
treefce8671e09fb9dabfcf3b2d7e2556dbb3aa86fa6 /src
parent2877af3ff585065a3b43630cbfd30ccd4f8d65c9 (diff)
downloadipxe-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.c121
-rw-r--r--src/include/usr/autoboot.h2
-rw-r--r--src/usr/autoboot.c8
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;
}