mkenvimage: Use mmap() when reading from a regular file

Fall back to read() if it fails.

Signed-off-by: David Wagner <david.wagner@free-electrons.com>
Acked-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
David Wagner 2012-01-13 13:27:38 +00:00 committed by Anatolij Gustschin
parent 48995b5a96
commit 6ee39f8055

View File

@ -37,6 +37,7 @@
#include <unistd.h> #include <unistd.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/mman.h>
#include "compiler.h" #include "compiler.h"
#include <u-boot/crc.h> #include <u-boot/crc.h>
@ -208,13 +209,25 @@ int main(int argc, char **argv)
} }
filesize = txt_file_stat.st_size; filesize = txt_file_stat.st_size;
/* Read the raw input file and transform it */
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); filebuf = malloc(sizeof(*envptr) * filesize);
ret = read(txt_fd, filebuf, sizeof(*envptr) * filesize); ret = read(txt_fd, filebuf, sizeof(*envptr) * filesize);
if (ret != sizeof(*envptr) * filesize) { if (ret != sizeof(*envptr) * filesize) {
fprintf(stderr, "Can't read the whole input file\n"); fprintf(stderr, "Can't read the whole input file (%ld bytes): %s\n",
sizeof(*envptr) * filesize,
strerror(errno));
return EXIT_FAILURE; return EXIT_FAILURE;
} }
}
ret = close(txt_fd); ret = close(txt_fd);
} }
/* The +1 is for the additionnal ending \0. See below. */ /* The +1 is for the additionnal ending \0. See below. */