diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2023-06-12 23:17:49 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2023-06-15 13:38:25 +0200 |
commit | 89cdef0859259fdea0165b0d3918777d1ed42955 (patch) | |
tree | 1773321fd7d1c718b89fe0face92c9c7cdafc2f4 /include | |
parent | 043495538ebaf02adba6d40764fb3e6def65cb09 (diff) |
libsquashfs: Add sqfs_open_native_file function
Having a function to interpret the flags and open a native file handle
simplifies the istream/ostream/file code which shares that decoding
part, particularly on windows where the character set needs to be
transformed.
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'include')
-rw-r--r-- | include/io/file.h | 14 | ||||
-rw-r--r-- | include/sqfs/io.h | 38 |
2 files changed, 41 insertions, 11 deletions
diff --git a/include/io/file.h b/include/io/file.h index fa0abc0..5065619 100644 --- a/include/io/file.h +++ b/include/io/file.h @@ -7,15 +7,7 @@ #ifndef IO_FILE_H #define IO_FILE_H -#include "io/istream.h" - -#if defined(_WIN32) || defined(__WINDOWS__) -#include <handleapi.h> - -typedef HANDLE os_file_t; -#else -typedef int os_file_t; -#endif +#include "sqfs/io.h" #ifdef __cplusplus extern "C" { @@ -36,7 +28,7 @@ extern "C" { * @return A pointer to an output stream on success, NULL on failure. */ SQFS_INTERNAL -sqfs_istream_t *istream_open_handle(const char *path, os_file_t fd); +sqfs_istream_t *istream_open_handle(const char *path, sqfs_file_handle_t fd); /** * @brief Create an output stream that writes to an OS native file handle. @@ -55,7 +47,7 @@ sqfs_istream_t *istream_open_handle(const char *path, os_file_t fd); * @return A pointer to an output stream on success, NULL on failure. */ SQFS_INTERNAL sqfs_ostream_t *ostream_open_handle(const char *path, - os_file_t hnd, + sqfs_file_handle_t hnd, int flags); /** diff --git a/include/sqfs/io.h b/include/sqfs/io.h index 4291e71..1138fc0 100644 --- a/include/sqfs/io.h +++ b/include/sqfs/io.h @@ -34,6 +34,20 @@ */ /** + * @typedef sqfs_file_handle_t + * + * @brief Native handle type for file I/O + */ + +#if defined(_WIN32) || defined(__WINDOWS__) +#include <handleapi.h> + +typedef HANDLE sqfs_file_handle_t; +#else +typedef int sqfs_file_handle_t; +#endif + +/** * @enum SQFS_FILE_OPEN_FLAGS * * @brief Flags for @ref sqfs_open_file @@ -273,6 +287,30 @@ extern "C" { #endif /** + * @brief Open a native file handle + * + * On Unix-like systems, this generates a file descriptor that needs to be + * closed with close(). If opening fails, errno is preseved. + * + * On Windows, a HANDLE is created that needs to be disposed of + * using CloseHandle(). If opening fails, GetLastError() is preseved. + * If @ref SQFS_FILE_OPEN_NO_CHARSET_XFRM is set, the given string is passed + * to the ANSI API that interprets the string according to the the currently + * set codepage. If the flag is not present, the string is assumed to be UTF-8, + * the function internally converts it to UTF-16 and uses the wide char API. + * + * @param out Returns a native file handle on success + * @param filename The path to the file to open + * @param flags A set of @ref SQFS_FILE_OPEN_FLAGS controlling how the + * file is opened. + * + * @return Zero on success, a negative @ref SQFS_ERROR code on failure. + * If an unknown flag was used, @ref SQFS_ERROR_UNSUPPORTED is returned. + */ +SQFS_API int sqfs_open_native_file(sqfs_file_handle_t *out, + const char *filename, sqfs_u32 flags); + +/** * @brief Open a file through the operating systems filesystem API * * This function internally creates an instance of a reference implementation |