Several functions are duplicated in different host tools. This patch
starts collecting them in a single C file. We start with read_file()
and read_file_2(), others follow in separate commits.

It would be great to compile these functions in a separate library, but
I don't know how this can be archieved in Kbuild. Instead, the C file
is included where needed. Not nice, not beautiful, but at least enough
to get something going.

Signed-off-by: Sascha Hauer <[email protected]>
---
 scripts/bareboximd.c         |  75 +-------------------------
 scripts/common.c             | 102 +++++++++++++++++++++++++++++++++++
 scripts/common.h             |   7 +++
 scripts/imx/imx-image.c      |  47 +++++-----------
 scripts/imx/imx-usb-loader.c |  77 +++++---------------------
 scripts/omap3-usb-loader.c   |  47 ++--------------
 6 files changed, 138 insertions(+), 217 deletions(-)
 create mode 100644 scripts/common.c
 create mode 100644 scripts/common.h

diff --git a/scripts/bareboximd.c b/scripts/bareboximd.c
index c3dcb4dcf0..8f059f46d0 100644
--- a/scripts/bareboximd.c
+++ b/scripts/bareboximd.c
@@ -17,6 +17,8 @@
 #include <linux/kernel.h>
 #include <sys/mman.h>
 
+#include "common.h"
+#include "common.c"
 #include "../include/image-metadata.h"
 
 #define eprintf(args...) fprintf(stderr, ## args)
@@ -65,79 +67,6 @@ out:
        return ret;
 }
 
-static int read_file_2(const char *filename, size_t *size, void **outbuf, 
size_t max_size)
-{
-       off_t fsize;
-       ssize_t rsize;
-       int ret, fd;
-       void *buf;
-
-       *size = 0;
-       *outbuf = NULL;
-
-       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;
-       }
-
-       if (fsize < max_size)
-               max_size = fsize;
-
-       if (lseek(fd, 0, SEEK_SET) == -1) {
-               fprintf(stderr, "Cannot seek to start %s: %s\n", filename, 
strerror(errno));
-               ret = -errno;
-               goto close;
-       }
-
-       buf = mmap(NULL, max_size, PROT_READ, MAP_SHARED, fd, 0);
-       if (buf == MAP_FAILED ) {
-               buf = malloc(max_size);
-               if (!buf) {
-                       fprintf(stderr, "Cannot allocate memory\n");
-                       ret = -ENOMEM;
-                       goto close;
-               }
-
-               *outbuf = buf;
-
-               while (*size < max_size) {
-                       rsize = read(fd, buf, max_size - *size);
-                       if (rsize == 0) {
-                               ret = -EIO;
-                               goto free;
-                       }
-
-                       if (rsize < 0) {
-                               ret = -errno;
-                               goto free;
-                       }
-
-                       buf += rsize;
-                       *size += rsize;
-               }
-       } else {
-               *outbuf = buf;
-               *size = max_size;
-       }
-
-       ret = 0;
-       goto close;
-free:
-       *outbuf = NULL;
-       free(buf);
-close:
-       close(fd);
-       return ret;
-}
-
 static inline void read_file_2_free(void *buf)
 {
        /*
diff --git a/scripts/common.c b/scripts/common.c
new file mode 100644
index 0000000000..f28cddc71a
--- /dev/null
+++ b/scripts/common.c
@@ -0,0 +1,102 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include <stdio.h>
+#include <sys/types.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <sys/mman.h>
+
+#include "common.h"
+
+int read_file_2(const char *filename, size_t *size, void **outbuf, size_t 
max_size)
+{
+       off_t fsize;
+       ssize_t rsize;
+       int ret, fd;
+       void *buf;
+
+       *size = 0;
+       *outbuf = NULL;
+
+       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;
+       }
+
+       if (fsize < max_size)
+               max_size = fsize;
+
+       if (lseek(fd, 0, SEEK_SET) == -1) {
+               fprintf(stderr, "Cannot seek to start %s: %s\n", filename, 
strerror(errno));
+               ret = -errno;
+               goto close;
+       }
+
+       buf = mmap(NULL, max_size, PROT_READ, MAP_SHARED, fd, 0);
+       if (buf == MAP_FAILED ) {
+               buf = malloc(max_size);
+               if (!buf) {
+                       fprintf(stderr, "Cannot allocate memory\n");
+                       ret = -ENOMEM;
+                       goto close;
+               }
+
+               *outbuf = buf;
+
+               while (*size < max_size) {
+                       rsize = read(fd, buf, max_size - *size);
+                       if (rsize == 0) {
+                               ret = -EIO;
+                               goto free;
+                       }
+
+                       if (rsize < 0) {
+                               ret = -errno;
+                               goto free;
+                       }
+
+                       buf += rsize;
+                       *size += rsize;
+               }
+       } else {
+               *outbuf = buf;
+               *size = max_size;
+       }
+
+       ret = 0;
+       goto close;
+free:
+       *outbuf = NULL;
+       free(buf);
+close:
+       close(fd);
+       return ret;
+}
+
+void *read_file(const char *filename, size_t *size)
+{
+       int ret;
+       void *buf;
+
+       ret = read_file_2(filename, size, &buf, (size_t)-1);
+       if (!ret)
+               return buf;
+
+       errno = -ret;
+
+       return NULL;
+}
diff --git a/scripts/common.h b/scripts/common.h
new file mode 100644
index 0000000000..0153ebe93f
--- /dev/null
+++ b/scripts/common.h
@@ -0,0 +1,7 @@
+#ifndef __COMMON_H
+#define __COMMON_H
+
+int read_file_2(const char *filename, size_t *size, void **outbuf, size_t 
max_size);
+void *read_file(const char *filename, size_t *size);
+
+#endif /* __COMMON_H */
diff --git a/scripts/imx/imx-image.c b/scripts/imx/imx-image.c
index b97f561897..439912a805 100644
--- a/scripts/imx/imx-image.c
+++ b/scripts/imx/imx-image.c
@@ -15,6 +15,7 @@
 #include <linux/kernel.h>
 #include <sys/file.h>
 #include "../compiler.h"
+#include "../common.h"
 
 #include "imx.h"
 
@@ -23,6 +24,8 @@
 #define FLASH_HEADER_OFFSET 0x400
 #define ARM_HEAD_SIZE_INDEX    (ARM_HEAD_SIZE_OFFSET / sizeof(uint32_t))
 
+#include "../common.c"
+
 /*
  * Conservative DCD element limit set to restriction v2 header size to
  * HEADER_SIZE
@@ -721,38 +724,6 @@ static int hab_sign(struct config_data *data)
        return 0;
 }
 
-static void *xread_file(const char *filename, size_t *size)
-{
-       int fd, ret;
-       void *buf;
-       struct stat s;
-
-       fd = open(filename, O_RDONLY);
-       if (fd < 0) {
-               fprintf(stderr, "Cannot open %s: %s\n", filename, 
strerror(errno));
-               exit(1);
-       }
-
-       ret = fstat(fd, &s);
-       if (ret) {
-               fprintf(stderr, "Cannot stat %s: %s\n", filename, 
strerror(errno));
-               exit(1);
-       }
-
-       *size = s.st_size;
-       buf = malloc(*size);
-       if (!buf) {
-               perror("malloc");
-               exit(1);
-       }
-
-       xread(fd, buf, *size);
-
-       close(fd);
-
-       return buf;
-}
-
 static bool cpu_is_aarch64(const struct config_data *data)
 {
        return cpu_is_mx8m(data);
@@ -914,8 +885,10 @@ int main(int argc, char *argv[])
 
                if (data.signed_hdmi_firmware_file) {
                        free(buf);
-                       buf = xread_file(data.signed_hdmi_firmware_file,
+                       buf = read_file(data.signed_hdmi_firmware_file,
                                        &signed_hdmi_firmware_size);
+                       if (!buf)
+                               exit(1);
 
                        signed_hdmi_firmware_size =
                                roundup(signed_hdmi_firmware_size,
@@ -957,7 +930,9 @@ int main(int argc, char *argv[])
        bb_header[0] = data.first_opcode;
        bb_header[ARM_HEAD_SIZE_INDEX] = barebox_image_size;
 
-       infile = xread_file(imagename, &insize);
+       infile = read_file(imagename, &insize);
+       if (!infile)
+               exit(1);
 
        outfd = open(data.outfile, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | 
S_IWUSR);
        if (outfd < 0) {
@@ -1024,7 +999,9 @@ int main(int argc, char *argv[])
        if (create_usb_image) {
                uint32_t *dcd;
 
-               infile = xread_file(data.outfile, &insize);
+               infile = read_file(data.outfile, &insize);
+               if (!infile)
+                       exit(1);
 
                dcd = infile + dcd_ptr_offset;
                *dcd = dcd_ptr_content;
diff --git a/scripts/imx/imx-usb-loader.c b/scripts/imx/imx-usb-loader.c
index cff77f27f2..d8b2842989 100644
--- a/scripts/imx/imx-usb-loader.c
+++ b/scripts/imx/imx-usb-loader.c
@@ -34,9 +34,12 @@
 #include <arpa/inet.h>
 #include <linux/kernel.h>
 
+#include "../common.h"
 #include "../compiler.h"
 #include "imx.h"
 
+#include "../common.c"
+
 #define get_min(a, b) (((a) < (b)) ? (a) : (b))
 
 #define FT_APP 0xaa
@@ -409,61 +412,6 @@ static void dump_bytes(const void *src, unsigned cnt, 
unsigned addr)
        }
 }
 
-static long get_file_size(FILE *xfile)
-{
-       long size;
-       fseek(xfile, 0, SEEK_END);
-       size = ftell(xfile);
-       rewind(xfile);
-
-       return size;
-}
-
-static int read_file(const char *name, unsigned char **buffer, unsigned *size)
-{
-       FILE *xfile;
-       unsigned fsize;
-       int cnt;
-       unsigned char *buf;
-       xfile = fopen(name, "rb");
-       if (!xfile) {
-               printf("error, can not open input file: %s\n", name);
-               return -5;
-       }
-
-       fsize = get_file_size(xfile);
-       if (fsize < 0x20) {
-               printf("error, file: %s is too small\n", name);
-               fclose(xfile);
-               return -2;
-       }
-
-       buf = malloc(ALIGN(fsize, 4));
-       if (!buf) {
-               printf("error, out of memory\n");
-               fclose(xfile);
-               return -2;
-       }
-
-       cnt = fread(buf, 1 , fsize, xfile);
-       if (cnt < fsize) {
-               printf("error, cannot read %s\n", name);
-               fclose(xfile);
-               free(buf);
-               return -1;
-       }
-
-       if (size)
-               *size = fsize;
-
-       if (buffer)
-               *buffer = buf;
-       else
-               free(buf);
-
-       return 0;
-}
-
 /*
  * HID Class-Specific Requests values. See section 7.2 of the HID 
specifications
  */
@@ -1381,7 +1329,7 @@ static int do_irom_download(struct usb_work *curr, int 
verify)
 {
        int ret;
        unsigned char type;
-       unsigned fsize = 0;
+       size_t fsize = 0;
        unsigned header_offset;
        unsigned char *buf = NULL;
        unsigned char *image;
@@ -1391,9 +1339,9 @@ static int do_irom_download(struct usb_work *curr, int 
verify)
        unsigned header_addr = 0;
        unsigned total_size = 0;
 
-       ret = read_file(curr->filename, &buf, &fsize);
-       if (ret < 0)
-               return ret;
+       buf = read_file(curr->filename, &fsize);
+       if (!buf)
+               return -errno;
 
        max_length = fsize;
 
@@ -1436,7 +1384,7 @@ static int do_irom_download(struct usb_work *curr, int 
verify)
                }
        }
 
-       printf("loading binary file(%s) to 0x%08x, fsize=%u type=%d...\n",
+       printf("loading binary file(%s) to 0x%08x, fsize=%zu type=%d...\n",
                        curr->filename, header_addr, fsize, type);
 
        ret = load_file(image, fsize, header_addr, type, false);
@@ -1552,13 +1500,12 @@ static int mxs_load_file(libusb_device_handle *dev, 
uint8_t *data, int size)
 
 static int mxs_work(struct usb_work *curr)
 {
-       unsigned fsize = 0;
+       size_t fsize = 0;
        unsigned char *buf = NULL;
-       int ret;
 
-       ret = read_file(curr->filename, &buf, &fsize);
-       if (ret < 0)
-               return ret;
+       buf = read_file(curr->filename, &fsize);
+       if (!buf)
+               return -errno;
 
        return mxs_load_file(usb_dev_handle, buf, fsize);
 }
diff --git a/scripts/omap3-usb-loader.c b/scripts/omap3-usb-loader.c
index 599a93856a..4fcc324eec 100644
--- a/scripts/omap3-usb-loader.c
+++ b/scripts/omap3-usb-loader.c
@@ -30,6 +30,9 @@
 
 #include <libusb-1.0/libusb.h>         /* the main event */
 
+#include "common.h"
+#include "common.c"
+
 /* Device specific defines (OMAP)
  * Primary source: http://www.ti.com/lit/pdf/sprugn4
  * Section 26.4.5 "Peripheral Booting"
@@ -325,50 +328,6 @@ found:
        return handle;
 }
 
-static unsigned char *read_file(char *path, size_t *readamt)
-{
-       FILE *fp = fopen(path, "rb");
-
-       if (!fp) {
-               log_error("failed to open file \'%s\': %s\n", path,
-                         strerror(errno));
-               return NULL;
-       }
-
-       unsigned char *data = NULL;
-       size_t allocsize = 0;
-       size_t iter = 0;
-
-       while (1) {
-               allocsize += 1024;
-               data = realloc(data, allocsize);
-               if (!data)
-                       return NULL;
-
-               size_t readsize = allocsize - iter;
-               size_t ret = fread(data + iter, sizeof (unsigned char), 
readsize, fp);
-
-               iter += ret;
-
-               if (ret != readsize) {
-                       if (feof(fp)) {
-                               break;
-                       } else if (ferror(fp)) {
-                               log_error("error file reading file \'%s\': 
%s\n",
-                                               path, strerror(errno));
-                               free(data);
-                               return NULL;
-                       }
-               }
-       }
-
-       /* trim the allocation down to size */
-       data = realloc(data, iter);
-       *readamt = iter;
-
-       return data;
-}
-
 static int transfer_first_stage(libusb_device_handle * handle, struct 
arg_state *args)
 {
        unsigned char *buffer = NULL;
-- 
2.30.2


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to