[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