[PATCH v2 012/113] libfile: factor out read_file_into_buf helper

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



We do open -> read_full -> close at a number of places. Add a function
that does this all at once and start using it to implement read_file.

More users can follow later.

Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx>
---
 include/libfile.h |  4 ++++
 lib/libfile.c     | 44 ++++++++++++++++++++++++++++++--------------
 2 files changed, 34 insertions(+), 14 deletions(-)

diff --git a/include/libfile.h b/include/libfile.h
index 423e7ffec5b7..1240276e1d74 100644
--- a/include/libfile.h
+++ b/include/libfile.h
@@ -2,12 +2,16 @@
 #ifndef __LIBFILE_H
 #define __LIBFILE_H
 
+#include <linux/types.h>
+
 int pread_full(int fd, void *buf, size_t size, loff_t offset);
 int pwrite_full(int fd, const void *buf, size_t size, loff_t offset);
 int write_full(int fd, const void *buf, size_t size);
 int read_full(int fd, void *buf, size_t size);
 int copy_fd(int in, int out);
 
+ssize_t read_file_into_buf(const char *filename, void *buf, size_t size);
+
 char *read_file_line(const char *fmt, ...);
 
 void *read_file(const char *filename, size_t *size);
diff --git a/lib/libfile.c b/lib/libfile.c
index 185c7af721b5..67fc9cc7f3a2 100644
--- a/lib/libfile.c
+++ b/lib/libfile.c
@@ -186,6 +186,33 @@ char *read_file_line(const char *fmt, ...)
 }
 EXPORT_SYMBOL_GPL(read_file_line);
 
+/**
+ * read_file_into_buf - read a file to an external buffer
+ * @filename:  The filename to read
+ * @buf:       The buffer to read into
+ * @size:      The buffer size
+ *
+ * This function reads a file to an external buffer. At maximum @size
+ * bytes are read.
+ *
+ * Return: number of bytes read, or negative error code.
+ */
+ssize_t read_file_into_buf(const char *filename, void *buf, size_t size)
+{
+	int fd;
+	ssize_t ret;
+
+	fd = open(filename, O_RDONLY);
+	if (fd < 0)
+		return fd;
+
+	ret = read_full(fd, buf, size);
+
+	close(fd);
+
+	return ret;
+}
+
 /**
  * read_file_2 - read a file to an allocated buffer
  * @filename:  The filename to read
@@ -208,11 +235,10 @@ EXPORT_SYMBOL_GPL(read_file_line);
 int read_file_2(const char *filename, size_t *size, void **outbuf,
 		loff_t max_size)
 {
-	int fd;
 	struct stat s;
 	void *buf = NULL;
 	const char *tmpfile = "/.read_file_tmp";
-	int ret;
+	ssize_t ret;
 	loff_t read_size;
 
 again:
@@ -240,17 +266,9 @@ int read_file_2(const char *filename, size_t *size, void **outbuf,
 		goto err_out;
 	}
 
-	fd = open(filename, O_RDONLY);
-	if (fd < 0) {
-		ret = fd;
-		goto err_out;
-	}
-
-	ret = read_full(fd, buf, read_size);
+	ret = read_file_into_buf(filename, buf, read_size);
 	if (ret < 0)
-		goto err_out1;
-
-	close(fd);
+		goto err_out;
 
 	if (size)
 		*size = ret;
@@ -265,8 +283,6 @@ int read_file_2(const char *filename, size_t *size, void **outbuf,
 
 	return 0;
 
-err_out1:
-	close(fd);
 err_out:
 	free(buf);
 
-- 
2.39.2





[Index of Archives]     [Linux Embedded]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux