mkimage: Put FIT loading in function and tidy error handling
authorSimon Glass <sjg@chromium.org>
Wed, 8 May 2013 08:05:57 +0000 (08:05 +0000)
committerTom Rini <trini@ti.com>
Tue, 14 May 2013 19:37:25 +0000 (15:37 -0400)
The fit_handle_file() function is quite long - split out the part that
loads and checks a FIT into its own function. We will use this
function for storing public keys into a destination FDT file.

The error handling is currently a bit repetitive - tidy it.

Signed-off-by: Simon Glass <sjg@chromium.org>
tools/fit_image.c

index 8f511591a015fb2f9cfc0efb697df194be75cdf5..cc123dd37adf81996346e7f776f72f21dee8f4f8 100644 (file)
@@ -47,6 +47,48 @@ static int fit_check_image_types (uint8_t type)
                return EXIT_FAILURE;
 }
 
+int mmap_fdt(struct mkimage_params *params, const char *fname, void **blobp,
+               struct stat *sbuf)
+{
+       void *ptr;
+       int fd;
+
+       /* Load FIT blob into memory (we need to write hashes/signatures) */
+       fd = open(fname, O_RDWR | O_BINARY);
+
+       if (fd < 0) {
+               fprintf(stderr, "%s: Can't open %s: %s\n",
+                       params->cmdname, fname, strerror(errno));
+               unlink(fname);
+               return -1;
+       }
+
+       if (fstat(fd, sbuf) < 0) {
+               fprintf(stderr, "%s: Can't stat %s: %s\n",
+                       params->cmdname, fname, strerror(errno));
+               unlink(fname);
+               return -1;
+       }
+
+       ptr = mmap(0, sbuf->st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
+       if (ptr == MAP_FAILED) {
+               fprintf(stderr, "%s: Can't read %s: %s\n",
+                       params->cmdname, fname, strerror(errno));
+               unlink(fname);
+               return -1;
+       }
+
+       /* check if ptr has a valid blob */
+       if (fdt_check_header(ptr)) {
+               fprintf(stderr, "%s: Invalid FIT blob\n", params->cmdname);
+               unlink(fname);
+               return -1;
+       }
+
+       *blobp = ptr;
+       return fd;
+}
+
 /**
  * fit_handle_file - main FIT file processing function
  *
@@ -65,7 +107,7 @@ static int fit_handle_file (struct mkimage_params *params)
        char cmd[MKIMAGE_MAX_DTC_CMDLINE_LEN];
        int tfd;
        struct stat sbuf;
-       unsigned char *ptr;
+       void *ptr;
 
        /* Flattened Image Tree (FIT) format  handling */
        debug ("FIT format handling\n");
@@ -87,57 +129,25 @@ static int fit_handle_file (struct mkimage_params *params)
        if (system (cmd) == -1) {
                fprintf (stderr, "%s: system(%s) failed: %s\n",
                                params->cmdname, cmd, strerror(errno));
-               unlink (tmpfile);
-               return (EXIT_FAILURE);
-       }
-
-       /* load FIT blob into memory */
-       tfd = open (tmpfile, O_RDWR|O_BINARY);
-
-       if (tfd < 0) {
-               fprintf (stderr, "%s: Can't open %s: %s\n",
-                               params->cmdname, tmpfile, strerror(errno));
-               unlink (tmpfile);
-               return (EXIT_FAILURE);
-       }
-
-       if (fstat (tfd, &sbuf) < 0) {
-               fprintf (stderr, "%s: Can't stat %s: %s\n",
-                               params->cmdname, tmpfile, strerror(errno));
-               unlink (tmpfile);
-               return (EXIT_FAILURE);
-       }
-
-       ptr = mmap (0, sbuf.st_size, PROT_READ|PROT_WRITE, MAP_SHARED,
-                               tfd, 0);
-       if (ptr == MAP_FAILED) {
-               fprintf (stderr, "%s: Can't read %s: %s\n",
-                               params->cmdname, tmpfile, strerror(errno));
-               unlink (tmpfile);
-               return (EXIT_FAILURE);
+               goto err_system;
        }
 
-       /* check if ptr has a valid blob */
-       if (fdt_check_header (ptr)) {
-               fprintf (stderr, "%s: Invalid FIT blob\n", params->cmdname);
-               unlink (tmpfile);
-               return (EXIT_FAILURE);
-       }
+       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);
-               unlink (tmpfile);
-               return (EXIT_FAILURE);
+               goto err_add_hashes;
        }
 
        /* add a timestamp at offset 0 i.e., root  */
        if (fit_set_timestamp (ptr, 0, sbuf.st_mtime)) {
                fprintf (stderr, "%s: Can't add image timestamp\n",
                                params->cmdname);
-               unlink (tmpfile);
-               return (EXIT_FAILURE);
+               goto err_add_timestamp;
        }
        debug ("Added timestamp successfully\n");
 
@@ -153,6 +163,14 @@ static int fit_handle_file (struct mkimage_params *params)
                return (EXIT_FAILURE);
        }
        return (EXIT_SUCCESS);
+
+err_add_timestamp:
+err_add_hashes:
+       munmap(ptr, sbuf.st_size);
+err_mmap:
+err_system:
+       unlink(tmpfile);
+       return -1;
 }
 
 static int fit_check_params (struct mkimage_params *params)