mirror of
https://github.com/xcat2/xNBA.git
synced 2024-12-24 12:11:33 +00:00
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:
parent
2c569fb240
commit
b256900d4f
@ -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
|
||||
*
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user