diff options
author | Michael Brown | 2007-01-12 08:22:20 +0100 |
---|---|---|
committer | Michael Brown | 2007-01-12 08:22:20 +0100 |
commit | f135a37f3050a40ad5399e150169ba6b880fe47d (patch) | |
tree | ae82ed4470bf1f0b09b23fbc8018541ed07735cb /src/hci | |
parent | Add free_image (diff) | |
download | ipxe-f135a37f3050a40ad5399e150169ba6b880fe47d.tar.gz ipxe-f135a37f3050a40ad5399e150169ba6b880fe47d.tar.xz ipxe-f135a37f3050a40ad5399e150169ba6b880fe47d.zip |
Cleaner separation between imgXXX() functions and image_cmd.c
Diffstat (limited to 'src/hci')
-rw-r--r-- | src/hci/commands/image_cmd.c | 360 |
1 files changed, 309 insertions, 51 deletions
diff --git a/src/hci/commands/image_cmd.c b/src/hci/commands/image_cmd.c index e38ecc90..0dc16557 100644 --- a/src/hci/commands/image_cmd.c +++ b/src/hci/commands/image_cmd.c @@ -18,11 +18,11 @@ #include <stdint.h> #include <stdlib.h> +#include <libgen.h> #include <getopt.h> #include <vsprintf.h> #include <gpxe/image.h> #include <gpxe/command.h> -#include <usr/fetch.h> #include <usr/imgmgmt.h> /** @file @@ -37,36 +37,53 @@ */ /** - * "fetch"/"module"/"kernel" command syntax message + * Fill in image command line + * + * @v image Image + * @v nargs Argument count + * @v args Argument list + */ +void imgfill_cmdline ( struct image *image, unsigned int nargs, char **args ) { + size_t used = 0; + + image->cmdline[0] = '\0'; + while ( ( used < sizeof ( image->cmdline ) ) && nargs-- ) { + used += snprintf ( &image->cmdline[used], + ( sizeof ( image->cmdline ) - used ), + "%s%s", ( used ? " " : "" ), *(args++) ); + } +} + +/** + * "imgfetch"/"module"/"kernel" command syntax message * * @v argv Argument list */ -static void fetch_syntax ( char **argv ) { +static void imgfetch_core_syntax ( char **argv, int load ) { printf ( "Usage:\n" " %s [-n|--name <name>] filename [arguments...]\n" "\n" - "Fetch executable/loadable image\n", - argv[0] ); + "%s executable/loadable image\n", + argv[0], ( load ? "Fetch and load" : "Fetch" ) ); } /** - * The "fetch"/"module"/"kernel" command body + * The "imgfetch"/"module"/"kernel" command body * * @v argc Argument count * @v argv Argument list - * @v name Default name for image, or NULL + * @v load Load image after fetching * @ret rc Exit code */ -static int fetch_exec_name ( int argc, char **argv, const char *name ) { +static int imgfetch_core_exec ( int argc, char **argv, int load ) { static struct option longopts[] = { { "help", 0, NULL, 'h' }, { "name", required_argument, NULL, 'n' }, { NULL, 0, NULL, 0 }, }; struct image *image; - const char *filename; - char cmdline[ sizeof ( image->cmdline ) ]; - size_t used = 0; + const char *name = NULL; + char *filename; int c; int rc; @@ -82,76 +99,246 @@ static int fetch_exec_name ( int argc, char **argv, const char *name ) { /* Display help text */ default: /* Unrecognised/invalid option */ - fetch_syntax ( argv ); + imgfetch_core_syntax ( argv, load ); return 1; } } /* Need at least a filename remaining after the options */ - if ( optind >= argc ) { - fetch_syntax ( argv ); + if ( optind == argc ) { + imgfetch_core_syntax ( argv, load ); return 1; } filename = argv[optind++]; + if ( ! name ) + name = basename ( filename ); - /* Build command line */ - while ( ( used < sizeof ( cmdline ) ) && ( optind < argc ) ) { - used += snprintf ( &cmdline[used], sizeof ( cmdline ) - used, - " %s", argv[optind++] ); + /* Fetch the image */ + if ( ( rc = imgfetch ( filename, name, &image ) ) != 0 ) { + printf ( "Could not fetch %s: %s\n", name, strerror ( rc ) ); + return 1; } - /* Allocate and fill struct image */ - image = malloc ( sizeof ( *image ) ); - if ( ! image ) { - printf ( "Out of memory\n" ); - return 1; + /* Fill in command line */ + imgfill_cmdline ( image, ( argc - optind ), &argv[optind] ); + + /* Load image if required */ + if ( load ) { + if ( ( rc = imgload ( image ) ) != 0 ) { + printf ( "Could not load %s: %s\n", name, + strerror ( rc ) ); + return 1; + } } - memset ( image, 0, sizeof ( *image ) ); - if ( name ) - strncpy ( image->name, name, ( sizeof ( image->name ) - 1 ) ); - if ( used ) - memcpy ( image->cmdline, cmdline, sizeof ( image->cmdline ) ); - - /* Fetch the file */ - if ( ( rc = fetch ( image, filename ) ) != 0 ) { - printf ( "Could not fetch %s: %s\n", filename, - strerror ( rc ) ); - free ( image ); + + return 0; +} + +/** + * The "imgfetch"/"module" command + * + * @v argc Argument count + * @v argv Argument list + * @ret rc Exit code + */ +static int imgfetch_exec ( int argc, char **argv ) { + return imgfetch_core_exec ( argc, argv, 0 ); +} + +/** + * The "kernel" command + * + * @v argc Argument count + * @v argv Argument list + * @ret rc Exit code + */ +static int kernel_exec ( int argc, char **argv ) { + return imgfetch_core_exec ( argc, argv, 1 ); +} + +/** + * "imgload" command syntax message + * + * @v argv Argument list + */ +static void imgload_syntax ( char **argv ) { + printf ( "Usage:\n" + " %s <image name>\n" + "\n" + "Load executable/loadable image\n", + argv[0] ); +} + +/** + * The "imgload" command + * + * @v argc Argument count + * @v argv Argument list + * @ret rc Exit code + */ +static int imgload_exec ( int argc, char **argv ) { + static struct option longopts[] = { + { "help", 0, NULL, 'h' }, + { NULL, 0, NULL, 0 }, + }; + struct image *image; + const char *name; + 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 */ + imgload_syntax ( argv ); + return 1; + } + } + + /* Need exactly one image name remaining after the options */ + if ( optind != ( argc - 1 ) ) { + imgload_syntax ( argv ); return 1; } + name = argv[optind]; - /* Register the image */ - if ( ( rc = register_image ( image ) ) != 0 ) { - printf ( "Could not register %s: %s\n", filename, - strerror ( rc ) ); - free ( image ); + /* Load all specified images */ + image = find_image ( name ); + if ( ! image ) { + printf ( "No such image: %s\n", name ); + return 1; + } + if ( ( rc = imgload ( image ) ) != 0 ) { + printf ( "Could not load %s: %s\n", name, strerror ( rc ) ); return 1; } - imgstat ( image ); return 0; } /** - * The "fetch"/"module" command + * "imgargs" command syntax message + * + * @v argv Argument list + */ +static void imgargs_syntax ( char **argv ) { + printf ( "Usage:\n" + " %s <image name> [<arguments>...]\n" + "\n" + "Set arguments for executable/loadable image\n", + argv[0] ); +} + +/** + * The "imgargs" command body * * @v argc Argument count * @v argv Argument list * @ret rc Exit code */ -static int fetch_exec ( int argc, char **argv ) { - return fetch_exec_name ( argc, argv, NULL ); +static int imgargs_exec ( int argc, char **argv ) { + static struct option longopts[] = { + { "help", 0, NULL, 'h' }, + { NULL, 0, NULL, 0 }, + }; + struct image *image; + const char *name; + int c; + + /* Parse options */ + while ( ( c = getopt_long ( argc, argv, "h", longopts, NULL ) ) >= 0 ){ + switch ( c ) { + case 'h': + /* Display help text */ + default: + /* Unrecognised/invalid option */ + imgargs_syntax ( argv ); + return 1; + } + } + + /* Need at least an image name remaining after the options */ + if ( optind == argc ) { + imgargs_syntax ( argv ); + return 1; + } + name = argv[optind++]; + + /* Fill in command line */ + image = find_image ( name ); + if ( ! image ) { + printf ( "No such image: %s\n", name ); + return 1; + } + imgfill_cmdline ( image, ( argc - optind ), &argv[optind] ); + + return 0; +} + +/** + * "imgexec" command syntax message + * + * @v argv Argument list + */ +static void imgexec_syntax ( char **argv ) { + printf ( "Usage:\n" + " %s <image name>\n" + "\n" + "Execute executable/loadable image\n", + argv[0] ); } /** - * The "kernel" command + * The "imgexec" command * * @v argc Argument count * @v argv Argument list * @ret rc Exit code */ -static int kernel_exec ( int argc, char **argv ) { - return fetch_exec_name ( argc, argv, "kernel" ); +static int imgexec_exec ( int argc, char **argv ) { + static struct option longopts[] = { + { "help", 0, NULL, 'h' }, + { NULL, 0, NULL, 0 }, + }; + struct image *image; + const char *name; + 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 */ + imgexec_syntax ( argv ); + return 1; + } + } + + /* Need exactly one image name */ + if ( optind != ( argc - 1 ) ) { + imgexec_syntax ( argv ); + return 1; + } + name = argv[optind]; + + /* Execute specified image */ + image = find_image ( name ); + if ( ! image ) { + printf ( "No such image: %s\n", name ); + return 1; + } + if ( ( rc = imgexec ( image ) ) != 0 ) { + printf ( "Could not execute %s: %s\n", name, strerror ( rc ) ); + return 1; + } + + return 0; } /** @@ -174,7 +361,7 @@ static void imgstat_syntax ( char **argv ) { * @v argv Argument list * @ret rc Exit code */ -static int imgstat_exec ( int argc __unused, char **argv __unused ) { +static int imgstat_exec ( int argc, char **argv ) { static struct option longopts[] = { { "help", 0, NULL, 'h' }, { NULL, 0, NULL, 0 }, @@ -194,7 +381,7 @@ static int imgstat_exec ( int argc __unused, char **argv __unused ) { } } - /* Need at least a filename remaining after the options */ + /* No arguments */ if ( optind != argc ) { imgstat_syntax ( argv ); return 1; @@ -207,22 +394,93 @@ static int imgstat_exec ( int argc __unused, char **argv __unused ) { return 0; } +/** + * "imgstat" command syntax message + * + * @v argv Argument list + */ +static void imgfree_syntax ( char **argv ) { + printf ( "Usage:\n" + " %s\n" + "\n" + "Free all executable/loadable images\n", + argv[0] ); +} + +/** + * The "imgfree" command + * + * @v argc Argument count + * @v argv Argument list + * @ret rc Exit code + */ +static int imgfree_exec ( int argc, char **argv ) { + static struct option longopts[] = { + { "help", 0, NULL, 'h' }, + { NULL, 0, NULL, 0 }, + }; + struct image *image; + struct image *tmp; + int c; + + /* Parse options */ + while ( ( c = getopt_long ( argc, argv, "h", longopts, NULL ) ) >= 0 ){ + switch ( c ) { + case 'h': + /* Display help text */ + default: + /* Unrecognised/invalid option */ + imgfree_syntax ( argv ); + return 1; + } + } + + /* No arguments */ + if ( optind != argc ) { + imgfree_syntax ( argv ); + return 1; + } + + /* Free all images */ + list_for_each_entry_safe ( image, tmp, &images, list ) { + imgfree ( image ); + } + return 0; +} + + /** Image management commands */ struct command image_commands[] __command = { { - .name = "fetch", - .exec = fetch_exec, + .name = "imgfetch", + .exec = imgfetch_exec, }, { .name = "module", - .exec = fetch_exec, /* synonym for "fetch" */ + .exec = imgfetch_exec, /* synonym for "imgfetch" */ }, { .name = "kernel", .exec = kernel_exec, }, { + .name = "imgload", + .exec = imgload_exec, + }, + { + .name = "imgargs", + .exec = imgargs_exec, + }, + { + .name = "imgexec", + .exec = imgexec_exec, + }, + { .name = "imgstat", .exec = imgstat_exec, }, + { + .name = "imgfree", + .exec = imgfree_exec, + }, }; |