diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/image.c | 61 | ||||
| -rw-r--r-- | src/core/parseopt.c | 22 |
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) |
