diff mbox

[U-Boot,PATCHv5,5/7] mkenvimage: Use mmap() when reading from a regular file

Message ID 1326497260-13864-5-git-send-email-david.wagner@free-electrons.com
State Accepted
Delegated to: Anatolij Gustschin
Headers show

Commit Message

David Wagner Jan. 13, 2012, 11:27 p.m. UTC
Fall back to read() if it fails.

Signed-off-by: David Wagner <david.wagner@free-electrons.com>
---
 tools/mkenvimage.c |   25 +++++++++++++++++++------
 1 files changed, 19 insertions(+), 6 deletions(-)

Comments

Mike Frysinger Jan. 15, 2012, 1:25 a.m. UTC | #1
Acked-by: Mike Frysinger <vapier@gentoo.org>
-mike
Anatolij Gustschin March 27, 2012, 8:52 a.m. UTC | #2
On Sat, 14 Jan 2012 00:27:38 +0100
David Wagner <david.wagner@free-electrons.com> wrote:

> Fall back to read() if it fails.
> 
> Signed-off-by: David Wagner <david.wagner@free-electrons.com>
> ---
>  tools/mkenvimage.c |   25 +++++++++++++++++++------
>  1 files changed, 19 insertions(+), 6 deletions(-)

Applied to u-boot-staging/agust@denx.de, thanks.

Anatolij
diff mbox

Patch

diff --git a/tools/mkenvimage.c b/tools/mkenvimage.c
index a5676be..8ce1be6 100644
--- a/tools/mkenvimage.c
+++ b/tools/mkenvimage.c
@@ -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);
 	}