diff --git a/src/hci/commands/autoboot_cmd.c b/src/hci/commands/autoboot_cmd.c index 17bd6bcf..33788682 100644 --- a/src/hci/commands/autoboot_cmd.c +++ b/src/hci/commands/autoboot_cmd.c @@ -1,53 +1,110 @@ +/* + * 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 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, + "", + "Attempt to boot the system from " ); + +/** + * "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; - if ( argc != 2 ) { - printf ( "Usage:\n" - " %s \n" - "\n" - "Attempts to boot the system from \n", - argv[0] ); - return 1; - } - netdev_name = argv[1]; + /* Parse options */ + if ( ( rc = parse_options ( argc, argv, &netboot_cmd, &opts ) ) != 0 ) + return rc; - netdev = find_netdev ( netdev_name ); - if ( ! netdev ) { - printf ( "%s: no such interface\n", netdev_name ); - return 1; - } + /* Parse interface */ + if ( ( rc = parse_netdev ( argv[optind], &netdev ) ) != 0 ) + return rc; - netboot ( netdev ); + /* Try to boot */ + if ( ( rc = netboot ( netdev ) ) != 0 ) + return rc; - /* 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 46e3b481..e9abf833 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 d87e3627..c7492ea7 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; }