mkenvimage: Use mmap() when reading from a regular file
authorDavid Wagner <david.wagner@free-electrons.com>
Fri, 13 Jan 2012 13:27:38 +0000 (13:27 +0000)
committerAnatolij Gustschin <agust@denx.de>
Tue, 27 Mar 2012 08:09:52 +0000 (10:09 +0200)
Fall back to read() if it fails.

Signed-off-by: David Wagner <david.wagner@free-electrons.com>
Acked-by: Mike Frysinger <vapier@gentoo.org>
tools/mkenvimage.c

index 032dc836526b36179e0980f60ce4a3cf9ac93968..4169004aabae2a5dbe5b784330a814b1ed102855 100644 (file)
@@ -37,6 +37,7 @@
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/mman.h>
 
 #include "compiler.h"
 #include <u-boot/crc.h>
@@ -208,12 +209,24 @@ int main(int argc, char **argv)
                }
 
                filesize = txt_file_stat.st_size;
-               /* Read the raw input file and transform it */
-               filebuf = malloc(sizeof(*envptr) * filesize);
-               ret = read(txt_fd, filebuf, sizeof(*envptr) * filesize);
-               if (ret != sizeof(*envptr) * filesize) {
-                       fprintf(stderr, "Can't read the whole input file\n");
-                       return EXIT_FAILURE;
+
+               filebuf = mmap(NULL, sizeof(*envptr) * filesize, PROT_READ,
+                              MAP_PRIVATE, txt_fd, 0);
+               if (filebuf == MAP_FAILED) {
+                       fprintf(stderr, "mmap (%ld bytes) failed: %s\n",
+                                       sizeof(*envptr) * filesize,
+                                       strerror(errno));
+                       fprintf(stderr, "Falling back to read()\n");
+
+                       filebuf = malloc(sizeof(*envptr) * filesize);
+                       ret = read(txt_fd, filebuf, sizeof(*envptr) * filesize);
+                       if (ret != sizeof(*envptr) * filesize) {
+                               fprintf(stderr, "Can't read the whole input file (%ld bytes): %s\n",
+                                       sizeof(*envptr) * filesize,
+                                       strerror(errno));
+
+                               return EXIT_FAILURE;
+                       }
                }
                ret = close(txt_fd);
        }