[PATCH 2/5] scripts: Add common library functions
Sascha Hauer
s.hauer at pengutronix.de
Wed Oct 6 07:22:51 PDT 2021
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 <s.hauer at pengutronix.de>
---
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
More information about the barebox
mailing list