From d5e2c6a3146c20354ab11f1dae48ab755996fa96 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Fri, 8 Sep 2023 18:49:54 +0200 Subject: libsqfs: bring sqfs_file_t in line with stream API Rename the open function to sqfs_file_open, use an argument for the return pointer and pass back and error number on failure. Also add an inermediate function to open an sqfs_file_t using a handle, similar to the stream API. The get_file_size function is moved to the native wrappers and some of the implementation is cleaned up a little. Signed-off-by: David Oberhollenzer --- lib/common/src/writer/init.c | 6 +-- lib/sqfs/src/io/file.c | 87 +++++++++++++++++++++++--------------------- lib/sqfs/src/io/unix.c | 14 +++++++ lib/sqfs/src/io/win32.c | 13 +++++++ 4 files changed, 76 insertions(+), 44 deletions(-) (limited to 'lib') diff --git a/lib/common/src/writer/init.c b/lib/common/src/writer/init.c index 60d7a12..bf1d2ca 100644 --- a/lib/common/src/writer/init.c +++ b/lib/common/src/writer/init.c @@ -57,9 +57,9 @@ int sqfs_writer_init(sqfs_writer_t *sqfs, const sqfs_writer_cfg_t *wrcfg) return -1; } - sqfs->outfile = sqfs_open_file(wrcfg->filename, wrcfg->outmode); - if (sqfs->outfile == NULL) { - perror(wrcfg->filename); + ret = sqfs_file_open(&sqfs->outfile, wrcfg->filename, wrcfg->outmode); + if (ret) { + sqfs_perror(wrcfg->filename, "open", ret); return -1; } diff --git a/lib/sqfs/src/io/file.c b/lib/sqfs/src/io/file.c index 27ab5d6..e6b7ee3 100644 --- a/lib/sqfs/src/io/file.c +++ b/lib/sqfs/src/io/file.c @@ -13,29 +13,14 @@ #include #include +#include -#if defined(_WIN32) || defined(__WINDOWS__) -static int get_file_size(HANDLE fd, sqfs_u64 *out) -{ - LARGE_INTEGER size; - if (!GetFileSizeEx(fd, &size)) - return -1; - *out = size.QuadPart; - return 0; -} -#else -#include +#if !defined(_WIN32) && !defined(__WINDOWS__) #include -#include -static int get_file_size(int fd, sqfs_u64 *out) -{ - struct stat sb; - if (fstat(fd, &sb)) - return -1; - *out = sb.st_size; - return 0; -} +#define ERROR_NOT_ENOUGH_MEMORY ENOMEM +#define ERROR_NOT_SUPPORTED ENOTSUP +#define SetLastError(x) errno = (x) #endif typedef struct { @@ -64,11 +49,7 @@ static sqfs_object_t *stdio_copy(const sqfs_object_t *base) size_t size; if (!file->readonly) { -#if defined(_WIN32) || defined(__WINDOWS__) SetLastError(ERROR_NOT_SUPPORTED); -#else - errno = ENOTSUP; -#endif return NULL; } @@ -232,13 +213,16 @@ static const char *stdio_get_filename(sqfs_file_t *file) return ((sqfs_file_stdio_t *)file)->name; } -sqfs_file_t *sqfs_open_file(const char *filename, sqfs_u32 flags) +int sqfs_file_open_handle(sqfs_file_t **out, const char *filename, + sqfs_file_handle_t fd, sqfs_u32 flags) { - bool file_opened = false; sqfs_file_stdio_t *file; size_t size, namelen; sqfs_file_t *base; os_error_t err; + int ret; + + *out = NULL; namelen = strlen(filename); size = sizeof(*file) + 1; @@ -254,12 +238,15 @@ sqfs_file_t *sqfs_open_file(const char *filename, sqfs_u32 flags) sqfs_object_init(file, stdio_destroy, stdio_copy); memcpy(file->name, filename, namelen); - if (sqfs_native_file_open(&file->fd, filename, flags)) - goto fail; + ret = sqfs_native_file_get_size(fd, &file->size); + if (ret) + goto fail_free; + + ret = sqfs_native_file_duplicate(fd, &file->fd); + if (ret) + goto fail_free; - file_opened = true; - if (get_file_size(file->fd, &file->size)) - goto fail; + sqfs_native_file_close(fd); file->readonly = (flags & SQFS_FILE_OPEN_READ_ONLY) != 0; @@ -268,19 +255,37 @@ sqfs_file_t *sqfs_open_file(const char *filename, sqfs_u32 flags) base->get_size = stdio_get_size; base->truncate = stdio_truncate; base->get_filename = stdio_get_filename; - return base; -fail: + + *out = base; + return 0; +fail_free: err = get_os_error_state(); - if (file_opened) - sqfs_native_file_close(file->fd); free(file); set_os_error_state(err); - return NULL; + return ret; fail_no_mem: -#if defined(_WIN32) || defined(__WINDOWS__) SetLastError(ERROR_NOT_ENOUGH_MEMORY); -#else - errno = ENOMEM; -#endif - return NULL; + return SQFS_ERROR_ALLOC; +} + +int sqfs_file_open(sqfs_file_t **out, const char *filename, sqfs_u32 flags) +{ + sqfs_file_handle_t fd; + int ret; + + ret = sqfs_native_file_open(&fd, filename, flags); + if (ret) { + *out = NULL; + return ret; + } + + ret = sqfs_file_open_handle(out, filename, fd, flags); + if (ret) { + os_error_t err = get_os_error_state(); + sqfs_native_file_close(fd); + set_os_error_state(err); + return ret; + } + + return 0; } diff --git a/lib/sqfs/src/io/unix.c b/lib/sqfs/src/io/unix.c index 2e97394..cac8e55 100644 --- a/lib/sqfs/src/io/unix.c +++ b/lib/sqfs/src/io/unix.c @@ -10,6 +10,7 @@ #include "sqfs/io.h" #include "sqfs/error.h" +#include #include #include #include @@ -85,3 +86,16 @@ int sqfs_native_file_seek(sqfs_file_handle_t fd, return 0; } + +int sqfs_native_file_get_size(sqfs_file_handle_t hnd, sqfs_u64 *out) +{ + struct stat sb; + + if (fstat(hnd, &sb)) { + *out = 0; + return SQFS_ERROR_IO; + } + + *out = sb.st_size; + return 0; +} diff --git a/lib/sqfs/src/io/win32.c b/lib/sqfs/src/io/win32.c index bc625e4..fd10ab1 100644 --- a/lib/sqfs/src/io/win32.c +++ b/lib/sqfs/src/io/win32.c @@ -118,3 +118,16 @@ int sqfs_native_file_seek(sqfs_file_handle_t fd, return 0; } + +int sqfs_native_file_get_size(sqfs_file_handle_t hnd, sqfs_u64 *out) +{ + LARGE_INTEGER size; + + if (!GetFileSizeEx(hnd, &size)) { + *out = 0; + return SQFS_ERROR_IO; + } + + *out = size.QuadPart; + return 0; +} -- cgit v1.2.3