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