diff options
Diffstat (limited to 'tools/fit_image.c')
| -rw-r--r-- | tools/fit_image.c | 44 | 
1 files changed, 34 insertions, 10 deletions
| diff --git a/tools/fit_image.c b/tools/fit_image.c index cc123dd37..281c2bda1 100644 --- a/tools/fit_image.c +++ b/tools/fit_image.c @@ -105,9 +105,11 @@ static int fit_handle_file (struct mkimage_params *params)  {  	char tmpfile[MKIMAGE_MAX_TMPFILE_LEN];  	char cmd[MKIMAGE_MAX_DTC_CMDLINE_LEN]; -	int tfd; +	int tfd, destfd = 0; +	void *dest_blob = NULL;  	struct stat sbuf;  	void *ptr; +	off_t destfd_size = 0;  	/* Flattened Image Tree (FIT) format  handling */  	debug ("FIT format handling\n"); @@ -122,29 +124,44 @@ static int fit_handle_file (struct mkimage_params *params)  	}  	sprintf (tmpfile, "%s%s", params->imagefile, MKIMAGE_TMPFILE_SUFFIX); -	/* dtc -I dts -O dtb -p 500 datafile > tmpfile */ -	sprintf (cmd, "%s %s %s > %s", -		MKIMAGE_DTC, params->dtc, params->datafile, tmpfile); -	debug ("Trying to execute \"%s\"\n", cmd); +	/* We either compile the source file, or use the existing FIT image */ +	if (params->datafile) { +		/* dtc -I dts -O dtb -p 500 datafile > tmpfile */ +		snprintf(cmd, sizeof(cmd), "%s %s %s > %s", +			 MKIMAGE_DTC, params->dtc, params->datafile, tmpfile); +		debug("Trying to execute \"%s\"\n", cmd); +	} else { +		snprintf(cmd, sizeof(cmd), "cp %s %s", +			 params->imagefile, tmpfile); +	}  	if (system (cmd) == -1) {  		fprintf (stderr, "%s: system(%s) failed: %s\n",  				params->cmdname, cmd, strerror(errno));  		goto err_system;  	} +	if (params->keydest) { +		destfd = mmap_fdt(params, params->keydest, &dest_blob, &sbuf); +		if (destfd < 0) +			goto err_keydest; +		destfd_size = sbuf.st_size; +	} +  	tfd = mmap_fdt(params, tmpfile, &ptr, &sbuf);  	if (tfd < 0)  		goto err_mmap;  	/* set hashes for images in the blob */ -	if (fit_add_verification_data(ptr)) { -		fprintf (stderr, "%s Can't add hashes to FIT blob", -				params->cmdname); +	if (fit_add_verification_data(params->keydir, +				      dest_blob, ptr, params->comment, +				      params->require_keys)) { +		fprintf(stderr, "%s Can't add hashes to FIT blob\n", +			params->cmdname);  		goto err_add_hashes;  	} -	/* add a timestamp at offset 0 i.e., root  */ -	if (fit_set_timestamp (ptr, 0, sbuf.st_mtime)) { +	/* for first image creation, add a timestamp at offset 0 i.e., root  */ +	if (params->datafile && fit_set_timestamp(ptr, 0, sbuf.st_mtime)) {  		fprintf (stderr, "%s: Can't add image timestamp\n",  				params->cmdname);  		goto err_add_timestamp; @@ -153,6 +170,10 @@ static int fit_handle_file (struct mkimage_params *params)  	munmap ((void *)ptr, sbuf.st_size);  	close (tfd); +	if (dest_blob) { +		munmap(dest_blob, destfd_size); +		close(destfd); +	}  	if (rename (tmpfile, params->imagefile) == -1) {  		fprintf (stderr, "%s: Can't rename %s to %s: %s\n", @@ -168,6 +189,9 @@ err_add_timestamp:  err_add_hashes:  	munmap(ptr, sbuf.st_size);  err_mmap: +	if (dest_blob) +		munmap(dest_blob, destfd_size); +err_keydest:  err_system:  	unlink(tmpfile);  	return -1; |