mirror of https://github.com/ipxe/ipxe.git
Scripts temporarily deregister themselves while executing. This
allows us to avoid execution loops without having to hack around the image registration order.pull/1/head
parent
2c569fb240
commit
b256900d4f
|
@ -106,20 +106,6 @@ void unregister_image ( struct image *image ) {
|
||||||
DBGC ( image, "IMAGE %p unregistered\n", 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
|
* Find image by name
|
||||||
*
|
*
|
||||||
|
|
|
@ -44,6 +44,13 @@ static int script_exec ( struct image *image ) {
|
||||||
char *eol;
|
char *eol;
|
||||||
int rc;
|
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 ) {
|
while ( offset < image->len ) {
|
||||||
|
|
||||||
/* Read up to cmdbuf bytes from script into buffer */
|
/* Read up to cmdbuf bytes from script into buffer */
|
||||||
|
@ -60,7 +67,8 @@ static int script_exec ( struct image *image ) {
|
||||||
if ( ! eol ) {
|
if ( ! eol ) {
|
||||||
DBG ( "Script line too long (max %d bytes)\n",
|
DBG ( "Script line too long (max %d bytes)\n",
|
||||||
sizeof ( cmdbuf ) );
|
sizeof ( cmdbuf ) );
|
||||||
return -ENOEXEC;
|
rc = -ENOEXEC;
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mark end of line and execute command */
|
/* Mark end of line and execute command */
|
||||||
|
@ -69,14 +77,19 @@ static int script_exec ( struct image *image ) {
|
||||||
if ( ( rc = system ( cmdbuf ) ) != 0 ) {
|
if ( ( rc = system ( cmdbuf ) ) != 0 ) {
|
||||||
DBG ( "Command \"%s\" exited with status %d\n",
|
DBG ( "Command \"%s\" exited with status %d\n",
|
||||||
cmdbuf, rc );
|
cmdbuf, rc );
|
||||||
return rc;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move to next line */
|
/* Move to next line */
|
||||||
offset += ( ( eol - cmdbuf ) + 1 );
|
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;
|
return rc;
|
||||||
|
|
||||||
/* If we succeed, move the image to the start of the list */
|
/* If we succeed, move the image to the start of the list */
|
||||||
promote_image ( image );
|
#warning "No longer exists"
|
||||||
|
// promote_image ( image );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue