X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=include%2Fwimlib.h;h=a46dcf5f7eef5ec8442da596680dd609938b753e;hp=2a957a70700eef0286873168f04c1763a8930322;hb=HEAD;hpb=a75b34a63cd4b1331efb4a535d7c90dd34994c47 diff --git a/include/wimlib.h b/include/wimlib.h index 2a957a70..84f1e2ec 100644 --- a/include/wimlib.h +++ b/include/wimlib.h @@ -11,12 +11,12 @@ /** * @mainpage * - * This is the documentation for the library interface of wimlib 1.10.0, a C + * This is the documentation for the library interface of wimlib 1.14.4, a C * library for creating, modifying, extracting, and mounting files in the * Windows Imaging (WIM) format. This documentation is intended for developers * only. If you have installed wimlib and want to know how to use the @b * wimlib-imagex program, please see the manual pages and also the README file. + * href="https://wimlib.net/git/?p=wimlib;a=blob;f=README.md">README file. * * @section sec_installing Installing * @@ -30,9 +30,8 @@ * @subsection Windows * * Download the Windows binary distribution with the appropriate architecture - * (i686 or x86_64 --- also called "x86" and "amd64" respectively) from - * https://wimlib.net. Link your program with libwim-15.dll. If needed by your - * programming language or development environment, the import library + * from https://wimlib.net. Link your program with libwim-15.dll. If needed by + * your programming language or development environment, the import library * libwim.lib and C/C++ header wimlib.h can be found in the directory "devel" in * the ZIP file. * @@ -401,6 +400,29 @@ #include #include +#ifdef BUILDING_WIMLIB + /* + * On i386, gcc assumes that the stack is 16-byte aligned at function entry. + * However, some compilers (e.g. MSVC) and programming languages (e.g. Delphi) + * only guarantee 4-byte alignment when calling functions. This is mainly an + * issue on Windows, but it can occur on Linux too. Work around this ABI + * incompatibility by realigning the stack pointer when entering the library. + * This prevents crashes in SSE/AVX code. + */ +# if defined(__GNUC__) && defined(__i386__) +# define WIMLIB_ALIGN_STACK __attribute__((force_align_arg_pointer)) +# else +# define WIMLIB_ALIGN_STACK +# endif +# ifdef _WIN32 +# define WIMLIBAPI __declspec(dllexport) WIMLIB_ALIGN_STACK +# else +# define WIMLIBAPI __attribute__((visibility("default"))) WIMLIB_ALIGN_STACK +# endif +#else +# define WIMLIBAPI +#endif + /** @addtogroup G_general * @{ */ @@ -408,25 +430,28 @@ #define WIMLIB_MAJOR_VERSION 1 /** Minor version of the library (for example, the 2 in 1.2.5). */ -#define WIMLIB_MINOR_VERSION 10 +#define WIMLIB_MINOR_VERSION 14 /** Patch version of the library (for example, the 5 in 1.2.5). */ -#define WIMLIB_PATCH_VERSION 0 +#define WIMLIB_PATCH_VERSION 4 #ifdef __cplusplus extern "C" { #endif /* - * To represent file timestamps, wimlib's API uses the POSIX 'struct timespec'. - * This was probably a mistake because it doesn't play well with Visual Studio. - * In old VS versions it isn't present at all; in newer VS versions it is - * supposedly present, but I wouldn't trust it to be the same size as the one - * MinGW uses. The solution is to define a compatible structure ourselves when - * this header is included on Windows and the compiler is not MinGW. - */ -#if defined(_WIN32) && !defined(__GNUC__) -typedef struct { + * To represent file timestamps, wimlib's API originally used the POSIX 'struct + * timespec'. This was a mistake because when building wimlib for 32-bit + * Windows with MinGW we ended up originally using 32-bit time_t which isn't + * year 2038-safe, and therefore we had to later add fields like + * 'creation_time_high' to hold the high 32 bits of each timestamp. Moreover, + * old Visual Studio versions did not define struct timespec, while newer ones + * define it but with 64-bit tv_sec. So to at least avoid a missing or + * incompatible 'struct timespec' definition, define the correct struct + * ourselves when this header is included on Windows. + */ +#ifdef _WIN32 +struct wimlib_timespec { /* Seconds since start of UNIX epoch (January 1, 1970) */ #ifdef _WIN64 int64_t tv_sec; @@ -435,9 +460,9 @@ typedef struct { #endif /* Nanoseconds (0-999999999) */ int32_t tv_nsec; -} wimlib_timespec; +}; #else -# define wimlib_timespec struct timespec /* standard definition */ +# define wimlib_timespec timespec /* standard definition */ #endif /** @@ -646,7 +671,8 @@ enum wimlib_progress_msg { * to ::wimlib_progress_info.write_streams. This message may be * received many times while the WIM file is being written or appended * to with wimlib_write(), wimlib_overwrite(), or wimlib_write_to_fd(). - */ + * Since wimlib v1.13.4 it will also be received when a split WIM part + * is being written by wimlib_split(). */ WIMLIB_PROGRESS_MSG_WRITE_STREAMS = 12, /** Per-image metadata is about to be written to the WIM file. @p info @@ -822,7 +848,8 @@ union wimlib_progress_info { /** The number of bytes of file data that have been written so * far. This starts at 0 and ends at @p total_bytes. This * number is the uncompressed size; the actual size may be lower - * due to compression. */ + * due to compression. See @p completed_compressed_bytes for + * the compressed size. */ uint64_t completed_bytes; /** The number of distinct file data "blobs" that have been @@ -845,6 +872,10 @@ union wimlib_progress_info { /** This is currently broken and will always be 0. */ uint32_t completed_parts; + + /** Since wimlib v1.13.4: Like @p completed_bytes, but counts + * the compressed size. */ + uint64_t completed_compressed_bytes; } write_streams; /** Valid on messages ::WIMLIB_PROGRESS_MSG_SCAN_BEGIN, @@ -1390,20 +1421,23 @@ struct wimlib_wim_info { * sha1_hash. This case can only occur with wimlib_iterate_dir_tree(), never * wimlib_iterate_lookup_table(). * - * 2. Otherwise we know the sha1_hash, the uncompressed_size, the - * reference_count, and the is_metadata flag. In addition: + * 2. Otherwise we know the uncompressed_size, the reference_count, and the + * is_metadata flag. In addition: * * A. If the blob is located in a non-solid WIM resource, then we also know - * the compressed_size and offset. + * the sha1_hash, compressed_size, and offset. * * B. If the blob is located in a solid WIM resource, then we also know the - * offset, raw_resource_offset_in_wim, raw_resource_compressed_size, and - * raw_resource_uncompressed_size. But the "offset" is actually the - * offset in the uncompressed solid resource rather than the offset from - * the beginning of the WIM file. + * sha1_hash, offset, raw_resource_offset_in_wim, + * raw_resource_compressed_size, and raw_resource_uncompressed_size. But + * the "offset" is actually the offset in the uncompressed solid resource + * rather than the offset from the beginning of the WIM file. * - * C. If the blob is *not* located in any type of WIM resource, then we don't - * know any additional information. + * C. If the blob is *not* located in any type of WIM resource, for example + * if it's in a external file that was scanned by wimlib_add_image(), then + * we usually won't know any more information. The sha1_hash might be + * known, and prior to wimlib v1.13.6 it always was; however, in wimlib + * v1.13.6 and later, the sha1_hash might not be known in this case. * * Unknown or irrelevant fields are left zeroed. */ @@ -1423,7 +1457,8 @@ struct wimlib_resource_entry { * of this blob within that solid resource when uncompressed. */ uint64_t offset; - /** The SHA-1 message digest of the blob's uncompressed contents. */ + /** If this blob is located in a WIM resource, then this is the SHA-1 + * message digest of the blob's uncompressed contents. */ uint8_t sha1_hash[20]; /** If this blob is located in a WIM resource, then this is the part @@ -1591,13 +1626,13 @@ struct wimlib_dir_entry { uint64_t hard_link_group_id; /** Time this file was created. */ - wimlib_timespec creation_time; + struct wimlib_timespec creation_time; /** Time this file was last written to. */ - wimlib_timespec last_write_time; + struct wimlib_timespec last_write_time; /** Time this file was last accessed. */ - wimlib_timespec last_access_time; + struct wimlib_timespec last_access_time; /** The UNIX user ID of this file. This is a wimlib extension. * @@ -1626,7 +1661,21 @@ struct wimlib_dir_entry { * object_id.object_id is not all zeroes. */ struct wimlib_object_id object_id; - uint64_t reserved[6]; + /** High 32 bits of the seconds portion of the creation timestamp, + * filled in if @p wimlib_timespec.tv_sec is only 32-bit. */ + int32_t creation_time_high; + + /** High 32 bits of the seconds portion of the last write timestamp, + * filled in if @p wimlib_timespec.tv_sec is only 32-bit. */ + int32_t last_write_time_high; + + /** High 32 bits of the seconds portion of the last access timestamp, + * filled in if @p wimlib_timespec.tv_sec is only 32-bit. */ + int32_t last_access_time_high; + + int32_t reserved2; + + uint64_t reserved[4]; /** * Variable-length array of streams that make up this file. @@ -1905,6 +1954,10 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour * wimlib_extract_paths() when passed multiple paths. */ #define WIMLIB_EXTRACT_FLAG_NTFS 0x00000001 +/** Since wimlib v1.13.4: Don't consider corrupted files to be an error. Just + * extract them in whatever form we can. */ +#define WIMLIB_EXTRACT_FLAG_RECOVER_DATA 0x00000002 + /** UNIX-like systems only: Extract UNIX-specific metadata captured with * ::WIMLIB_ADD_FLAG_UNIX_DATA. */ #define WIMLIB_EXTRACT_FLAG_UNIX_DATA 0x00000020 @@ -2607,7 +2660,7 @@ enum wimlib_error_code { * @retval ::WIMLIB_ERR_IMAGE_NAME_COLLISION * The WIM already contains an image with the requested name. */ -extern int +WIMLIBAPI int wimlib_add_empty_image(WIMStruct *wim, const wimlib_tchar *name, int *new_idx_ret); @@ -2663,7 +2716,7 @@ wimlib_add_empty_image(WIMStruct *wim, * In addition, if ::WIMLIB_ADD_FLAG_VERBOSE is specified in @p add_flags, it * will receive ::WIMLIB_PROGRESS_MSG_SCAN_DENTRY. */ -extern int +WIMLIBAPI int wimlib_add_image(WIMStruct *wim, const wimlib_tchar *source, const wimlib_tchar *name, @@ -2680,7 +2733,7 @@ wimlib_add_image(WIMStruct *wim, * same as wimlib_add_image(). See the documentation for wimcapture for * full details on how this mode works. */ -extern int +WIMLIBAPI int wimlib_add_image_multisource(WIMStruct *wim, const struct wimlib_capture_source *sources, size_t num_sources, @@ -2697,7 +2750,7 @@ wimlib_add_image_multisource(WIMStruct *wim, * This just builds an appropriate ::wimlib_add_command and passes it to * wimlib_update_image(). */ -extern int +WIMLIBAPI int wimlib_add_tree(WIMStruct *wim, int image, const wimlib_tchar *fs_source_path, const wimlib_tchar *wim_target_path, int add_flags); @@ -2721,7 +2774,7 @@ wimlib_add_tree(WIMStruct *wim, int image, * @param wim_ret * On success, a pointer to the new ::WIMStruct is written to the memory * location pointed to by this parameter. This ::WIMStruct must be freed - * using using wimlib_free() when finished with it. + * using wimlib_free() when finished with it. * * @return 0 on success; a ::wimlib_error_code value on failure. * @@ -2730,7 +2783,7 @@ wimlib_add_tree(WIMStruct *wim, int image, * @retval ::WIMLIB_ERR_NOMEM * Insufficient memory to allocate a new ::WIMStruct. */ -extern int +WIMLIBAPI int wimlib_create_new_wim(enum wimlib_compression_type ctype, WIMStruct **wim_ret); /** @@ -2761,7 +2814,7 @@ wimlib_create_new_wim(enum wimlib_compression_type ctype, WIMStruct **wim_ret); * If this function fails when @p image was ::WIMLIB_ALL_IMAGES, then it's * possible that some but not all of the images were deleted. */ -extern int +WIMLIBAPI int wimlib_delete_image(WIMStruct *wim, int image); /** @@ -2772,7 +2825,7 @@ wimlib_delete_image(WIMStruct *wim, int image); * This just builds an appropriate ::wimlib_delete_command and passes it to * wimlib_update_image(). */ -extern int +WIMLIBAPI int wimlib_delete_path(WIMStruct *wim, int image, const wimlib_tchar *path, int delete_flags); @@ -2844,7 +2897,7 @@ wimlib_delete_path(WIMStruct *wim, int image, * indicate failure (for different reasons) to read the metadata resource for an * image in @p src_wim that needed to be exported. */ -extern int +WIMLIBAPI int wimlib_export_image(WIMStruct *src_wim, int src_image, WIMStruct *dest_wim, const wimlib_tchar *dest_name, @@ -2963,7 +3016,7 @@ wimlib_export_image(WIMStruct *src_wim, int src_image, * ::WIMLIB_PROGRESS_MSG_EXTRACT_METADATA messages, then * ::WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END. */ -extern int +WIMLIBAPI int wimlib_extract_image(WIMStruct *wim, int image, const wimlib_tchar *target, int extract_flags); @@ -3005,7 +3058,7 @@ wimlib_extract_image(WIMStruct *wim, int image, * @retval ::WIMLIB_ERR_NOT_PIPABLE * The WIM being piped over @p pipe_fd is a normal WIM, not a pipable WIM. */ -extern int +WIMLIBAPI int wimlib_extract_image_from_pipe(int pipe_fd, const wimlib_tchar *image_num_or_name, const wimlib_tchar *target, int extract_flags); @@ -3019,7 +3072,7 @@ wimlib_extract_image_from_pipe(int pipe_fd, * ::WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS, in addition to * ::WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN. */ -extern int +WIMLIBAPI int wimlib_extract_image_from_pipe_with_progress(int pipe_fd, const wimlib_tchar *image_num_or_name, const wimlib_tchar *target, @@ -3038,12 +3091,15 @@ wimlib_extract_image_from_pipe_with_progress(int pipe_fd, * are otherwise delimited by the newline character. However, quotes will be * stripped if present. * + * If @p path_list_file is @c NULL, then the pathlist file is read from standard + * input. + * * The error codes are the same as those returned by wimlib_extract_paths(), * except that wimlib_extract_pathlist() returns an appropriate error code if it * cannot read the path list file (e.g. ::WIMLIB_ERR_OPEN, ::WIMLIB_ERR_STAT, * ::WIMLIB_ERR_READ). */ -extern int +WIMLIBAPI int wimlib_extract_pathlist(WIMStruct *wim, int image, const wimlib_tchar *target, const wimlib_tchar *path_list_file, @@ -3118,7 +3174,7 @@ wimlib_extract_pathlist(WIMStruct *wim, int image, * If a progress function is registered with @p wim, then it will receive * ::WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS. */ -extern int +WIMLIBAPI int wimlib_extract_paths(WIMStruct *wim, int image, const wimlib_tchar *target, @@ -3140,7 +3196,7 @@ wimlib_extract_paths(WIMStruct *wim, * @retval ::WIMLIB_ERR_WRITE * Failed to write the data to the requested file. */ -extern int +WIMLIBAPI int wimlib_extract_xml_data(WIMStruct *wim, FILE *fp); /** @@ -3155,7 +3211,7 @@ wimlib_extract_xml_data(WIMStruct *wim, FILE *fp); * @param wim * Pointer to the ::WIMStruct to release. If @c NULL, no action is taken. */ -extern void +WIMLIBAPI void wimlib_free(WIMStruct *wim); /** @@ -3171,7 +3227,7 @@ wimlib_free(WIMStruct *wim); * "None", "LZX", or "XPRESS". If the value was unrecognized, then * the resulting string will be "Invalid". */ -extern const wimlib_tchar * +WIMLIBAPI const wimlib_tchar * wimlib_get_compression_type_string(enum wimlib_compression_type ctype); /** @@ -3187,7 +3243,7 @@ wimlib_get_compression_type_string(enum wimlib_compression_type ctype); * the value was unrecognized, then the resulting string will be "Unknown * error". */ -extern const wimlib_tchar * +WIMLIBAPI const wimlib_tchar * wimlib_get_error_string(enum wimlib_error_code code); /** @@ -3196,7 +3252,7 @@ wimlib_get_error_string(enum wimlib_error_code code); * Get the description of the specified image. Equivalent to * wimlib_get_image_property(wim, image, "DESCRIPTION"). */ -extern const wimlib_tchar * +WIMLIBAPI const wimlib_tchar * wimlib_get_image_description(const WIMStruct *wim, int image); /** @@ -3207,7 +3263,7 @@ wimlib_get_image_description(const WIMStruct *wim, int image); * wimlib_get_image_name() will return an empty string if the image is unnamed * whereas wimlib_get_image_property() may return @c NULL in that case. */ -extern const wimlib_tchar * +WIMLIBAPI const wimlib_tchar * wimlib_get_image_name(const WIMStruct *wim, int image); /** @@ -3238,7 +3294,7 @@ wimlib_get_image_name(const WIMStruct *wim, int image); * no such property. The string may not remain valid after later library * calls, so the caller should duplicate it if needed. */ -extern const wimlib_tchar * +WIMLIBAPI const wimlib_tchar * wimlib_get_image_property(const WIMStruct *wim, int image, const wimlib_tchar *property_name); @@ -3253,9 +3309,19 @@ wimlib_get_image_property(const WIMStruct *wim, int image, * 20) | (WIMLIB_MINOR_VERSION << 10) | WIMLIB_PATCH_VERSION) for the * corresponding header file. */ -extern uint32_t +WIMLIBAPI uint32_t wimlib_get_version(void); +/** + * @ingroup G_general + * + * Since wimlib v1.13.0: like wimlib_get_version(), but returns the full + * PACKAGE_VERSION string that was set at build time. (This allows a beta + * release to be distinguished from an official release.) + */ +WIMLIBAPI const wimlib_tchar * +wimlib_get_version_string(void); + /** * @ingroup G_wim_information * @@ -3270,7 +3336,7 @@ wimlib_get_version(void); * * @return 0 */ -extern int +WIMLIBAPI int wimlib_get_wim_info(WIMStruct *wim, struct wimlib_wim_info *info); /** @@ -3300,7 +3366,7 @@ wimlib_get_wim_info(WIMStruct *wim, struct wimlib_wim_info *info); * @retval ::WIMLIB_ERR_UNEXPECTED_END_OF_FILE * Failed to read the XML document from the WIM file. */ -extern int +WIMLIBAPI int wimlib_get_xml_data(WIMStruct *wim, void **buf_ret, size_t *bufsize_ret); /** @@ -3321,7 +3387,7 @@ wimlib_get_xml_data(WIMStruct *wim, void **buf_ret, size_t *bufsize_ret); * ::WIMLIB_INIT_FLAG_STRICT_CAPTURE_PRIVILEGES were specified in @p * init_flags, but the corresponding privileges could not be acquired. */ -extern int +WIMLIBAPI int wimlib_global_init(int init_flags); /** @@ -3330,7 +3396,7 @@ wimlib_global_init(int init_flags); * Cleanup function for wimlib. You are not required to call this function, but * it will release any global resources allocated by the library. */ -extern void +WIMLIBAPI void wimlib_global_cleanup(void); /** @@ -3349,7 +3415,7 @@ wimlib_global_cleanup(void); * if there is no image named @p name in @p wim. If @p name is @c NULL or * the empty string, then @c false is returned. */ -extern bool +WIMLIBAPI bool wimlib_image_name_in_use(const WIMStruct *wim, const wimlib_tchar *name); /** @@ -3396,7 +3462,7 @@ wimlib_image_name_in_use(const WIMStruct *wim, const wimlib_tchar *name); * indicate failure (for different reasons) to read the metadata resource for an * image over which iteration needed to be done. */ -extern int +WIMLIBAPI int wimlib_iterate_dir_tree(WIMStruct *wim, int image, const wimlib_tchar *path, int flags, wimlib_iterate_dir_tree_callback_t cb, void *user_ctx); @@ -3430,7 +3496,7 @@ wimlib_iterate_dir_tree(WIMStruct *wim, int image, const wimlib_tchar *path, * @return 0 if all calls to @p cb returned 0; otherwise the first nonzero value * that was returned from @p cb. */ -extern int +WIMLIBAPI int wimlib_iterate_lookup_table(WIMStruct *wim, int flags, wimlib_iterate_lookup_table_callback_t cb, void *user_ctx); @@ -3471,7 +3537,7 @@ wimlib_iterate_lookup_table(WIMStruct *wim, int flags, * an easy-to-use wrapper around this that has some advantages (e.g. extra * sanity checks). */ -extern int +WIMLIBAPI int wimlib_join(const wimlib_tchar * const *swms, unsigned num_swms, const wimlib_tchar *output_path, @@ -3489,7 +3555,7 @@ wimlib_join(const wimlib_tchar * const *swms, * ::WIMLIB_PROGRESS_MSG_VERIFY_INTEGRITY messages when each of the split WIM * parts is opened. */ -extern int +WIMLIBAPI int wimlib_join_with_progress(const wimlib_tchar * const *swms, unsigned num_swms, const wimlib_tchar *output_path, @@ -3498,6 +3564,24 @@ wimlib_join_with_progress(const wimlib_tchar * const *swms, wimlib_progress_func_t progfunc, void *progctx); +/** + * @ingroup G_general + * + * Load a UTF-8 or UTF-16LE encoded text file into memory. + * + * @param path + * The path to the file, or NULL or "-" to use standard input. + * @param tstr_ret + * On success, a buffer containing the file's text as a "wimlib_tchar" + * string is returned here. The buffer must be freed using free(). + * @param tstr_nchars_ret + * On success, the length of the text in "wimlib_tchar"s is returned here. + * + * @return 0 on success; a ::wimlib_error_code value on failure. + */ +WIMLIBAPI int +wimlib_load_text_file(const wimlib_tchar *path, + wimlib_tchar **tstr_ret, size_t *tstr_nchars_ret); /** * @ingroup G_mounting_wim_images @@ -3574,7 +3658,7 @@ wimlib_join_with_progress(const wimlib_tchar * const *swms, * To unmount the image, call wimlib_unmount_image(). This may be done in a * different process. */ -extern int +WIMLIBAPI int wimlib_mount_image(WIMStruct *wim, int image, const wimlib_tchar *dir, @@ -3593,8 +3677,8 @@ wimlib_mount_image(WIMStruct *wim, * @param wim_ret * On success, a pointer to a new ::WIMStruct backed by the specified * on-disk WIM file is written to the memory location pointed to by this - * parameter. This ::WIMStruct must be freed using using wimlib_free() - * when finished with it. + * parameter. This ::WIMStruct must be freed using wimlib_free() when + * finished with it. * * @return 0 on success; a ::wimlib_error_code value on failure. * @@ -3650,7 +3734,7 @@ wimlib_mount_image(WIMStruct *wim, * @retval ::WIMLIB_ERR_XML * The XML data of the WIM was invalid. */ -extern int +WIMLIBAPI int wimlib_open_wim(const wimlib_tchar *wim_file, int open_flags, WIMStruct **wim_ret); @@ -3666,7 +3750,7 @@ wimlib_open_wim(const wimlib_tchar *wim_file, * progress function will receive ::WIMLIB_PROGRESS_MSG_VERIFY_INTEGRITY * messages while checking the WIM file's integrity. */ -extern int +WIMLIBAPI int wimlib_open_wim_with_progress(const wimlib_tchar *wim_file, int open_flags, WIMStruct **wim_ret, @@ -3732,7 +3816,7 @@ wimlib_open_wim_with_progress(const wimlib_tchar *wim_file, * ::WIMLIB_PROGRESS_MSG_WRITE_METADATA_BEGIN, and * ::WIMLIB_PROGRESS_MSG_WRITE_METADATA_END. */ -extern int +WIMLIBAPI int wimlib_overwrite(WIMStruct *wim, int write_flags, unsigned num_threads); /** @@ -3755,7 +3839,7 @@ wimlib_overwrite(WIMStruct *wim, int write_flags, unsigned num_threads); * This function is deprecated; use wimlib_get_xml_data() or * wimlib_get_image_property() to query image information instead. */ -extern void +WIMLIBAPI void wimlib_print_available_images(const WIMStruct *wim, int image); /** @@ -3763,7 +3847,7 @@ wimlib_print_available_images(const WIMStruct *wim, int image); * * Print the header of the WIM file (intended for debugging only). */ -extern void +WIMLIBAPI void wimlib_print_header(const WIMStruct *wim); /** @@ -3807,7 +3891,7 @@ wimlib_print_header(const WIMStruct *wim); * This function can additionally return most values that can be returned by * wimlib_open_wim(). */ -extern int +WIMLIBAPI int wimlib_reference_resource_files(WIMStruct *wim, const wimlib_tchar * const *resource_wimfiles_or_globs, unsigned count, @@ -3834,7 +3918,7 @@ wimlib_reference_resource_files(WIMStruct *wim, * * @return 0 on success; a ::wimlib_error_code value on failure. */ -extern int +WIMLIBAPI int wimlib_reference_resources(WIMStruct *wim, WIMStruct **resource_wims, unsigned num_resource_wims, int ref_flags); @@ -3900,7 +3984,7 @@ wimlib_reference_resources(WIMStruct *wim, WIMStruct **resource_wims, * indicate failure (for different reasons) to read the metadata resource for * the template image. */ -extern int +WIMLIBAPI int wimlib_reference_template_image(WIMStruct *wim, int new_image, WIMStruct *template_wim, int template_image, int flags); @@ -3920,7 +4004,7 @@ wimlib_reference_template_image(WIMStruct *wim, int new_image, * The value which will be passed as the third argument to calls to @p * progfunc. */ -extern void +WIMLIBAPI void wimlib_register_progress_function(WIMStruct *wim, wimlib_progress_func_t progfunc, void *progctx); @@ -3934,7 +4018,7 @@ wimlib_register_progress_function(WIMStruct *wim, * This just builds an appropriate ::wimlib_rename_command and passes it to * wimlib_update_image(). */ -extern int +WIMLIBAPI int wimlib_rename_path(WIMStruct *wim, int image, const wimlib_tchar *source_path, const wimlib_tchar *dest_path); @@ -3968,7 +4052,7 @@ wimlib_rename_path(WIMStruct *wim, int image, * images, an unnamed image must be specified by index to eliminate the * ambiguity.) */ -extern int +WIMLIBAPI int wimlib_resolve_image(WIMStruct *wim, const wimlib_tchar *image_name_or_num); @@ -3984,12 +4068,9 @@ wimlib_resolve_image(WIMStruct *wim, * This also enables error messages, as if by a call to * wimlib_set_print_errors(true). * - * @return 0 on success; a ::wimlib_error_code value on failure. - * - * @retval ::WIMLIB_ERR_UNSUPPORTED - * wimlib was compiled using the --without-error-messages option. + * @return 0 */ -extern int +WIMLIBAPI int wimlib_set_error_file(FILE *fp); /** @@ -4005,10 +4086,8 @@ wimlib_set_error_file(FILE *fp); * * @retval ::WIMLIB_ERR_OPEN * The file named by @p path could not be opened for appending. - * @retval ::WIMLIB_ERR_UNSUPPORTED - * wimlib was compiled using the --without-error-messages option. */ -extern int +WIMLIBAPI int wimlib_set_error_file_by_name(const wimlib_tchar *path); /** @@ -4019,7 +4098,7 @@ wimlib_set_error_file_by_name(const wimlib_tchar *path); * * Note that "description" is misspelled in the name of this function. */ -extern int +WIMLIBAPI int wimlib_set_image_descripton(WIMStruct *wim, int image, const wimlib_tchar *description); @@ -4030,7 +4109,7 @@ wimlib_set_image_descripton(WIMStruct *wim, int image, * (usually something like "Core" or "Ultimate"). Equivalent to * wimlib_set_image_property(wim, image, "FLAGS", flags). */ -extern int +WIMLIBAPI int wimlib_set_image_flags(WIMStruct *wim, int image, const wimlib_tchar *flags); /** @@ -4039,7 +4118,7 @@ wimlib_set_image_flags(WIMStruct *wim, int image, const wimlib_tchar *flags); * Change the name of a WIM image. Equivalent to * wimlib_set_image_property(wim, image, "NAME", name). */ -extern int +WIMLIBAPI int wimlib_set_image_name(WIMStruct *wim, int image, const wimlib_tchar *name); /** @@ -4079,7 +4158,7 @@ wimlib_set_image_name(WIMStruct *wim, int image, const wimlib_tchar *name); * @p property_name has an unsupported format, or @p property_name included * a bracketed index that was too high. */ -extern int +WIMLIBAPI int wimlib_set_image_property(WIMStruct *wim, int image, const wimlib_tchar *property_name, const wimlib_tchar *property_value); @@ -4112,7 +4191,7 @@ wimlib_set_image_property(WIMStruct *wim, int image, * * @return 0 */ -extern int +WIMLIBAPI int wimlib_set_memory_allocator(void *(*malloc_func)(size_t), void (*free_func)(void *), void *(*realloc_func)(void *, size_t)); @@ -4142,7 +4221,7 @@ wimlib_set_memory_allocator(void *(*malloc_func)(size_t), * @p chunk_size was not 0 or a supported chunk size for the currently * selected output compression type. */ -extern int +WIMLIBAPI int wimlib_set_output_chunk_size(WIMStruct *wim, uint32_t chunk_size); /** @@ -4151,7 +4230,7 @@ wimlib_set_output_chunk_size(WIMStruct *wim, uint32_t chunk_size); * Similar to wimlib_set_output_chunk_size(), but set the chunk size for writing * solid resources. */ -extern int +WIMLIBAPI int wimlib_set_output_pack_chunk_size(WIMStruct *wim, uint32_t chunk_size); /** @@ -4173,7 +4252,7 @@ wimlib_set_output_pack_chunk_size(WIMStruct *wim, uint32_t chunk_size); * @retval ::WIMLIB_ERR_INVALID_COMPRESSION_TYPE * @p ctype did not specify a valid compression type. */ -extern int +WIMLIBAPI int wimlib_set_output_compression_type(WIMStruct *wim, enum wimlib_compression_type ctype); @@ -4183,7 +4262,7 @@ wimlib_set_output_compression_type(WIMStruct *wim, * Similar to wimlib_set_output_compression_type(), but set the compression type * for writing solid resources. This cannot be ::WIMLIB_COMPRESSION_TYPE_NONE. */ -extern int +WIMLIBAPI int wimlib_set_output_pack_compression_type(WIMStruct *wim, enum wimlib_compression_type ctype); @@ -4204,12 +4283,9 @@ wimlib_set_output_pack_compression_type(WIMStruct *wim, * @c true if messages are to be printed; @c false if messages are not to * be printed. * - * @return 0 on success; a ::wimlib_error_code value on failure. - * - * @retval ::WIMLIB_ERR_UNSUPPORTED - * wimlib was compiled using the --without-error-messages option. + * @return 0 */ -extern int +WIMLIBAPI int wimlib_set_print_errors(bool show_messages); /** @@ -4235,7 +4311,7 @@ wimlib_set_print_errors(bool show_messages); * ::wimlib_wim_info.boot_index did not specify 0 or a valid 1-based image * index in the WIM. */ -extern int +WIMLIBAPI int wimlib_set_wim_info(WIMStruct *wim, const struct wimlib_wim_info *info, int which); @@ -4275,9 +4351,11 @@ wimlib_set_wim_info(WIMStruct *wim, const struct wimlib_wim_info *info, * If a progress function is registered with @p wim, then for each split WIM * part that is written it will receive the messages * ::WIMLIB_PROGRESS_MSG_SPLIT_BEGIN_PART and - * ::WIMLIB_PROGRESS_MSG_SPLIT_END_PART. + * ::WIMLIB_PROGRESS_MSG_SPLIT_END_PART. Since wimlib v1.13.4 it will also + * receive ::WIMLIB_PROGRESS_MSG_WRITE_STREAMS messages while writing each part; + * these messages will report the progress of the current part only. */ -extern int +WIMLIBAPI int wimlib_split(WIMStruct *wim, const wimlib_tchar *swm_name, uint64_t part_size, @@ -4320,7 +4398,7 @@ wimlib_split(WIMStruct *wim, * ::WIMLIB_PROGRESS_MSG_END_VERIFY_IMAGE, and * ::WIMLIB_PROGRESS_MSG_VERIFY_STREAMS. */ -extern int +WIMLIBAPI int wimlib_verify_wim(WIMStruct *wim, int verify_flags); /** @@ -4356,7 +4434,7 @@ wimlib_verify_wim(WIMStruct *wim, int verify_flags); * by using the @c umount or @c fusermount programs. However, you need to call * this function if you want changes to be committed. */ -extern int +WIMLIBAPI int wimlib_unmount_image(const wimlib_tchar *dir, int unmount_flags); /** @@ -4367,7 +4445,7 @@ wimlib_unmount_image(const wimlib_tchar *dir, int unmount_flags); * message. In addition, if changes are committed from a read-write mount, the * progress function will receive ::WIMLIB_PROGRESS_MSG_WRITE_STREAMS messages. */ -extern int +WIMLIBAPI int wimlib_unmount_image_with_progress(const wimlib_tchar *dir, int unmount_flags, wimlib_progress_func_t progfunc, @@ -4463,7 +4541,7 @@ wimlib_unmount_image_with_progress(const wimlib_tchar *dir, * indicate failure (for different reasons) to read the metadata resource for an * image that needed to be updated. */ -extern int +WIMLIBAPI int wimlib_update_image(WIMStruct *wim, int image, const struct wimlib_update_command *cmds, @@ -4531,7 +4609,7 @@ wimlib_update_image(WIMStruct *wim, * ::WIMLIB_PROGRESS_MSG_WRITE_METADATA_BEGIN, and * ::WIMLIB_PROGRESS_MSG_WRITE_METADATA_END. */ -extern int +WIMLIBAPI int wimlib_write(WIMStruct *wim, const wimlib_tchar *path, int image, @@ -4558,7 +4636,7 @@ wimlib_write(WIMStruct *wim, * @p fd was not seekable, but ::WIMLIB_WRITE_FLAG_PIPABLE was not * specified in @p write_flags. */ -extern int +WIMLIBAPI int wimlib_write_to_fd(WIMStruct *wim, int fd, int image, @@ -4616,7 +4694,7 @@ struct wimlib_decompressor; * @retval ::WIMLIB_ERR_INVALID_COMPRESSION_TYPE * @p ctype was neither a supported compression type nor -1. */ -extern int +WIMLIBAPI int wimlib_set_default_compression_level(int ctype, unsigned int compression_level); /** @@ -4627,7 +4705,7 @@ wimlib_set_default_compression_level(int ctype, unsigned int compression_level); * compression type is invalid, or the @p max_block_size for that compression * type is invalid. */ -extern uint64_t +WIMLIBAPI uint64_t wimlib_get_compressor_needed_memory(enum wimlib_compression_type ctype, size_t max_block_size, unsigned int compression_level); @@ -4702,7 +4780,7 @@ wimlib_get_compressor_needed_memory(enum wimlib_compression_type ctype, * @retval ::WIMLIB_ERR_NOMEM * Insufficient memory to allocate the compressor. */ -extern int +WIMLIBAPI int wimlib_create_compressor(enum wimlib_compression_type ctype, size_t max_block_size, unsigned int compression_level, @@ -4728,7 +4806,7 @@ wimlib_create_compressor(enum wimlib_compression_type ctype, * The size of the compressed data, in bytes, or 0 if the data could not be * compressed to @p compressed_size_avail or fewer bytes. */ -extern size_t +WIMLIBAPI size_t wimlib_compress(const void *uncompressed_data, size_t uncompressed_size, void *compressed_data, size_t compressed_size_avail, struct wimlib_compressor *compressor); @@ -4739,7 +4817,7 @@ wimlib_compress(const void *uncompressed_data, size_t uncompressed_size, * @param compressor * The compressor to free. If @c NULL, no action is taken. */ -extern void +WIMLIBAPI void wimlib_free_compressor(struct wimlib_compressor *compressor); /** @@ -4775,7 +4853,7 @@ wimlib_free_compressor(struct wimlib_compressor *compressor); * @retval ::WIMLIB_ERR_NOMEM * Insufficient memory to allocate the decompressor. */ -extern int +WIMLIBAPI int wimlib_create_decompressor(enum wimlib_compression_type ctype, size_t max_block_size, struct wimlib_decompressor **decompressor_ret); @@ -4807,7 +4885,7 @@ wimlib_create_decompressor(enum wimlib_compression_type ctype, * as the @p uncompressed_size parameter. If this is not done correctly, * decompression may fail or the data may be decompressed incorrectly. */ -extern int +WIMLIBAPI int wimlib_decompress(const void *compressed_data, size_t compressed_size, void *uncompressed_data, size_t uncompressed_size, struct wimlib_decompressor *decompressor); @@ -4818,7 +4896,7 @@ wimlib_decompress(const void *compressed_data, size_t compressed_size, * @param decompressor * The decompressor to free. If @c NULL, no action is taken. */ -extern void +WIMLIBAPI void wimlib_free_decompressor(struct wimlib_decompressor *decompressor);