Allow "imgexec" with no arguments to boot the file that was loaded with
authorMichael Brown <mcb30@etherboot.org>
Fri, 12 Jan 2007 07:32:46 +0000 (07:32 +0000)
committerMichael Brown <mcb30@etherboot.org>
Fri, 12 Jan 2007 07:32:46 +0000 (07:32 +0000)
"kernel".

src/hci/commands/image_cmd.c
src/include/usr/imgmgmt.h
src/usr/imgmgmt.c

index 0dc1655..8055f68 100644 (file)
@@ -304,7 +304,7 @@ static int imgexec_exec ( int argc, char **argv ) {
                { NULL, 0, NULL, 0 },
        };
        struct image *image;
-       const char *name;
+       const char *name = NULL;
        int c;
        int rc;
 
@@ -320,19 +320,29 @@ static int imgexec_exec ( int argc, char **argv ) {
                }
        }
 
-       /* Need exactly one image name */
-       if ( optind != ( argc - 1 ) ) {
+       /* Need no more than one image name */
+       if ( optind != argc )
+               name = argv[optind++];
+       if ( optind != argc ) {
                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 ( name ) {
+               image = find_image ( name );
+               if ( ! image ) {
+                       printf ( "No such image: %s\n", name );
+                       return 1;
+               }
+       } else {
+               image = imgautoselect();
+               if ( ! image ) {
+                       printf ( "No loaded images\n" );
+                       return 1;
+               }
        }
+
        if ( ( rc = imgexec ( image ) ) != 0 ) {
                printf ( "Could not execute %s: %s\n", name, strerror ( rc ) );
                return 1;
@@ -448,7 +458,6 @@ static int imgfree_exec ( int argc, char **argv ) {
        return 0;
 }
 
-
 /** Image management commands */
 struct command image_commands[] __command = {
        {
index 86a65da..f048410 100644 (file)
@@ -11,6 +11,7 @@ extern int imgfetch ( const char *filename, const char *name,
                      struct image **new_image );
 extern int imgload ( struct image *image );
 extern int imgexec ( struct image *image );
+extern struct image * imgautoselect ( void );
 extern void imgstat ( struct image *image );
 extern void imgfree ( struct image *image );
 
index de71dee..2c949ae 100644 (file)
@@ -90,6 +90,22 @@ int imgexec ( struct image *image ) {
        return image_exec ( image );
 }
 
+/**
+ * Identify the first loaded image
+ *
+ * @ret image          Image, or NULL
+ */
+struct image * imgautoselect ( void ) {
+       struct image *image;
+
+       for_each_image ( image ) {
+               if ( image->flags & IMAGE_LOADED )
+                       return image;
+       }
+
+       return NULL;
+}
+
 /**
  * Display status of an image
  *