X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;ds=sidebyside;f=include%2Fwimlib.h;h=a46dcf5f7eef5ec8442da596680dd609938b753e;hb=HEAD;hp=3b3d3425833ce1b3071e98369685a34ec3c493a9;hpb=dcdce8f085b55b0907e84ff88d43c96003d84458;p=wimlib
diff --git a/include/wimlib.h b/include/wimlib.h
index 3b3d3425..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.9.2, 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 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.
+ * 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.
*
* @section sec_installing Installing
*
@@ -30,14 +30,16 @@
* @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 the libwim-15.dll file. Make
- * sure to also download the source code so you can get wimlib.h, as it is not
- * included in the binary distribution. If you need to access the DLL from
- * other programming languages, note that the calling convention is "cdecl".
+ * 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.
*
- * Note that wimlib is developed using MinGW-w64, and there may be a little work
- * required if you plan to use the header and DLL with Visual Studio.
+ * If you need to access the DLL from non-C/C++ programming languages, note that
+ * the calling convention is "cdecl".
+ *
+ * If you want to build wimlib from source on Windows, see README.WINDOWS. This
+ * is only needed if you are making modifications to wimlib.
*
* @section sec_examples Examples
*
@@ -45,7 +47,7 @@
* distribution. Also see @ref sec_basic_wim_handling_concepts below.
*
* There is also the
+ * href="https://wimlib.net/git/?p=wimlib;a=blob;f=programs/imagex.c">
* source code of wimlib-imagex, which is complicated but uses most
* capabilities of wimlib.
*
@@ -141,20 +143,21 @@
* messages and strings (as well as all documentation, for that matter) are only
* available in English.
*
- * @section sec_encodings Locales and character encodings
+ * @section sec_encodings Character encoding
*
* To support Windows as well as UNIX-like systems, wimlib's API typically takes
- * and returns strings of ::wimlib_tchar, which are in a platform-dependent
- * encoding.
+ * and returns strings of ::wimlib_tchar which have a platform-dependent type
+ * and encoding.
*
- * On Windows, each ::wimlib_tchar is 2 bytes and is the same as a "wchar_t",
- * and the encoding is UTF-16LE.
+ * On Windows, each ::wimlib_tchar is a 2-byte wchar_t. The encoding
+ * is meant to be UTF-16LE. However, unpaired surrogates are permitted because
+ * neither Windows nor the NTFS filesystem forbids them in filenames.
*
- * On UNIX-like systems, each ::wimlib_tchar is 1 byte and is simply a "char",
- * and the encoding is the locale-dependent multibyte encoding. I recommend you
- * set your locale to a UTF-8 capable locale to avoid any issues. Also, by
- * default, wimlib on UNIX will assume the locale is UTF-8 capable unless you
- * call wimlib_global_init() after having set your desired locale.
+ * On UNIX-like systems, each ::wimlib_tchar is a 1 byte char. The
+ * encoding is meant to be UTF-8. However, for compatibility with Windows-style
+ * filenames that are not valid UTF-16LE, surrogate codepoints are permitted.
+ * Other multibyte encodings (e.g. ISO-8859-1) or garbage sequences of bytes are
+ * not permitted.
*
* @section sec_advanced Additional information and features
*
@@ -387,10 +390,39 @@
#include
#include
-#include
-#include
+#ifndef __cplusplus
+# if defined(_MSC_VER) && _MSC_VER < 1800 /* VS pre-2013? */
+ typedef unsigned char bool;
+# else
+# include
+# endif
+#endif
+#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
* @{ */
@@ -398,15 +430,41 @@
#define WIMLIB_MAJOR_VERSION 1
/** Minor version of the library (for example, the 2 in 1.2.5). */
-#define WIMLIB_MINOR_VERSION 9
+#define WIMLIB_MINOR_VERSION 14
/** Patch version of the library (for example, the 5 in 1.2.5). */
-#define WIMLIB_PATCH_VERSION 2
+#define WIMLIB_PATCH_VERSION 4
#ifdef __cplusplus
extern "C" {
#endif
+/*
+ * 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;
+#else
+ int32_t tv_sec;
+#endif
+ /* Nanoseconds (0-999999999) */
+ int32_t tv_nsec;
+};
+#else
+# define wimlib_timespec timespec /* standard definition */
+#endif
+
/**
* Opaque structure that represents a WIM, possibly backed by an on-disk file.
* See @ref sec_basic_wim_handling_concepts for more information.
@@ -416,14 +474,14 @@ typedef struct WIMStruct WIMStruct;
#define WIMLIB_WIMSTRUCT_DECLARED
#endif
-#ifdef __WIN32__
+#ifdef _WIN32
typedef wchar_t wimlib_tchar;
#else
/** See @ref sec_encodings */
typedef char wimlib_tchar;
#endif
-#ifdef __WIN32__
+#ifdef _WIN32
/** Path separator for WIM paths passed back to progress callbacks.
* This is forward slash on UNIX and backslash on Windows. */
# define WIMLIB_WIM_PATH_SEPARATOR '\\'
@@ -613,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
@@ -789,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
@@ -812,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,
@@ -1357,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.
*/
@@ -1390,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
@@ -1558,13 +1626,13 @@ struct wimlib_dir_entry {
uint64_t hard_link_group_id;
/** Time this file was created. */
- struct timespec creation_time;
+ struct wimlib_timespec creation_time;
/** Time this file was last written to. */
- struct timespec last_write_time;
+ struct wimlib_timespec last_write_time;
/** Time this file was last accessed. */
- struct timespec last_access_time;
+ struct wimlib_timespec last_access_time;
/** The UNIX user ID of this file. This is a wimlib extension.
*
@@ -1593,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.
@@ -1678,8 +1760,9 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour
/** UNIX-like systems only: Store the UNIX owner, group, mode, and device ID
* (major and minor number) of each file. In addition, capture special files
- * such as device nodes and FIFOs. See the documentation for the
- * --unix-data option to wimcapture for more information. */
+ * such as device nodes and FIFOs. Since wimlib v1.11.0, on Linux also capture
+ * extended attributes. See the documentation for the --unix-data option
+ * to wimcapture for more information. */
#define WIMLIB_ADD_FLAG_UNIX_DATA 0x00000010
/** Do not capture security descriptors. Only has an effect in NTFS-3G capture
@@ -1871,9 +1954,12 @@ 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
-/** UNIX-like systems only: Extract special UNIX data captured with
- * ::WIMLIB_ADD_FLAG_UNIX_DATA. This flag cannot be combined with
- * ::WIMLIB_EXTRACT_FLAG_NTFS. */
+/** 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
/** Do not extract security descriptors. This flag cannot be combined with
@@ -2033,8 +2119,7 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour
* name, a colon, then the name of the data stream. */
#define WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_WINDOWS 0x00000010
-/** Use UNIX metadata if available in the WIM image. See
- * ::WIMLIB_ADD_FLAG_UNIX_DATA. */
+/** Support UNIX owners, groups, modes, and special files. */
#define WIMLIB_MOUNT_FLAG_UNIX_DATA 0x00000020
/** Allow other users to see the mounted filesystem. This passes the @c
@@ -2323,9 +2408,7 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour
/** @addtogroup G_general
* @{ */
-/** Assume that strings are represented in UTF-8, even if this is not the
- * locale's character encoding. This flag is ignored on Windows, where wimlib
- * always uses UTF-16LE. */
+/** Deprecated; no longer has any effect. */
#define WIMLIB_INIT_FLAG_ASSUME_UTF8 0x00000001
/** Windows-only: do not attempt to acquire additional privileges (currently
@@ -2462,7 +2545,6 @@ enum wimlib_error_code {
WIMLIB_ERR_DECOMPRESSION = 2,
WIMLIB_ERR_FUSE = 6,
WIMLIB_ERR_GLOB_HAD_NO_MATCHES = 8,
- WIMLIB_ERR_ICONV_NOT_AVAILABLE = 9,
WIMLIB_ERR_IMAGE_COUNT = 10,
WIMLIB_ERR_IMAGE_NAME_COLLISION = 11,
WIMLIB_ERR_INSUFFICIENT_PRIVILEGES = 12,
@@ -2475,7 +2557,6 @@ enum wimlib_error_code {
WIMLIB_ERR_INVALID_INTEGRITY_TABLE = 19,
WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY = 20,
WIMLIB_ERR_INVALID_METADATA_RESOURCE = 21,
- WIMLIB_ERR_INVALID_MULTIBYTE_STRING = 22,
WIMLIB_ERR_INVALID_OVERLAY = 23,
WIMLIB_ERR_INVALID_PARAM = 24,
WIMLIB_ERR_INVALID_PART_NUMBER = 25,
@@ -2538,6 +2619,8 @@ enum wimlib_error_code {
WIMLIB_ERR_DUPLICATE_EXPORTED_IMAGE = 87,
WIMLIB_ERR_CONCURRENT_MODIFICATION_DETECTED = 88,
WIMLIB_ERR_SNAPSHOT_FAILURE = 89,
+ WIMLIB_ERR_INVALID_XATTR = 90,
+ WIMLIB_ERR_SET_XATTR = 91,
};
@@ -2577,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);
@@ -2633,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,
@@ -2650,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,
@@ -2667,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);
@@ -2691,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.
*
@@ -2700,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);
/**
@@ -2731,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);
/**
@@ -2742,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);
@@ -2814,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,
@@ -2933,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);
@@ -2975,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);
@@ -2989,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,
@@ -3008,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,
@@ -3088,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,
@@ -3110,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);
/**
@@ -3125,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);
/**
@@ -3141,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);
/**
@@ -3157,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);
/**
@@ -3166,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);
/**
@@ -3177,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);
/**
@@ -3208,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);
@@ -3223,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
*
@@ -3240,7 +3336,7 @@ wimlib_get_version(void);
*
* @return 0
*/
-extern int
+WIMLIBAPI int
wimlib_get_wim_info(WIMStruct *wim, struct wimlib_wim_info *info);
/**
@@ -3270,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);
/**
@@ -3278,9 +3374,8 @@ wimlib_get_xml_data(WIMStruct *wim, void **buf_ret, size_t *bufsize_ret);
*
* Initialization function for wimlib. Call before using any other wimlib
* function (except possibly wimlib_set_print_errors()). If not done manually,
- * this function will be called automatically with @p init_flags set to
- * ::WIMLIB_INIT_FLAG_ASSUME_UTF8. This function does nothing if called again
- * after it has already successfully run.
+ * this function will be called automatically with a flags argument of 0. This
+ * function does nothing if called again after it has already successfully run.
*
* @param init_flags
* Bitwise OR of flags prefixed with WIMLIB_INIT_FLAG.
@@ -3292,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);
/**
@@ -3301,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);
/**
@@ -3320,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);
/**
@@ -3367,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);
@@ -3401,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);
@@ -3442,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,
@@ -3460,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,
@@ -3469,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
@@ -3545,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,
@@ -3564,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.
*
@@ -3621,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);
@@ -3637,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,
@@ -3703,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);
/**
@@ -3726,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);
/**
@@ -3734,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);
/**
@@ -3778,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,
@@ -3805,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);
@@ -3871,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);
@@ -3891,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);
@@ -3905,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);
@@ -3939,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);
@@ -3955,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);
/**
@@ -3976,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);
/**
@@ -3990,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);
@@ -4001,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);
/**
@@ -4010,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);
/**
@@ -4050,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);
@@ -4083,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));
@@ -4113,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);
/**
@@ -4122,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);
/**
@@ -4144,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);
@@ -4154,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);
@@ -4175,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);
/**
@@ -4206,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);
@@ -4246,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,
@@ -4291,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);
/**
@@ -4327,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);
/**
@@ -4338,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,
@@ -4434,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,
@@ -4502,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,
@@ -4529,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,
@@ -4587,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);
/**
@@ -4598,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);
@@ -4673,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,
@@ -4699,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);
@@ -4710,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);
/**
@@ -4746,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);
@@ -4778,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);
@@ -4789,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);