[PATCH 2/3] fwts: Add file_open_and_read_binary

Jeremy Kerr jk at ozlabs.org
Thu May 21 07:15:07 UTC 2015


Add a function to open and read a binary file in a single chunk.

Signed-off-by: Jeremy Kerr <jk at ozlabs.org>

---
 src/lib/include/fwts_fileio.h |    1 
 src/lib/src/fwts_fileio.c     |   45 ++++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+)

diff --git a/src/lib/include/fwts_fileio.h b/src/lib/include/fwts_fileio.h
index 33b727b..e9fdced 100644
--- a/src/lib/include/fwts_fileio.h
+++ b/src/lib/include/fwts_fileio.h
@@ -24,5 +24,6 @@
 
 fwts_list* fwts_file_read(FILE *fp);
 fwts_list* fwts_file_open_and_read(const char *file);
+int fwts_file_open_and_read_binary(const char *file, char **buf, size_t *len);
 
 #endif
diff --git a/src/lib/src/fwts_fileio.c b/src/lib/src/fwts_fileio.c
index ca99631..5875a32 100644
--- a/src/lib/src/fwts_fileio.c
+++ b/src/lib/src/fwts_fileio.c
@@ -17,6 +17,7 @@
  *
  */
 
+#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -61,3 +62,47 @@ fwts_list* fwts_file_open_and_read(const char *file)
 
 	return list;
 }
+
+int fwts_file_open_and_read_binary(const char *file, char **buf, size_t *len)
+{
+	size_t tmplen;
+	char *tmpbuf;
+	long pos;
+	FILE *fp;
+	int rc;
+
+	if ((fp = fopen(file, "rb")) == NULL)
+		return FWTS_ERROR;
+
+	rc = fseek(fp, 0, SEEK_END);
+	if (rc) {
+		rc = FWTS_ERROR;
+		goto out;
+	}
+
+	pos = ftell(fp);
+	if (pos < 0) {
+		rc = FWTS_ERROR;
+		goto out;
+	}
+
+	rewind(fp);
+
+	tmpbuf = malloc(pos);
+	assert(tmpbuf);
+
+	tmplen = fread(tmpbuf, 1, pos, fp);
+	if (tmplen != (size_t)pos) {
+		free(tmpbuf);
+		rc = FWTS_ERROR;
+		goto out;
+	}
+
+	rc = FWTS_OK;
+	*buf = tmpbuf;
+	*len = tmplen;
+
+out:
+	fclose(fp);
+	return rc;
+}



More information about the fwts-devel mailing list