Nathan Moinvaziri | aa323f5 | 2017-10-05 23:32:57 -0700 | [diff] [blame] | 1 | /* mz_os.h -- System functions |
Nathan Moinvaziri | db95894 | 2021-01-23 16:18:11 -0800 | [diff] [blame] | 2 | part of the minizip-ng project |
Nathan Moinvaziri | aa323f5 | 2017-10-05 23:32:57 -0700 | [diff] [blame] | 3 | |
Nathan Moinvaziri | db95894 | 2021-01-23 16:18:11 -0800 | [diff] [blame] | 4 | Copyright (C) 2010-2021 Nathan Moinvaziri |
| 5 | https://github.com/zlib-ng/minizip-ng |
Nathan Moinvaziri | aa323f5 | 2017-10-05 23:32:57 -0700 | [diff] [blame] | 6 | |
| 7 | This program is distributed under the terms of the same license as zlib. |
| 8 | See the accompanying LICENSE file for the full text of the license. |
| 9 | */ |
| 10 | |
Nathan Moinvaziri | 408940f | 2018-05-09 09:42:31 -0700 | [diff] [blame] | 11 | #ifndef MZ_OS_H |
| 12 | #define MZ_OS_H |
Nathan Moinvaziri | aa323f5 | 2017-10-05 23:32:57 -0700 | [diff] [blame] | 13 | |
Nathan Moinvaziri | aa323f5 | 2017-10-05 23:32:57 -0700 | [diff] [blame] | 14 | #ifdef __cplusplus |
| 15 | extern "C" { |
| 16 | #endif |
| 17 | |
| 18 | /***************************************************************************/ |
| 19 | |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 20 | #if defined(__APPLE__) |
Nathan Moinvaziri | 7d94b1f | 2019-05-08 23:41:47 -0700 | [diff] [blame] | 21 | # define MZ_VERSION_MADEBY_HOST_SYSTEM (MZ_HOST_SYSTEM_OSX_DARWIN) |
Cameron Cawley | 28f78ff | 2019-08-06 14:14:14 +0100 | [diff] [blame] | 22 | #elif defined(__riscos__) |
| 23 | # define MZ_VERSION_MADEBY_HOST_SYSTEM (MZ_HOST_SYSTEM_RISCOS) |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 24 | #elif defined(_WIN32) |
Nathan Moinvaziri | 7d94b1f | 2019-05-08 23:41:47 -0700 | [diff] [blame] | 25 | # define MZ_VERSION_MADEBY_HOST_SYSTEM (MZ_HOST_SYSTEM_WINDOWS_NTFS) |
Ørjan | 72459e9 | 2020-11-18 11:21:17 +0000 | [diff] [blame] | 26 | #else |
| 27 | # define MZ_VERSION_MADEBY_HOST_SYSTEM (MZ_HOST_SYSTEM_UNIX) |
Nathan Moinvaziri | aa323f5 | 2017-10-05 23:32:57 -0700 | [diff] [blame] | 28 | #endif |
| 29 | |
Nathan Moinvaziri | 1a7e7e4 | 2020-10-25 14:50:53 -0700 | [diff] [blame] | 30 | #if defined(HAVE_LZMA) || defined(HAVE_LIBCOMP) |
Nathan Moinvaziri | 7d94b1f | 2019-05-08 23:41:47 -0700 | [diff] [blame] | 31 | # define MZ_VERSION_MADEBY_ZIP_VERSION (63) |
Nathan Moinvaziri | f77766b | 2019-10-04 18:33:13 -0700 | [diff] [blame] | 32 | #elif defined(HAVE_WZAES) |
Nathan Moinvaziri | 7d94b1f | 2019-05-08 23:41:47 -0700 | [diff] [blame] | 33 | # define MZ_VERSION_MADEBY_ZIP_VERSION (51) |
Nathan Moinvaziri | f77766b | 2019-10-04 18:33:13 -0700 | [diff] [blame] | 34 | #elif defined(HAVE_BZIP2) |
Nathan Moinvaziri | 7d94b1f | 2019-05-08 23:41:47 -0700 | [diff] [blame] | 35 | # define MZ_VERSION_MADEBY_ZIP_VERSION (46) |
juanii | 30589b5 | 2018-02-08 13:12:37 -0300 | [diff] [blame] | 36 | #else |
Nathan Moinvaziri | 7d94b1f | 2019-05-08 23:41:47 -0700 | [diff] [blame] | 37 | # define MZ_VERSION_MADEBY_ZIP_VERSION (45) |
juanii | 30589b5 | 2018-02-08 13:12:37 -0300 | [diff] [blame] | 38 | #endif |
| 39 | |
Nathan Moinvaziri | 7d94b1f | 2019-05-08 23:41:47 -0700 | [diff] [blame] | 40 | #define MZ_VERSION_MADEBY ((MZ_VERSION_MADEBY_HOST_SYSTEM << 8) | \ |
| 41 | (MZ_VERSION_MADEBY_ZIP_VERSION)) |
| 42 | |
| 43 | #define MZ_PATH_SLASH_UNIX ('/') |
| 44 | #if defined(_WIN32) |
| 45 | # define MZ_PATH_SLASH_PLATFORM ('\\') |
| 46 | #else |
Nathan Moinvaziri | 034d7e6 | 2019-05-09 12:47:40 -0700 | [diff] [blame] | 47 | # define MZ_PATH_SLASH_PLATFORM (MZ_PATH_SLASH_UNIX) |
Nathan Moinvaziri | 7d94b1f | 2019-05-08 23:41:47 -0700 | [diff] [blame] | 48 | #endif |
juanii | 30589b5 | 2018-02-08 13:12:37 -0300 | [diff] [blame] | 49 | |
| 50 | /***************************************************************************/ |
| 51 | |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 52 | #if defined(_WIN32) |
| 53 | struct dirent { |
| 54 | char d_name[256]; |
| 55 | }; |
| 56 | typedef void* DIR; |
Nathan Moinvaziri | 9fb8290 | 2018-10-25 21:21:58 -0700 | [diff] [blame] | 57 | #else |
| 58 | #include <dirent.h> |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 59 | #endif |
Nathan Moinvaziri | aa323f5 | 2017-10-05 23:32:57 -0700 | [diff] [blame] | 60 | |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 61 | /***************************************************************************/ |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 62 | /* Shared functions */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 63 | |
| 64 | int32_t mz_path_combine(char *path, const char *join, int32_t max_path); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 65 | /* Combines two paths */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 66 | |
Nathan Moinvaziri | 7d94b1f | 2019-05-08 23:41:47 -0700 | [diff] [blame] | 67 | int32_t mz_path_append_slash(char *path, int32_t max_path, char slash); |
| 68 | /* Appends a path slash on to the end of the path */ |
Nathan Moinvaziri | 3249eac | 2019-05-02 21:07:39 -0700 | [diff] [blame] | 69 | |
| 70 | int32_t mz_path_remove_slash(char *path); |
| 71 | /* Removes a path slash from the end of the path */ |
| 72 | |
| 73 | int32_t mz_path_has_slash(const char *path); |
| 74 | /* Returns whether or not the path ends with slash */ |
| 75 | |
Nathan Moinvaziri | 7d94b1f | 2019-05-08 23:41:47 -0700 | [diff] [blame] | 76 | int32_t mz_path_convert_slashes(char *path, char slash); |
Nathan Moinvaziri | 3a941ef | 2019-05-08 19:24:09 -0700 | [diff] [blame] | 77 | /* Converts the slashes in a path */ |
| 78 | |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 79 | int32_t mz_path_compare_wc(const char *path, const char *wildcard, uint8_t ignore_case); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 80 | /* Compare two paths with wildcard */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 81 | |
| 82 | int32_t mz_path_resolve(const char *path, char *target, int32_t max_target); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 83 | /* Resolves path */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 84 | |
| 85 | int32_t mz_path_remove_filename(char *path); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 86 | /* Remove the filename from a path */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 87 | |
Nathan Moinvaziri | 3c43816 | 2019-04-28 09:23:56 -0700 | [diff] [blame] | 88 | int32_t mz_path_remove_extension(char *path); |
| 89 | /* Remove the extension from a path */ |
| 90 | |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 91 | int32_t mz_path_get_filename(const char *path, const char **filename); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 92 | /* Get the filename from a path */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 93 | |
| 94 | int32_t mz_dir_make(const char *path); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 95 | /* Creates a directory recursively */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 96 | |
| 97 | int32_t mz_file_get_crc(const char *path, uint32_t *result_crc); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 98 | /* Gets the crc32 hash of a file */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 99 | |
| 100 | /***************************************************************************/ |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 101 | /* Platform specific functions */ |
Nathan Moinvaziri | 65a8702 | 2018-07-31 12:48:31 -0700 | [diff] [blame] | 102 | |
Nathan Moinvaziri | ea5e45d | 2018-10-30 13:59:17 -0700 | [diff] [blame] | 103 | wchar_t *mz_os_unicode_string_create(const char *string, int32_t encoding); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 104 | /* Create unicode string from a utf8 string */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 105 | |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 106 | void mz_os_unicode_string_delete(wchar_t **string); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 107 | /* Delete a unicode string that was created */ |
Nathan Moinvaziri | dd80823 | 2018-06-11 07:38:58 -0700 | [diff] [blame] | 108 | |
Nathan Moinvaziri | ea5e45d | 2018-10-30 13:59:17 -0700 | [diff] [blame] | 109 | uint8_t *mz_os_utf8_string_create(const char *string, int32_t encoding); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 110 | /* Create a utf8 string from a string with another encoding */ |
Nathan Moinvaziri | ea5e45d | 2018-10-30 13:59:17 -0700 | [diff] [blame] | 111 | |
| 112 | void mz_os_utf8_string_delete(uint8_t **string); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 113 | /* Delete a utf8 string that was created */ |
Nathan Moinvaziri | ea5e45d | 2018-10-30 13:59:17 -0700 | [diff] [blame] | 114 | |
Nathan Moinvaziri | 648f596 | 2018-10-25 19:35:50 -0700 | [diff] [blame] | 115 | int32_t mz_os_rand(uint8_t *buf, int32_t size); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 116 | /* Random number generator (not cryptographically secure) */ |
Nathan Moinvaziri | 648f596 | 2018-10-25 19:35:50 -0700 | [diff] [blame] | 117 | |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 118 | int32_t mz_os_rename(const char *source_path, const char *target_path); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 119 | /* Rename a file */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 120 | |
Nathan Moinvaziri | 3249eac | 2019-05-02 21:07:39 -0700 | [diff] [blame] | 121 | int32_t mz_os_unlink(const char *path); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 122 | /* Delete an existing file */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 123 | |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 124 | int32_t mz_os_file_exists(const char *path); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 125 | /* Check to see if a file exists */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 126 | |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 127 | int64_t mz_os_get_file_size(const char *path); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 128 | /* Gets the length of a file */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 129 | |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 130 | int32_t mz_os_get_file_date(const char *path, time_t *modified_date, time_t *accessed_date, time_t *creation_date); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 131 | /* Gets a file's modified, access, and creation dates if supported */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 132 | |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 133 | int32_t mz_os_set_file_date(const char *path, time_t modified_date, time_t accessed_date, time_t creation_date); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 134 | /* Sets a file's modified, access, and creation dates if supported */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 135 | |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 136 | int32_t mz_os_get_file_attribs(const char *path, uint32_t *attributes); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 137 | /* Gets a file's attributes */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 138 | |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 139 | int32_t mz_os_set_file_attribs(const char *path, uint32_t attributes); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 140 | /* Sets a file's attributes */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 141 | |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 142 | int32_t mz_os_make_dir(const char *path); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 143 | /* Recursively creates a directory */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 144 | |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 145 | DIR* mz_os_open_dir(const char *path); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 146 | /* Opens a directory for listing */ |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 147 | struct |
| 148 | dirent* mz_os_read_dir(DIR *dir); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 149 | /* Reads a directory listing entry */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 150 | |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 151 | int32_t mz_os_close_dir(DIR *dir); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 152 | /* Closes a directory that has been opened for listing */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 153 | |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 154 | int32_t mz_os_is_dir(const char *path); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 155 | /* Checks to see if path is a directory */ |
Nathan Moinvaziri | 8cb7df7 | 2018-10-25 08:39:48 -0700 | [diff] [blame] | 156 | |
Nathan Moinvaziri | 3249eac | 2019-05-02 21:07:39 -0700 | [diff] [blame] | 157 | int32_t mz_os_is_symlink(const char *path); |
| 158 | /* Checks to see if path is a symbolic link */ |
| 159 | |
| 160 | int32_t mz_os_make_symlink(const char *path, const char *target_path); |
| 161 | /* Creates a symbolic link pointing to a target */ |
| 162 | |
| 163 | int32_t mz_os_read_symlink(const char *path, char *target_path, int32_t max_target_path); |
| 164 | /* Gets the target path for a symbolic link */ |
| 165 | |
Nathan Moinvaziri | 21a3102 | 2018-10-24 09:50:16 -0700 | [diff] [blame] | 166 | uint64_t mz_os_ms_time(void); |
Nathan Moinvaziri | b16ab56 | 2018-11-20 16:56:21 -0800 | [diff] [blame] | 167 | /* Gets the time in milliseconds */ |
Nathan Moinvaziri | 3431a66 | 2018-05-06 16:59:31 -0700 | [diff] [blame] | 168 | |
Nathan Moinvaziri | aa323f5 | 2017-10-05 23:32:57 -0700 | [diff] [blame] | 169 | /***************************************************************************/ |
| 170 | |
| 171 | #ifdef __cplusplus |
| 172 | } |
| 173 | #endif |
| 174 | |
| 175 | #endif |