From b08a6f530042cfc0f8be2209cde9fab3d0ab9143 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Tue, 4 Mar 2008 17:59:26 +0000 Subject: [PATCH] [Command] Add "sanboot" command. --- src/config.h | 1 + src/core/config.c | 3 ++ src/hci/commands/sanboot_cmd.c | 68 ++++++++++++++++++++++++++++++++++ src/include/usr/autoboot.h | 1 + src/usr/autoboot.c | 2 +- 5 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 src/hci/commands/sanboot_cmd.c diff --git a/src/config.h b/src/config.h index 9aa9e8fd..e5d8b114 100644 --- a/src/config.h +++ b/src/config.h @@ -125,6 +125,7 @@ #define ROUTE_CMD /* Routing table management commands */ #define IMAGE_CMD /* Image management commands */ #define DHCP_CMD /* DHCP management commands */ +#define SANBOOT_CMD /* SAN boot commands */ /* @END general.h */ diff --git a/src/core/config.c b/src/core/config.c index d5accecf..e7db221a 100644 --- a/src/core/config.c +++ b/src/core/config.c @@ -175,6 +175,9 @@ REQUIRE_OBJECT ( image_cmd ); #ifdef DHCP_CMD REQUIRE_OBJECT ( dhcp_cmd ); #endif +#ifdef SANBOOT_CMD +REQUIRE_OBJECT ( sanboot_cmd ); +#endif /* * Drag in miscellaneous objects diff --git a/src/hci/commands/sanboot_cmd.c b/src/hci/commands/sanboot_cmd.c new file mode 100644 index 00000000..d5bbfb85 --- /dev/null +++ b/src/hci/commands/sanboot_cmd.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include + +/** + * "sanboot" command syntax message + * + * @v argv Argument list + */ +static void sanboot_syntax ( char **argv ) { + printf ( "Usage:\n" + " %s \n" + "\n" + "Boot from SAN target\n", + argv[0] ); +} + +/** + * The "sanboot" command + * + * @v argc Argument count + * @v argv Argument list + * @ret rc Exit code + */ +static int sanboot_exec ( int argc, char **argv ) { + static struct option longopts[] = { + { "help", 0, NULL, 'h' }, + { NULL, 0, NULL, 0 }, + }; + const char *root_path = NULL; + int c; + int rc; + + /* Parse options */ + while ( ( c = getopt_long ( argc, argv, "h", longopts, NULL ) ) >= 0 ){ + switch ( c ) { + case 'h': + /* Display help text */ + default: + /* Unrecognised/invalid option */ + sanboot_syntax ( argv ); + return 1; + } + } + + /* Need exactly one image name remaining after the options */ + if ( optind != ( argc - 1 ) ) { + sanboot_syntax ( argv ); + return 1; + } + root_path = argv[optind]; + + /* Boot from root path */ + if ( ( rc = boot_root_path ( root_path ) ) != 0 ) { + printf ( "Could not boot from %s: %s\n", + root_path, strerror ( rc ) ); + return 1; + } + + return 0; +} + +struct command sanboot_command __command = { + .name = "sanboot", + .exec = sanboot_exec, +}; diff --git a/src/include/usr/autoboot.h b/src/include/usr/autoboot.h index 4ddeb5bc..b451a8c1 100644 --- a/src/include/usr/autoboot.h +++ b/src/include/usr/autoboot.h @@ -8,5 +8,6 @@ */ extern void autoboot ( void ); +extern int boot_root_path ( const char *root_path ); #endif /* _USR_AUTOBOOT_H */ diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c index c3b07e9a..b84bd7b1 100644 --- a/src/usr/autoboot.c +++ b/src/usr/autoboot.c @@ -108,7 +108,7 @@ static int boot_filename ( const char *filename ) { * @v root_path Root path * @ret rc Return status code */ -static int boot_root_path ( const char *root_path ) { +int boot_root_path ( const char *root_path ) { /* Quick hack */ if ( strncmp ( root_path, "iscsi:", 6 ) == 0 ) {