diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/bareboximd.c | 34 | ||||
-rw-r--r-- | scripts/common.c | 53 |
2 files changed, 59 insertions, 28 deletions
diff --git a/scripts/bareboximd.c b/scripts/bareboximd.c index a734399aa5..2d4750d7fb 100644 --- a/scripts/bareboximd.c +++ b/scripts/bareboximd.c @@ -55,6 +55,40 @@ static unsigned long simple_strtoul(const char *cp, char **endp, unsigned int ba return strtoul(cp, endp, base); } +static int imd_read_file(const char *filename, size_t *size, void **outbuf) +{ + void *buf; + int fd, ret; + size_t fsize; + + fd = open(filename, O_RDONLY); + if (fd < 0) { + fprintf(stderr, "Cannot open %s: %s\n", filename, strerror(errno)); + return -errno; + } + + fsize = lseek(fd, 0, SEEK_END); + if (fsize == -1) { + fprintf(stderr, "Cannot get size %s: %s\n", filename, strerror(errno)); + ret = -errno; + goto close; + } + + buf = mmap(NULL, fsize, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); + if (buf == MAP_FAILED) { + close(fd); + return read_file_2(filename, size, outbuf, 0x100000); + } + + *outbuf = buf; + *size = fsize; + + return 0; +close: + close(fd); + return ret; +} + #include "../include/xfuncs.h" #include "../crypto/crc32.c" #include "../common/imd.c" diff --git a/scripts/common.c b/scripts/common.c index b780b09941..2be41615ea 100644 --- a/scripts/common.c +++ b/scripts/common.c @@ -17,7 +17,7 @@ int read_file_2(const char *filename, size_t *size, void **outbuf, size_t max_size) { off_t fsize; - ssize_t rsize; + ssize_t read_size, now; int ret, fd; void *buf; @@ -37,8 +37,10 @@ int read_file_2(const char *filename, size_t *size, void **outbuf, size_t max_si goto close; } - if (fsize < max_size) - max_size = fsize; + if (max_size < fsize) + read_size = max_size; + else + read_size = fsize; if (lseek(fd, 0, SEEK_SET) == -1) { fprintf(stderr, "Cannot seek to start %s: %s\n", filename, strerror(errno)); @@ -46,35 +48,30 @@ int read_file_2(const char *filename, size_t *size, void **outbuf, size_t max_si goto close; } - buf = mmap(NULL, max_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); - if (buf == MAP_FAILED ) { - buf = malloc(max_size); - if (!buf) { - fprintf(stderr, "Cannot allocate memory\n"); - ret = -ENOMEM; - goto close; - } - - *outbuf = buf; + buf = malloc(read_size); + if (!buf) { + fprintf(stderr, "Cannot allocate memory\n"); + ret = -ENOMEM; + goto close; + } - while (*size < max_size) { - rsize = read(fd, buf, max_size - *size); - if (rsize == 0) { - ret = -EIO; - goto free; - } + *outbuf = buf; - if (rsize < 0) { - ret = -errno; - goto free; - } + while (read_size) { + now = read(fd, buf, read_size); + if (now == 0) { + ret = -EIO; + goto free; + } - buf += rsize; - *size += rsize; + if (now < 0) { + ret = -errno; + goto free; } - } else { - *outbuf = buf; - *size = max_size; + + buf += now; + *size += now; + read_size -= now; } ret = 0; |