david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

Scripts temporarily deregister themselves while executing. This

allows us to avoid execution loops without having to hack around the
image registration order.
This commit is contained in:
Michael Brown 2007-06-09 19:00:34 +01:00
parent 2c569fb240
commit b256900d4f
3 changed files with 18 additions and 18 deletions

View File

@ -106,20 +106,6 @@ void unregister_image ( struct image *image ) {
DBGC ( image, "IMAGE %p unregistered\n", image );
}
/**
* Move image to start of list of registered images
*
* @v image Executable/loadable image
*
* Move the image to the start of the image list. This makes it
* easier to keep track of which of the images marked as loaded is
* likely to still be valid.
*/
void promote_image ( struct image *image ) {
list_del ( &image->list );
list_add ( &image->list, &images );
}
/**
* Find image by name
*

View File

@ -44,6 +44,13 @@ static int script_exec ( struct image *image ) {
char *eol;
int rc;
/* Temporarily de-register image, so that a "boot" command
* doesn't throw us into an execution loop. Hold a reference
* to avoid the image's being freed.
*/
image_get ( image );
unregister_image ( image );
while ( offset < image->len ) {
/* Read up to cmdbuf bytes from script into buffer */
@ -60,7 +67,8 @@ static int script_exec ( struct image *image ) {
if ( ! eol ) {
DBG ( "Script line too long (max %d bytes)\n",
sizeof ( cmdbuf ) );
return -ENOEXEC;
rc = -ENOEXEC;
goto done;
}
/* Mark end of line and execute command */
@ -69,14 +77,19 @@ static int script_exec ( struct image *image ) {
if ( ( rc = system ( cmdbuf ) ) != 0 ) {
DBG ( "Command \"%s\" exited with status %d\n",
cmdbuf, rc );
return rc;
goto done;
}
/* Move to next line */
offset += ( ( eol - cmdbuf ) + 1 );
}
return 0;
rc = 0;
done:
/* Re-register image and return */
register_image ( image );
image_put ( image );
return rc;
}
/**

View File

@ -89,7 +89,8 @@ int imgload ( struct image *image ) {
return rc;
/* If we succeed, move the image to the start of the list */
promote_image ( image );
#warning "No longer exists"
// promote_image ( image );
return 0;
}