mirror of
				https://github.com/xcat2/xNBA.git
				synced 2025-11-04 05:12: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:
		@@ -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;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user