summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/image.c61
-rw-r--r--src/core/parseopt.c22
2 files changed, 42 insertions, 41 deletions
diff --git a/src/core/image.c b/src/core/image.c
index ae09a0727..b02b8936b 100644
--- a/src/core/image.c
+++ b/src/core/image.c
@@ -66,6 +66,7 @@ static int require_trusted_images_permanent = 0;
static void free_image ( struct refcnt *refcnt ) {
struct image *image = container_of ( refcnt, struct image, refcnt );
+ free ( image->name );
free ( image->cmdline );
uri_put ( image->uri );
ufree ( image->data );
@@ -77,37 +78,56 @@ static void free_image ( struct refcnt *refcnt ) {
/**
* Allocate executable image
*
+ * @v uri URI, or NULL
* @ret image Executable image
*/
-struct image * alloc_image ( void ) {
+struct image * alloc_image ( struct uri *uri ) {
+ const char *name;
struct image *image;
+ int rc;
+ /* Allocate image */
image = zalloc ( sizeof ( *image ) );
- if ( image ) {
- ref_init ( &image->refcnt, free_image );
+ if ( ! image )
+ goto err_alloc;
+
+ /* Initialise image */
+ ref_init ( &image->refcnt, free_image );
+ if ( uri ) {
+ image->uri = uri_get ( uri );
+ name = basename ( ( char * ) uri->path );
+ if ( ( rc = image_set_name ( image, name ) ) != 0 )
+ goto err_set_name;
}
+
return image;
+
+ err_set_name:
+ image_put ( image );
+ err_alloc:
+ return NULL;
}
/**
- * Set image URI
+ * Set image name
*
* @v image Image
- * @v URI New image URI
- *
- * If no name is set, the name will be updated to the base name of the
- * URI path (if any).
+ * @v name New image name
+ * @ret rc Return status code
*/
-void image_set_uri ( struct image *image, struct uri *uri ) {
- const char *path = uri->path;
+int image_set_name ( struct image *image, const char *name ) {
+ char *name_copy;
- /* Replace URI reference */
- uri_put ( image->uri );
- image->uri = uri_get ( uri );
+ /* Duplicate name */
+ name_copy = strdup ( name );
+ if ( ! name_copy )
+ return -ENOMEM;
+
+ /* Replace existing name */
+ free ( image->name );
+ image->name = name_copy;
- /* Set name if none already specified */
- if ( path && ( ! image->name[0] ) )
- image_set_name ( image, basename ( ( char * ) path ) );
+ return 0;
}
/**
@@ -137,11 +157,14 @@ int image_set_cmdline ( struct image *image, const char *cmdline ) {
*/
int register_image ( struct image *image ) {
static unsigned int imgindex = 0;
+ char name[8]; /* "imgXXXX" */
+ int rc;
/* Create image name if it doesn't already have one */
- if ( ! image->name[0] ) {
- snprintf ( image->name, sizeof ( image->name ), "img%d",
- imgindex++ );
+ if ( ! image->name ) {
+ snprintf ( name, sizeof ( name ), "img%d", imgindex++ );
+ if ( ( rc = image_set_name ( image, name ) ) != 0 )
+ return rc;
}
/* Avoid ending up with multiple "selected" images on
diff --git a/src/core/parseopt.c b/src/core/parseopt.c
index f953b421d..2739bd87b 100644
--- a/src/core/parseopt.c
+++ b/src/core/parseopt.c
@@ -115,28 +115,6 @@ int parse_netdev ( const char *text, struct net_device **netdev ) {
}
/**
- * Parse image name
- *
- * @v text Text
- * @ret image Image
- * @ret rc Return status code
- */
-int parse_image ( const char *text, struct image **image ) {
-
- /* Sanity check */
- assert ( text != NULL );
-
- /* Find network device */
- *image = find_image ( text );
- if ( ! *image ) {
- printf ( "\"%s\": no such image\n", text );
- return -ENOENT;
- }
-
- return 0;
-}
-
-/**
* Parse flag
*
* @v text Text (ignored)