summaryrefslogtreecommitdiffstats
path: root/scripts/bareboximd.c
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/bareboximd.c')
-rw-r--r--scripts/bareboximd.c34
1 files changed, 34 insertions, 0 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"