X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=include%2Fwimlib.h;h=728d132af45f57bc0b3e80645c85905ae370cc8d;hp=fc6526aeda2b88f963152142d4cbfc338024ad94;hb=b5b9681794d1f5f13350e3567f6f6e74f5c779cf;hpb=927b1829e714d177de9d38c2da7fcdc13be44ed0 diff --git a/include/wimlib.h b/include/wimlib.h index fc6526ae..728d132a 100644 --- a/include/wimlib.h +++ b/include/wimlib.h @@ -33,7 +33,7 @@ * * @section sec_intro Introduction * - * This is the documentation for the library interface of wimlib 1.6.2, a C + * This is the documentation for the library interface of wimlib 1.6.3, 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 @@ -170,7 +170,7 @@ * documented in the man page for @b wimlib-imagex. * * - The old WIM format from Vista pre-releases is not supported. - * - wimlib does not provide a clone of the @b PEImg tool, or the @b Dism + * - wimlib does not provide a clone of the @b PEImg tool, or the @b DISM * functionality other than that already present in @b ImageX, that allows you * to make certain Windows-specific modifications to a Windows PE image, such * as adding a driver or Windows component. Such a tool could be implemented @@ -283,17 +283,28 @@ * image read-write is an alternative to calling wimlib_update_image(). */ -/** @defgroup G_progress Progress Messages +/** + * @defgroup G_progress Progress Messages * * @brief Track the progress of long WIM operations. * - * When operating on large archives, operations such as extraction will - * naturally take a while to complete. Because of this and to improve the - * potential user-friendliness of library clients, a number of functions take a - * pointer to a progress function of type ::wimlib_progress_func_t. This - * function will be called periodically during the WIM operation(s) to report on - * the progress of the operation (for example, how many bytes have been written - * so far). + * Library users can provide a progress function which will be called + * periodically during operations such as extracting a WIM image or writing a + * WIM image. A ::WIMStruct can have a progress function of type + * ::wimlib_progress_func_t associated with it by calling + * wimlib_register_progress_function() or by opening the ::WIMStruct using + * wimlib_open_wim_with_progress(). Once this is done, the progress function + * will be called automatically during many operations, such as + * wimlib_extract_image() and wimlib_write(). + * + * Some functions that do not operate directly on a user-provided ::WIMStruct, + * such as wimlib_join(), also take the progress function directly using an + * extended version of the function, such as wimlib_join_with_progress(). + * + * In wimlib v1.6.3 and later, progress functions are no longer just + * unidirectional. You can now return ::WIMLIB_PROGRESS_STATUS_ABORT to cause + * the current operation to be aborted. wimlib v1.6.3 also added the third + * argument to ::wimlib_progress_func_t, which is a user-supplied context. */ /** @defgroup G_writing_and_overwriting_wims Writing and Overwriting WIMs @@ -345,7 +356,7 @@ #define WIMLIB_MINOR_VERSION 6 /** Patch version of the library (for example, the 5 in 1.2.5). */ -#define WIMLIB_PATCH_VERSION 2 +#define WIMLIB_PATCH_VERSION 3 #ifdef __cplusplus extern "C" { @@ -451,134 +462,136 @@ enum wimlib_progress_msg { * This message is received only once per wimlib_extract_paths() and * wimlib_extract_pathlist(), since wimlib combines all paths into a * single extraction operation for optimization purposes. */ - WIMLIB_PROGRESS_MSG_EXTRACT_TREE_BEGIN, - - /** The directory structure and other preliminary metadata is about to - * be extracted. @p info will point to ::wimlib_progress_info.extract. - * This message is received once after either - * ::WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_BEGIN or - * ::WIMLIB_PROGRESS_MSG_EXTRACT_TREE_BEGIN. */ - WIMLIB_PROGRESS_MSG_EXTRACT_DIR_STRUCTURE_BEGIN, - - /** Confirms that the directory structure and other preliminary metadata - * has been successfully extracted. @p info will point to - * ::wimlib_progress_info.extract. This message is paired with a - * preceding ::WIMLIB_PROGRESS_MSG_EXTRACT_DIR_STRUCTURE_BEGIN message. - */ - WIMLIB_PROGRESS_MSG_EXTRACT_DIR_STRUCTURE_END, + WIMLIB_PROGRESS_MSG_EXTRACT_TREE_BEGIN = 1, /** File data is currently being extracted. @p info will point to * ::wimlib_progress_info.extract. This is the main message to track * the progress of an extraction operation. */ - WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS, + WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS = 4, /** Starting to read a new part of a split pipable WIM over the pipe. * @p info will point to ::wimlib_progress_info.extract. */ - WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN, - - /** All data for WIM files and directories have been extracted, and - * final metadata such as timestamps is about to be extracted. @p info - * will point to ::wimlib_progress_info.extract. This message is - * received once before ::WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END or - * ::WIMLIB_PROGRESS_MSG_EXTRACT_TREE_END. */ - WIMLIB_PROGRESS_MSG_APPLY_TIMESTAMPS, + WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN = 5, /** Confirms that the image has been successfully extracted. @p info * will point to ::wimlib_progress_info.extract. This is paired with * ::WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_BEGIN. */ - WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END, + WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END = 7, /** Confirms that the files or directory trees have been successfully * extracted. @p info will point to ::wimlib_progress_info.extract. * This is paired with ::WIMLIB_PROGRESS_MSG_EXTRACT_TREE_BEGIN. */ - WIMLIB_PROGRESS_MSG_EXTRACT_TREE_END, + WIMLIB_PROGRESS_MSG_EXTRACT_TREE_END = 8, /** The directory or NTFS volume is about to be scanned for metadata. * @p info will point to ::wimlib_progress_info.scan. This message is * received once per call to wimlib_add_image(), or once per capture * source passed to wimlib_add_image_multisource(), or once per add * command passed to wimlib_update_image(). */ - WIMLIB_PROGRESS_MSG_SCAN_BEGIN, + WIMLIB_PROGRESS_MSG_SCAN_BEGIN = 9, /** A directory or file has been scanned. @p info will point to * ::wimlib_progress_info.scan, and its @p cur_path member will be * valid. This message is only sent if ::WIMLIB_ADD_FLAG_VERBOSE has * been specified. */ - WIMLIB_PROGRESS_MSG_SCAN_DENTRY, + WIMLIB_PROGRESS_MSG_SCAN_DENTRY = 10, /** Confirms that the directory or NTFS volume has been successfully * scanned. @p info will point to ::wimlib_progress_info.scan. This is * paired with a previous ::WIMLIB_PROGRESS_MSG_SCAN_BEGIN message, * possibly with many intervening ::WIMLIB_PROGRESS_MSG_SCAN_DENTRY * messages. */ - WIMLIB_PROGRESS_MSG_SCAN_END, + WIMLIB_PROGRESS_MSG_SCAN_END = 11, /** File resources ("streams") are currently being written to the WIM. * @p info will point 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(). */ - WIMLIB_PROGRESS_MSG_WRITE_STREAMS, + WIMLIB_PROGRESS_MSG_WRITE_STREAMS = 12, /** Per-image metadata is about to be written to the WIM file. @p info * will not be valid. */ - WIMLIB_PROGRESS_MSG_WRITE_METADATA_BEGIN, + WIMLIB_PROGRESS_MSG_WRITE_METADATA_BEGIN = 13, /** Confirms that per-image metadata has been successfully been written * to the WIM file. @p info will not be valid. This message is paired * with a preceding ::WIMLIB_PROGRESS_MSG_WRITE_METADATA_BEGIN message. */ - WIMLIB_PROGRESS_MSG_WRITE_METADATA_END, + WIMLIB_PROGRESS_MSG_WRITE_METADATA_END = 14, /** wimlib_overwrite() has successfully renamed the temporary file to * the original WIM file, thereby committing the update. @p info will * point to ::wimlib_progress_info.rename. Note: this message is not * received if wimlib_overwrite() chose to append to the WIM file * in-place. */ - WIMLIB_PROGRESS_MSG_RENAME, + WIMLIB_PROGRESS_MSG_RENAME = 15, /** The contents of the WIM file are being checked against the integrity * table. @p info will point to ::wimlib_progress_info.integrity. This * message is only received (and may be received many times) when - * wimlib_open_wim() is called with the + * wimlib_open_wim_with_progress() is called with the * ::WIMLIB_OPEN_FLAG_CHECK_INTEGRITY flag. */ - WIMLIB_PROGRESS_MSG_VERIFY_INTEGRITY, + WIMLIB_PROGRESS_MSG_VERIFY_INTEGRITY = 16, /** An integrity table is being calculated for the WIM being written. * @p info will point to ::wimlib_progress_info.integrity. This message * is only received (and may be received many times) when a WIM file is * being written with the flag ::WIMLIB_WRITE_FLAG_CHECK_INTEGRITY. */ - WIMLIB_PROGRESS_MSG_CALC_INTEGRITY, - - /** Reserved. */ - WIMLIB_PROGRESS_MSG_RESERVED, + WIMLIB_PROGRESS_MSG_CALC_INTEGRITY = 17, /** A wimlib_split() operation is in progress, and a new split part is * about to be started. @p info will point to * ::wimlib_progress_info.split. */ - WIMLIB_PROGRESS_MSG_SPLIT_BEGIN_PART, + WIMLIB_PROGRESS_MSG_SPLIT_BEGIN_PART = 19, /** A wimlib_split() operation is in progress, and a split part has been * finished. @p info will point to ::wimlib_progress_info.split. */ - WIMLIB_PROGRESS_MSG_SPLIT_END_PART, + WIMLIB_PROGRESS_MSG_SPLIT_END_PART = 20, /** A WIM update command is just about to be executed. @p info will * point to ::wimlib_progress_info.update. This message is received * once per update command when wimlib_update_image() is called with the * flag ::WIMLIB_UPDATE_FLAG_SEND_PROGRESS. */ - WIMLIB_PROGRESS_MSG_UPDATE_BEGIN_COMMAND, + WIMLIB_PROGRESS_MSG_UPDATE_BEGIN_COMMAND = 21, /** A WIM update command has just been executed. @p info will point to * ::wimlib_progress_info.update. This message is received once per * update command when wimlib_update_image() is called with the flag * ::WIMLIB_UPDATE_FLAG_SEND_PROGRESS. */ - WIMLIB_PROGRESS_MSG_UPDATE_END_COMMAND, + WIMLIB_PROGRESS_MSG_UPDATE_END_COMMAND = 22, /** A file in the WIM image is being replaced as a result of a * ::wimlib_add_command without ::WIMLIB_ADD_FLAG_NO_REPLACE specified. - * This is only received when ::WIMLIB_ADD_FLAG_VERBOSE is also - * specified in the add command. */ - WIMLIB_PROGRESS_MSG_REPLACE_FILE_IN_WIM, + * @p info will point to ::wimlib_progress_info.replace. This is only + * received when ::WIMLIB_ADD_FLAG_VERBOSE is also specified in the add + * command. */ + WIMLIB_PROGRESS_MSG_REPLACE_FILE_IN_WIM = 23, + + /** A WIM image is being applied with ::WIMLIB_EXTRACT_FLAG_WIMBOOT, and + * a file is being extracted normally (not as a WIMBoot "pointer file") + * due to it matching a pattern in the [PrepopulateList] section of the + * configuration file \Windows\System32\WimBootCompress.ini in the WIM + * image. @info will point to ::wimlib_progress_info.wimboot_exclude. + */ + WIMLIB_PROGRESS_MSG_WIMBOOT_EXCLUDE = 24, +}; + +/** Valid return values from user-provided progress functions + * (::wimlib_progress_func_t). + * + * (Note: if an invalid value is returned, ::WIMLIB_ERR_UNKNOWN_PROGRESS_STATUS + * will be issued.) + */ +enum wimlib_progress_status { + + /** The operation should be continued. This is the normal return value. + */ + WIMLIB_PROGRESS_STATUS_CONTINUE = 0, + + /** The operation should be aborted. This will cause the current + * operation to fail with ::WIMLIB_ERR_ABORTED_BY_PROGRESS. */ + WIMLIB_PROGRESS_STATUS_ABORT = 1, }; /** A pointer to this union is passed to the user-supplied @@ -673,14 +686,14 @@ union wimlib_progress_info { * ::WIMLIB_PROGRESS_MSG_SCAN_DENTRY, and * ::WIMLIB_PROGRESS_MSG_SCAN_END. */ struct wimlib_progress_info_scan { - /** Top-level directory being scanned; or, when capturing a NTFS + /** Top-level directory being scanned; or, when capturing an NTFS * volume with ::WIMLIB_ADD_FLAG_NTFS, this is instead the path * to the file or block device that contains the NTFS volume * being scanned. */ const wimlib_tchar *source; /** Path to the file (or directory) that has been scanned, valid - * on ::WIMLIB_PROGRESS_MSG_SCAN_DENTRY. When capturing a NTFS + * on ::WIMLIB_PROGRESS_MSG_SCAN_DENTRY. When capturing an NTFS * volume with ::WIMLIB_ADD_FLAG_NTFS, this path will be * relative to the root of the NTFS volume. */ const wimlib_tchar *cur_path; @@ -766,12 +779,9 @@ union wimlib_progress_info { * ::WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN, * ::WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_BEGIN, * ::WIMLIB_PROGRESS_MSG_EXTRACT_TREE_BEGIN, - * ::WIMLIB_PROGRESS_MSG_EXTRACT_DIR_STRUCTURE_BEGIN, - * ::WIMLIB_PROGRESS_MSG_EXTRACT_DIR_STRUCTURE_END, * ::WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS, - * ::WIMLIB_PROGRESS_MSG_EXTRACT_TREE_END, - * ::WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END, and - * ::WIMLIB_PROGRESS_MSG_APPLY_TIMESTAMPS. + * ::WIMLIB_PROGRESS_MSG_EXTRACT_TREE_END, and + * ::WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END. * * Note: most of the time of an extraction operation will be spent * extracting streams, and the application will receive @@ -930,19 +940,39 @@ union wimlib_progress_info { /** Path to the file in the WIM image that is being replaced */ const wimlib_tchar *path_in_wim; } replace; + + /** Valid on messages ::WIMLIB_PROGRESS_MSG_WIMBOOT_EXCLUDE */ + struct wimlib_progress_info_wimboot_exclude { + /** Path to the file in the WIM image */ + const wimlib_tchar *path_in_wim; + + /** Path to which the file is being extracted */ + const wimlib_tchar *extraction_path; + } wimboot_exclude; }; -/** A user-supplied function that will be called periodically during certain WIM - * operations. The first argument will be the type of operation that is being - * performed or is about to be started or has been completed. The second - * argument will be a pointer to one of a number of structures depending on the - * first argument. It may be @c NULL for some message types. +/** + * A user-supplied function that will be called periodically during certain WIM + * operations. * - * The return value of the progress function is currently ignored, but it may do - * something in the future. (Set it to 0 for now.) + * The first argument will be the type of operation that is being performed or + * is about to be started or has been completed. + * + * The second argument will be a pointer to one of a number of structures + * depending on the first argument. It may be @c NULL for some message types. + * Note that although this argument is not @c const, users should not modify it + * except in explicitly documented cases. + * + * The third argument will be a user-supplied value that was provided when + * registering or specifying the progress function. + * + * This function must return one of the ::wimlib_progress_status values. By + * default, you should return ::WIMLIB_PROGRESS_STATUS_CONTINUE (0). */ -typedef int (*wimlib_progress_func_t)(enum wimlib_progress_msg msg_type, - const union wimlib_progress_info *info); +typedef enum wimlib_progress_status + (*wimlib_progress_func_t)(enum wimlib_progress_msg msg_type, + union wimlib_progress_info *info, + void *progctx); /** @} */ /** @ingroup G_modifying_wims @@ -955,7 +985,7 @@ struct wimlib_capture_source { * filesystem to be included in the WIM image. */ wimlib_tchar *fs_source_path; - /** Destination path in the WIM image. Use WIMLIB_WIM_ROOT_PATH to + /** Destination path in the WIM image. Use ::WIMLIB_WIM_ROOT_PATH to * specify the root directory of the WIM image. */ wimlib_tchar *wim_target_path; @@ -1217,7 +1247,14 @@ struct wimlib_dir_entry { /** Time this file was last accessed. */ struct timespec last_access_time; - uint64_t reserved[16]; + + /* UNIX data (wimlib extension), only valid if unix_mode != 0 */ + uint32_t unix_uid; + uint32_t unix_gid; + uint32_t unix_mode; + uint32_t unix_reserved; + + uint64_t reserved[14]; /** Array of streams that make up this file. The first entry will * always exist and will correspond to the unnamed data stream (default @@ -1262,13 +1299,13 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour /** @ingroup G_modifying_wims * @{ */ -/** Directly capture a NTFS volume rather than a generic directory. This flag +/** Directly capture an NTFS volume rather than a generic directory. This flag * cannot be combined with ::WIMLIB_ADD_FLAG_DEREFERENCE or * ::WIMLIB_ADD_FLAG_UNIX_DATA. */ #define WIMLIB_ADD_FLAG_NTFS 0x00000001 -/** Follow symlinks; archive and dump the files they point to. Cannot be used - * with ::WIMLIB_ADD_FLAG_NTFS. */ +/** Follow symlinks; archive and dump the files they point to. Currently only + * supported on UNIX-like systems. */ #define WIMLIB_ADD_FLAG_DEREFERENCE 0x00000002 /** Call the progress function with the message @@ -1284,7 +1321,7 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour * alternate data stream to each regular file, symbolic link, and directory to * contain this information. Please note that this flag is for convenience * only; Microsoft's implementation will not understand this special - * information. This flag cannot be combined with ::WIMLIB_ADD_FLAG_NTFS. */ + * information. */ #define WIMLIB_ADD_FLAG_UNIX_DATA 0x00000010 /** Do not capture security descriptors. Only has an effect in NTFS capture @@ -1321,8 +1358,8 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour #define WIMLIB_ADD_FLAG_NORPFIX 0x00000200 /** Do not automatically exclude unsupported files or directories from capture; - * e.g. encrypted directories in NTFS-3g capture mode, or device files and FIFOs - * on UNIX-like systems. Instead, fail with ::WIMLIB_ERR_UNSUPPORTED_FILE when + * e.g. encrypted files in NTFS-3g capture mode, or device files and FIFOs on + * UNIX-like systems. Instead, fail with ::WIMLIB_ERR_UNSUPPORTED_FILE when * such a file is encountered. */ #define WIMLIB_ADD_FLAG_NO_UNSUPPORTED_EXCLUDE 0x00000400 @@ -1417,41 +1454,45 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour /** Give the exported image(s) no descriptions. */ #define WIMLIB_EXPORT_FLAG_NO_DESCRIPTIONS 0x00000004 +/** This advises the library that the program is finished with the source + * WIMStruct and will not attempt to access it after the call to + * wimlib_export_image(), with the exception of the call to wimlib_free(). */ +#define WIMLIB_EXPORT_FLAG_GIFT 0x00000008 + +/** + * Mark each exported image as WIMBoot-compatible. + * + * Note: by itself, this does change the destination WIM's compression type, nor + * does it add the file \Windows\System32\WimBootCompress.ini in the WIM image. + * Before writing the destination WIM, it's recommended to do something like: + * + * \code + * wimlib_set_output_compression_type(wim, WIMLIB_COMPRESSION_TYPE_XPRESS); + * wimlib_set_output_chunk_size(wim, 4096); + * wimlib_add_tree(wim, image, L"myconfig.ini", + * L"\\Windows\\System32\\WimBootCompress.ini", 0); + * \endcode + */ +#define WIMLIB_EXPORT_FLAG_WIMBOOT 0x00000010 + /** @} */ /** @ingroup G_extracting_wims * @{ */ -/** Extract the image directly to a NTFS volume rather than a generic directory. +/** Extract the image directly to an NTFS volume rather than a generic directory. * This mode is only available if wimlib was compiled with libntfs-3g support; * if not, ::WIMLIB_ERR_UNSUPPORTED will be returned. In this mode, the - * extraction target will be interpreted as the path to a NTFS volume image (as + * extraction target will be interpreted as the path to an NTFS volume image (as * a regular file or block device) rather than a directory. It will be opened * using libntfs-3g, and the image will be extracted to the NTFS filesystem's * root directory. Note: this flag cannot be used when wimlib_extract_image() - * is called with ::WIMLIB_ALL_IMAGES as the @p image. */ + * is called with ::WIMLIB_ALL_IMAGES as the @p image, nor can it be used with + * wimlib_extract_paths() when passed multiple paths. */ #define WIMLIB_EXTRACT_FLAG_NTFS 0x00000001 -/** When identical files are extracted from the WIM, always hard link them - * together. This flag cannot be combined with ::WIMLIB_EXTRACT_FLAG_SYMLINK. - */ -#define WIMLIB_EXTRACT_FLAG_HARDLINK 0x00000002 - -/** When identical files are extracted from the WIM, always symlink them - * together. This flag cannot be combined with ::WIMLIB_EXTRACT_FLAG_HARDLINK. - */ -#define WIMLIB_EXTRACT_FLAG_SYMLINK 0x00000004 - -/** This flag no longer does anything but is reserved for future use. */ -#define WIMLIB_EXTRACT_FLAG_VERBOSE 0x00000008 - -/** Read the WIM file sequentially while extracting the image. As of wimlib - * v1.6.0 this is the default behavior, and this flag no longer does anything. - */ -#define WIMLIB_EXTRACT_FLAG_SEQUENTIAL 0x00000010 - -/** Extract special UNIX data captured with ::WIMLIB_ADD_FLAG_UNIX_DATA. Only - * valid on UNIX-like platforms, and when ::WIMLIB_EXTRACT_FLAG_NTFS was not - * specified. */ +/** 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. */ #define WIMLIB_EXTRACT_FLAG_UNIX_DATA 0x00000020 /** Do not extract security descriptors. This flag cannot be combined with @@ -1480,9 +1521,8 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour * with ::WIMLIB_EXTRACT_FLAG_RPFIX. */ #define WIMLIB_EXTRACT_FLAG_NORPFIX 0x00000200 -/** Extract the paths, each of which must name a regular file, to standard - * output. Not valid for wimlib_extract_image() and - * wimlib_extract_image_from_pipe(). */ +/** For wimlib_extract_paths() and wimlib_extract_pathlist() only: Extract the + * paths, each of which must name a regular file, to standard output. */ #define WIMLIB_EXTRACT_FLAG_TO_STDOUT 0x00000400 /** Instead of ignoring files and directories with names that cannot be @@ -1503,23 +1543,16 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour /** Do not ignore failure to set short names on extracted files. */ #define WIMLIB_EXTRACT_FLAG_STRICT_SHORT_NAMES 0x00004000 -/** Do not ignore failure to extract symbolic links (and junction points, on - * Windows) due to permissions problems. By default, such failures are ignored - * since the default configuration of Windows only allows the Administrator to - * create symbolic links. */ +/** On Windows, do not ignore failure to extract symbolic links and junctions + * due to permissions problems. By default, such failures are ignored since the + * default configuration of Windows only allows the Administrator to create + * symbolic links. */ #define WIMLIB_EXTRACT_FLAG_STRICT_SYMLINKS 0x00008000 /** TODO: this flag is intended to allow resuming an aborted extraction, but the * behavior is currently less than satisfactory. Do not use (yet). */ #define WIMLIB_EXTRACT_FLAG_RESUME 0x00010000 -/** Perform the extraction ordered by the tree of files to extract rather than - * how the underlying streams are arranged in the WIM file. For regular WIM - * files this may decrease or increase performance, depending on various - * factors. For WIM files containing packed streams this will decrease - * performance. */ -#define WIMLIB_EXTRACT_FLAG_FILE_ORDER 0x00020000 - /** For wimlib_extract_paths() and wimlib_extract_pathlist() only: Treat the * paths to extract as wildcard patterns ("globs") which may contain the * wildcard characters @c ? and @c *. The @c ? character matches any @@ -1641,94 +1674,175 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour /** @ingroup G_writing_and_overwriting_wims * @{ */ -/** Include an integrity table in the WIM. +/** + * Include an integrity table in the resulting WIM file. * - * For WIMs created with wimlib_open_wim(), the default behavior is to include - * an integrity table if and only if one was present before. For WIMs created - * with wimlib_create_new_wim(), the default behavior is to not include an - * integrity table. */ + * For ::WIMStruct's created with wimlib_open_wim(), the default behavior is to + * include an integrity table if and only if one was present before. For + * ::WIMStruct's created with wimlib_create_new_wim(), the default behavior is + * to not include an integrity table. + */ #define WIMLIB_WRITE_FLAG_CHECK_INTEGRITY 0x00000001 -/** Do not include an integrity table in the new WIM file. This is the default - * behavior, unless the WIM already included an integrity table. */ +/** + * Do not include an integrity table in the resulting WIM file. This is the + * default behavior, unless the ::WIMStruct was created by opening a WIM with an + * integrity table. + */ #define WIMLIB_WRITE_FLAG_NO_CHECK_INTEGRITY 0x00000002 -/** Write the WIM as "pipable". After writing a WIM with this flag specified, +/** + * Write the WIM as "pipable". After writing a WIM with this flag specified, * images from it can be applied directly from a pipe using * wimlib_extract_image_from_pipe(). See the documentation for the --pipable * flag of `wimlib-imagex capture' for more information. Beware: WIMs written * with this flag will not be compatible with Microsoft's software. * - * For WIMs created with wimlib_open_wim(), the default behavior is to write the - * WIM as pipable if and only if it was pipable before. For WIMs created with - * wimlib_create_new_wim(), the default behavior is to write the WIM as - * non-pipable. */ + * For ::WIMStruct's created with wimlib_open_wim(), the default behavior is to + * write the WIM as pipable if and only if it was pipable before. For + * ::WIMStruct's created with wimlib_create_new_wim(), the default behavior is + * to write the WIM as non-pipable. + */ #define WIMLIB_WRITE_FLAG_PIPABLE 0x00000004 -/** Do not write the WIM as "pipable". This is the default behavior, unless the - * WIM was pipable already. */ +/** + * Do not write the WIM as "pipable". This is the default behavior, unless the + * ::WIMStruct was created by opening a pipable WIM. + */ #define WIMLIB_WRITE_FLAG_NOT_PIPABLE 0x00000008 -/** Recompress all resources, even if they could otherwise be copied from a - * different WIM with the same compression type (in the case of - * wimlib_export_image() being called previously). This flag is also valid in - * the @p wim_write_flags of wimlib_join(), in which case all resources included - * in the joined WIM file will be recompressed. */ +/** + * When writing streams to the WIM file, recompress them, even if their data is + * already available in the desired compressed form (for example, in a WIM file + * from which an image has been exported using wimlib_export_image()). + * + * ::WIMLIB_WRITE_FLAG_RECOMPRESS can be used to recompress with a higher + * compression ratio for the same compression type and chunk size. wimlib's LZX + * compressor currently can be given different parameters in order to achieve + * different balances between compression ratio and time. In its default mode + * as of v1.5.3, it usually compresses slightly better than the competing + * Microsoft implementation. + * + * ::WIMLIB_WRITE_FLAG_RECOMPRESS can also be used in combination with + * ::WIMLIB_WRITE_FLAG_PACK_STREAMS to prevent any solid blocks from being + * re-used. (Otherwise, solid blocks are re-used somewhat more liberally than + * normal compressed blocks.) + * + * ::WIMLIB_WRITE_FLAG_RECOMPRESS does not cause recompression of streams + * that would not otherwise be written. For example, a call to + * wimlib_overwrite() with ::WIMLIB_WRITE_FLAG_RECOMPRESS will not, by itself, + * cause already-existing streams in the WIM file to be recompressed. To force + * the WIM file to be fully rebuilt and recompressed, combine + * ::WIMLIB_WRITE_FLAG_RECOMPRESS with ::WIMLIB_WRITE_FLAG_REBUILD. + */ #define WIMLIB_WRITE_FLAG_RECOMPRESS 0x00000010 -/** Call fsync() just before the WIM file is closed. */ +/** + * Immediately before closing the WIM file, sync its data to disk. + * + * wimlib_overwrite() will set this flag automatically if it decides to + * overwrite the WIM file via a temporary file instead of in-place. + */ #define WIMLIB_WRITE_FLAG_FSYNC 0x00000020 -/** wimlib_overwrite() only: Re-build the entire WIM file rather than appending - * data to it if possible. */ +/** + * For wimlib_overwrite(), rebuild the entire WIM file, even if it otherwise + * could be updated merely be appending to it. + * + * When rebuilding the WIM file, stream reference counts will be recomputed, and + * any streams with 0 reference count (e.g. from deleted files or images) will + * not be included in the resulting WIM file. + * + * This flag can be combined with ::WIMLIB_WRITE_FLAG_RECOMPRESS to force all + * data to be recompressed. Otherwise, compressed data is re-used if possible. + * + * wimlib_write() ignores this flag. + */ #define WIMLIB_WRITE_FLAG_REBUILD 0x00000040 -/** wimlib_overwrite() only: Specifying this flag overrides the default - * behavior of wimlib_overwrite() after one or more calls to - * wimlib_delete_image(), which is to rebuild the entire WIM. With this flag, - * only minimal changes to correctly remove the image from the WIM will be - * taken. In particular, all streams will be left alone, even if they are no - * longer referenced. This is probably not what you want, because almost no - * space will be saved by deleting an image in this way. */ +/** + * For wimlib_overwrite(), override the default behavior after one or more calls + * to wimlib_delete_image(), which is to rebuild the entire WIM file. With this + * flag, only minimal changes to correctly remove the image from the WIM file + * will be taken. In particular, all streams will be retained, even if they are + * no longer referenced. This may not be what you want, because no space will + * be saved by deleting an image in this way. + * + * wimlib_write() ignores this flag. + */ #define WIMLIB_WRITE_FLAG_SOFT_DELETE 0x00000080 -/** wimlib_overwrite() only: Allow overwriting the WIM even if the readonly - * flag is set in the WIM header. This can be used in combination with - * wimlib_set_wim_info() with the ::WIMLIB_CHANGE_READONLY_FLAG flag to actually - * set the readonly flag on the on-disk WIM file. */ +/** + * For wimlib_overwrite(), allow overwriting the WIM file even if the readonly + * flag (WIM_HDR_FLAG_READONLY) is set in the WIM header. This can be used + * following a call to wimlib_set_wim_info() with the + * ::WIMLIB_CHANGE_READONLY_FLAG flag to actually set the readonly flag on the + * on-disk WIM file. + * + * wimlib_write() ignores this flag. + */ #define WIMLIB_WRITE_FLAG_IGNORE_READONLY_FLAG 0x00000100 -/** Do not include non-metadata resources already present in other WIMs. This - * flag can be used to write a "delta" WIM after resources from the WIM on which - * the delta is to be based were referenced with - * wimlib_reference_resource_files() or wimlib_reference_resources(). */ +/** + * Do not include streams already present in other WIMs. This flag can be used + * to write a "delta" WIM after resources from the WIM on which the delta is to + * be based were referenced with wimlib_reference_resource_files() or + * wimlib_reference_resources(). + */ #define WIMLIB_WRITE_FLAG_SKIP_EXTERNAL_WIMS 0x00000200 -/** Asserts that for writes of all WIM images, all streams needed for the WIM - * are already present (not in external resource WIMs) and their reference - * counts are correct, so the code does not need to recalculate which streams - * are referenced. This is for optimization purposes only, since with this flag - * specified, the metadata resources may not need to be decompressed and parsed. - * - * This flag can be passed to wimlib_write() and wimlib_write_to_fd(), but is - * already implied for wimlib_overwrite(). */ +/** + * Advises the library that for writes of all WIM images, all streams needed for + * the WIM are already present (not in external resource WIMs) and their + * reference counts are correct, so the code does not need to recalculate which + * streams are referenced. This is for optimization purposes only, since with + * this flag specified, the metadata resources may not need to be decompressed + * and parsed. + * + * wimlib_overwrite() will set this flag automatically. + */ #define WIMLIB_WRITE_FLAG_STREAMS_OK 0x00000400 -#define WIMLIB_WRITE_FLAG_RESERVED 0x00000800 +/** + * For wimlib_write(), retain the WIM's GUID instead of generating a new one. + * + * wimlib_overwrite() sets this by default, since the WIM remains, logically, + * the same file. + */ +#define WIMLIB_WRITE_FLAG_RETAIN_GUID 0x00000800 /** * When writing streams in the resulting WIM file, pack multiple streams into a - * single WIM resource instead of compressing them independently. This tends to - * produce a better compression ratio at the cost of less random access. - * However, WIMs created with this flag are only compatible with wimlib v1.6.0 - * or later and WIMGAPI Windows 8 or later, seemingly for Windows Setup only and - * not including ImageX and Dism. WIMs created with this flag must use - * version number 3584 in their header instead of 68864. - * - * If this flag is passed to wimlib_overwrite() and the WIM did not previously - * contain packed streams, the WIM's version number will be changed to 3584 and - * the new streams will be written packed. Use ::WIMLIB_WRITE_FLAG_REBUILD to - * force the WIM to be fully rebuilt. */ + * single compressed resource instead of compressing them independently. This + * is also known as creating a "solid archive". This tends to produce a better + * compression ratio at the cost of much slower random access. + * + * WIM files created with this flag are only compatible with wimlib v1.6.0 or + * later, WIMGAPI Windows 8 or later, and DISM Windows 8.1 or later. WIM files + * created with this flag use a different version number in their header (3584 + * instead of 68864) and are also called "ESD files". + * + * If this flag is passed to wimlib_overwrite(), any new data streams will be + * written in solid mode. Use both ::WIMLIB_WRITE_FLAG_REBUILD and + * ::WIMLIB_WRITE_FLAG_RECOMPRESS to force the entire WIM file be rebuilt with + * all streams recompressed in solid mode. + * + * Currently, new solid blocks will, by default, be written using LZMS + * compression with 32 MiB (33554432 byte) chunks. Use + * wimlib_set_output_pack_compression_type() and/or + * wimlib_set_output_pack_chunk_size() to change this. This is independent of + * the WIM's main compression type and chunk size; you can have a WIM that + * nominally uses LZX compression and 32768 byte chunks but actually contains + * LZMS-compressed solid blocks, for example. However, if including solid + * blocks, I suggest that you set the WIM's main compression type to LZMS as + * well, either by creating the WIM with + * ::wimlib_create_new_wim(::WIMLIB_COMPRESSION_TYPE_LZMS, ...) or by calling + * ::wimlib_set_output_compression_type(..., ::WIMLIB_COMPRESSION_TYPE_LZMS). + * + * This flag will be set by default when writing or overwriting a WIM file that + * either already contains packed streams, or has had packed streams exported + * into it and the WIM's main compression type is LZMS. + */ #define WIMLIB_WRITE_FLAG_PACK_STREAMS 0x00001000 /** @} */ @@ -1810,7 +1924,7 @@ struct wimlib_add_command { /** Filesystem path to the file or directory tree to add. */ wimlib_tchar *fs_source_path; - /** Destination path in the WIM image. Use WIMLIB_WIM_ROOT_PATH to + /** Destination path in the WIM image. Use ::WIMLIB_WIM_ROOT_PATH to * specify the root directory of the WIM image. */ wimlib_tchar *wim_target_path; @@ -1948,6 +2062,8 @@ enum wimlib_error_code { WIMLIB_ERR_XML, WIMLIB_ERR_WIM_IS_ENCRYPTED, WIMLIB_ERR_WIMBOOT, + WIMLIB_ERR_ABORTED_BY_PROGRESS, + WIMLIB_ERR_UNKNOWN_PROGRESS_STATUS, }; @@ -2035,12 +2151,6 @@ wimlib_add_empty_image(WIMStruct *wim, * ::WIMLIB_ADD_FLAG_WIMBOOT flags modify the default. * @param add_flags * Bitwise OR of flags prefixed with WIMLIB_ADD_FLAG. - * @param progress_func - * If non-NULL, a function that will be called periodically with the - * progress of the current operation. The progress messages that will be - * received are ::WIMLIB_PROGRESS_MSG_SCAN_BEGIN, - * ::WIMLIB_PROGRESS_MSG_SCAN_END, and, if ::WIMLIB_ADD_FLAG_VERBOSE was - * included in @p add_flags, also ::WIMLIB_PROGRESS_MSG_SCAN_DENTRY. * * @return 0 on success; nonzero on error. On error, changes to @p wim are * discarded so that it appears to be in the same state as when this function @@ -2051,14 +2161,18 @@ wimlib_add_empty_image(WIMStruct *wim, * returned by wimlib_add_empty_image() may be returned, as well as any error * codes returned by wimlib_update_image() other than ones documented as only * being returned specifically by an update involving delete or rename commands. + * + * If a progress function is registered with @p wim, it will receive the + * messages ::WIMLIB_PROGRESS_MSG_SCAN_BEGIN and ::WIMLIB_PROGRESS_MSG_SCAN_END. + * In addition, if ::WIMLIB_ADD_FLAG_VERBOSE is specified in @p add_flags, it + * will receive ::WIMLIB_PROGRESS_MSG_SCAN_DENTRY. */ extern int wimlib_add_image(WIMStruct *wim, const wimlib_tchar *source, const wimlib_tchar *name, const wimlib_tchar *config_file, - int add_flags, - wimlib_progress_func_t progress_func); + int add_flags); /** * @ingroup G_modifying_wims @@ -2086,8 +2200,21 @@ wimlib_add_image_multisource(WIMStruct *wim, size_t num_sources, const wimlib_tchar *name, const wimlib_tchar *config_file, - int add_flags, - wimlib_progress_func_t progress_func); + int add_flags); + +/** + * @ingroup G_modifying_wims + * + * Add the file or directory tree at @p fs_source_path on the filesystem to the + * location @p wim_target_path within the specified @p image of the @p wim. + * + * This just builds an appropriate ::wimlib_add_command and passes it to + * wimlib_update_image(). + */ +extern int +wimlib_add_tree(WIMStruct *wim, int image, + const wimlib_tchar *fs_source_path, + const wimlib_tchar *wim_target_path, int add_flags); /** * @ingroup G_creating_and_opening_wims @@ -2155,6 +2282,18 @@ wimlib_create_new_wim(int ctype, WIMStruct **wim_ret); extern int wimlib_delete_image(WIMStruct *wim, int image); +/** + * @ingroup G_modifying_wims + * + * Delete the @p path from the specified @p image of the @p wim. + * + * This just builds an appropriate ::wimlib_delete_command and passes it to + * wimlib_update_image(). + */ +extern int +wimlib_delete_path(WIMStruct *wim, int image, + const wimlib_tchar *path, int delete_flags); + /** * @ingroup G_modifying_wims * @@ -2202,10 +2341,6 @@ wimlib_delete_image(WIMStruct *wim, int image); * parameter is overridden by ::WIMLIB_EXPORT_FLAG_NO_DESCRIPTIONS. * @param export_flags * Bitwise OR of flags prefixed with WIMLIB_EXPORT_FLAG. - * @param progress_func - * Currently ignored, but reserved for a function that will be called with - * information about the operation. Use NULL if no additional information - * is desired. * * @return 0 on success; nonzero on error. * @retval ::WIMLIB_ERR_IMAGE_NAME_COLLISION @@ -2247,9 +2382,7 @@ wimlib_export_image(WIMStruct *src_wim, int src_image, WIMStruct *dest_wim, const wimlib_tchar *dest_name, const wimlib_tchar *dest_description, - int export_flags, - wimlib_progress_func_t progress_func); - + int export_flags); /** * @ingroup G_extracting_wims @@ -2282,11 +2415,6 @@ wimlib_export_image(WIMStruct *src_wim, int src_image, * the unmounted NTFS volume to which to extract the image. * @param extract_flags * Bitwise OR of flags prefixed with WIMLIB_EXTRACT_FLAG. - * @param progress_func - * If non-NULL, a function that will be called periodically with the - * progress of the current operation. The main message to look for is - * ::WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS; however, there are others as - * well. * * @return 0 on success; nonzero on error. * @retval ::WIMLIB_ERR_DECOMPRESSION @@ -2349,9 +2477,8 @@ wimlib_export_image(WIMStruct *src_wim, int src_image, * volume. Flags affected by this include ::WIMLIB_EXTRACT_FLAG_NTFS, * ::WIMLIB_EXTRACT_FLAG_UNIX_DATA, ::WIMLIB_EXTRACT_FLAG_STRICT_ACLS, * ::WIMLIB_EXTRACT_FLAG_STRICT_SHORT_NAMES, - * ::WIMLIB_EXTRACT_FLAG_STRICT_TIMESTAMPS, - * ::WIMLIB_EXTRACT_FLAG_STRICT_SYMLINKS, ::WIMLIB_EXTRACT_FLAG_SYMLINK, - * and ::WIMLIB_EXTRACT_FLAG_HARDLINK. For example, if + * ::WIMLIB_EXTRACT_FLAG_STRICT_TIMESTAMPS, and + * ::WIMLIB_EXTRACT_FLAG_STRICT_SYMLINKS. For example, if * ::WIMLIB_EXTRACT_FLAG_STRICT_SHORT_NAMES is specified in @p * extract_flags, ::WIMLIB_ERR_UNSUPPORTED will be returned if the WIM * image contains one or more files with short names, but extracting short @@ -2363,12 +2490,15 @@ wimlib_export_image(WIMStruct *src_wim, int src_image, * there was a problem creating WIMBoot pointer files. * @retval ::WIMLIB_ERR_WRITE * Failed to write data to a file being extracted. + * + * If a progress function is registered with @p wim, then as each image is + * extracted it will receive ::WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_BEGIN, then + * zero or more ::WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS messages, then + * ::WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END. */ extern int wimlib_extract_image(WIMStruct *wim, int image, - const wimlib_tchar *target, - int extract_flags, - wimlib_progress_func_t progress_func); + const wimlib_tchar *target, int extract_flags); /** * @ingroup G_extracting_wims @@ -2398,13 +2528,7 @@ wimlib_extract_image(WIMStruct *wim, int image, * @param target * Same as the corresponding parameter to wimlib_extract_image(). * @param extract_flags - * Same as the corresponding parameter to wimlib_extract_image(), except - * that ::WIMLIB_EXTRACT_FLAG_FILE_ORDER cannot be specified and will - * result in ::WIMLIB_ERR_INVALID_PARAM being returned. - * @param progress_func - * Same as the corresponding parameter to wimlib_extract_image(), except - * ::WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN messages will also be - * received by the progress function. + * Same as the corresponding parameter to wimlib_extract_image(). * * @return 0 on success; nonzero on error. The possible error codes include * those returned by wimlib_extract_image() and wimlib_open_wim() as well as the @@ -2418,8 +2542,24 @@ wimlib_extract_image(WIMStruct *wim, int image, extern int wimlib_extract_image_from_pipe(int pipe_fd, const wimlib_tchar *image_num_or_name, - const wimlib_tchar *target, int extract_flags, - wimlib_progress_func_t progress_func); + const wimlib_tchar *target, int extract_flags); + +/* + * @ingroup G_extracting_wims + * + * Same as wimlib_extract_image_from_pipe(), but allows specifying a progress + * function. The progress function will be used while extracting the WIM image + * and will receive the normal extraction progress messages, such as + * ::WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS, in addition to + * ::WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN. + */ +extern int +wimlib_extract_image_from_pipe_with_progress(int pipe_fd, + const wimlib_tchar *image_num_or_name, + const wimlib_tchar *target, + int extract_flags, + wimlib_progress_func_t progfunc, + void *progctx); /** * @ingroup G_extracting_wims @@ -2440,8 +2580,7 @@ extern int wimlib_extract_pathlist(WIMStruct *wim, int image, const wimlib_tchar *target, const wimlib_tchar *path_list_file, - int extract_flags, - wimlib_progress_func_t progress_func); + int extract_flags); /** * @ingroup G_extracting_wims @@ -2495,15 +2634,6 @@ wimlib_extract_pathlist(WIMStruct *wim, int image, * systems it may not contain backslashes, for example. * @param extract_flags * Bitwise OR of flags prefixed with WIMLIB_EXTRACT_FLAG. - * @param progress_func - * If non-NULL, a function that will be called periodically with the - * progress of the current operation. The main message to look for is - * ::WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS; however, there are others as - * well. Note: because the extraction code is stream-based and not - * file-based, there is no way to get information about which path is - * currently being extracted, but based on byte count you can still - * calculate an approximate percentage complete for the extraction overall - * which may be all you really need anyway. * * @return 0 on success; nonzero on error. Most of the error codes are the same * as those returned by wimlib_extract_image(). Below, some of the error codes @@ -2521,6 +2651,13 @@ wimlib_extract_pathlist(WIMStruct *wim, int image, * @retval ::WIMLIB_ERR_NOT_A_REGULAR_FILE * ::WIMLIB_EXTRACT_FLAG_TO_STDOUT was specified in @p extract_flags, but * one of the paths to extract did not name a regular file. + * + * If a progress function is registered with @p wim, it will receive + * ::WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS. Note that because the extraction code + * is stream-based and not file-based, there is no way to get information about + * which path is currently being extracted, but based on byte count you can + * still calculate an approximate percentage complete for the extraction overall + * which may be all you really need anyway. */ extern int wimlib_extract_paths(WIMStruct *wim, @@ -2528,8 +2665,7 @@ wimlib_extract_paths(WIMStruct *wim, const wimlib_tchar *target, const wimlib_tchar * const *paths, size_t num_paths, - int extract_flags, - wimlib_progress_func_t progress_func); + int extract_flags); /** * @ingroup G_wim_information @@ -2866,9 +3002,6 @@ wimlib_iterate_lookup_table(WIMStruct *wim, int flags, * be used to write the joined WIM. * @param output_path * The path to write the joined WIM file to. - * @param progress_func - * If non-NULL, a function that will be called periodically with the - * progress of the current operation. * * @return 0 on success; nonzero on error. This function may return most error * codes that can be returned by wimlib_open_wim() and wimlib_write(), as well @@ -2891,8 +3024,27 @@ wimlib_join(const wimlib_tchar * const *swms, unsigned num_swms, const wimlib_tchar *output_path, int swm_open_flags, - int wim_write_flags, - wimlib_progress_func_t progress_func); + int wim_write_flags); + +/** + * @ingroup G_nonstandalone_wims + * + * Same as wimlib_join(), but allows specifying a progress function. The + * progress function will receive the write progress messages, such as + * ::WIMLIB_PROGRESS_MSG_WRITE_STREAMS, while writing the joined WIM. In + * addition, if ::WIMLIB_OPEN_FLAG_CHECK_INTEGRITY is specified in @p + * swm_open_flags, the progress function will receive a series of + * ::WIMLIB_PROGRESS_MSG_VERIFY_INTEGRITY messages when each of the split WIM + * parts is opened. + */ +extern int +wimlib_join_with_progress(const wimlib_tchar * const *swms, + unsigned num_swms, + const wimlib_tchar *output_path, + int swm_open_flags, + int wim_write_flags, + wimlib_progress_func_t progfunc, + void *progctx); /** @@ -2939,7 +3091,7 @@ wimlib_join(const wimlib_tchar * const *swms, * @return 0 on success; nonzero on error. * * @retval ::WIMLIB_ERR_ALREADY_LOCKED - * A read-write mount was requested, but an an exclusive advisory lock on + * A read-write mount was requested, but an exclusive advisory lock on * the on-disk WIM file could not be acquired because another thread or * process has mounted an image from the WIM read-write or is currently * modifying the WIM in-place. @@ -2993,12 +3145,6 @@ wimlib_mount_image(WIMStruct *wim, * @param open_flags * Bitwise OR of flags prefixed with WIMLIB_OPEN_FLAG. * - * @param progress_func - * If non-NULL, a function that will be called periodically with the - * progress of the current operation. Currently, the only messages sent - * will be ::WIMLIB_PROGRESS_MSG_VERIFY_INTEGRITY, and only if - * ::WIMLIB_OPEN_FLAG_CHECK_INTEGRITY was specified in @p open_flags. - * * @param wim_ret * On success, a pointer to an opaque ::WIMStruct for the opened WIM file * is written to the memory location pointed to by this parameter. The @@ -3060,8 +3206,24 @@ wimlib_mount_image(WIMStruct *wim, extern int wimlib_open_wim(const wimlib_tchar *wim_file, int open_flags, - WIMStruct **wim_ret, - wimlib_progress_func_t progress_func); + WIMStruct **wim_ret); + +/** + * @ingroup G_creating_and_opening_wims + * + * Same as wimlib_open_wim(), but allows specifying a progress function and + * progress context. If successful, the progress function will be registered in + * the newly open ::WIMStruct. In addition, if + * ::WIMLIB_OPEN_FLAG_CHECK_INTEGRITY is specified in @p open_flags, the + * progress function will receive ::WIMLIB_PROGRESS_MSG_VERIFY_INTEGRITY + * messages while checking the WIM's integrity. + */ +extern int +wimlib_open_wim_with_progress(const wimlib_tchar *wim_file, + int open_flags, + WIMStruct **wim_ret, + wimlib_progress_func_t progfunc, + void *progctx); /** * @ingroup G_writing_and_overwriting_wims @@ -3115,9 +3277,6 @@ wimlib_open_wim(const wimlib_tchar *wim_file, * Bitwise OR of relevant flags prefixed with WIMLIB_WRITE_FLAG. * @param num_threads * Number of threads to use for compression (see wimlib_write()). - * @param progress_func - * If non-NULL, a function that will be called periodically with the - * progress of the current operation. * * @return 0 on success; nonzero on error. This function may return most error * codes returned by wimlib_write() as well as the following error codes: @@ -3137,10 +3296,14 @@ wimlib_open_wim(const wimlib_tchar *wim_file, * The WIM file is considered read-only because of any of the reasons * mentioned in the documentation for the ::WIMLIB_OPEN_FLAG_WRITE_ACCESS * flag. + * + * If a progress function is registered with @p wim, it will receive the + * messages ::WIMLIB_PROGRESS_MSG_WRITE_STREAMS, + * ::WIMLIB_PROGRESS_MSG_WRITE_METADATA_BEGIN, and + * ::WIMLIB_PROGRESS_MSG_WRITE_METADATA_END. */ extern int -wimlib_overwrite(WIMStruct *wim, int write_flags, unsigned num_threads, - wimlib_progress_func_t progress_func); +wimlib_overwrite(WIMStruct *wim, int write_flags, unsigned num_threads); /** * @ingroup G_wim_information @@ -3199,8 +3362,6 @@ wimlib_print_header(const WIMStruct *wim) _wimlib_deprecated; * @param open_flags * Additional open flags, such as ::WIMLIB_OPEN_FLAG_CHECK_INTEGRITY, to * pass to internal calls to wimlib_open_wim() on the reference files. - * @param progress_func - * Passed to internal calls to wimlib_open_wim() on the reference files. * * @return 0 on success; nonzero on error. * @@ -3221,8 +3382,7 @@ wimlib_reference_resource_files(WIMStruct *wim, const wimlib_tchar * const *resource_wimfiles_or_globs, unsigned count, int ref_flags, - int open_flags, - wimlib_progress_func_t progress_func); + int open_flags); /** * @ingroup G_nonstandalone_wims @@ -3302,10 +3462,6 @@ wimlib_reference_resources(WIMStruct *wim, WIMStruct **resource_wims, * of the directory tree being captured. * @param flags * Reserved; must be 0. - * @param progress_func - * Currently ignored, but reserved for a function that will be called with - * information about the operation. Use NULL if no additional information - * is desired. * * @return 0 on success; nonzero on error. * @@ -3331,7 +3487,40 @@ wimlib_reference_resources(WIMStruct *wim, WIMStruct **resource_wims, extern int wimlib_reference_template_image(WIMStruct *wim, int new_image, WIMStruct *template_wim, int template_image, - int flags, wimlib_progress_func_t progress_func); + int flags); + +/** + * @ingroup G_general + * + * Registers a progress function with a ::WIMStruct. + * + * @param wim + * The ::WIMStruct for which to register the progress function. + * @param progfunc + * Pointer to the progress function to register. If the WIM already has a + * progress function registered, it will be replaced with this one. If @p + * NULL, the current progress function (if any) will be unregistered. + * @param progctx + * The value which will be passed as the third argument to calls to @p + * progfunc. + */ +extern void +wimlib_register_progress_function(WIMStruct *wim, + wimlib_progress_func_t progfunc, + void *progctx); + +/** + * @ingroup G_modifying_wims + * + * Rename the @p source_path to the @p dest_path in the specified @p image of + * the @p wim. + * + * This just builds an appropriate ::wimlib_rename_command and passes it to + * wimlib_update_image(). + */ +extern int +wimlib_rename_path(WIMStruct *wim, int image, + const wimlib_tchar *source_path, const wimlib_tchar *dest_path); /** * @ingroup G_wim_information @@ -3429,7 +3618,7 @@ wimlib_set_output_chunk_size(WIMStruct *wim, uint32_t chunk_size); * @ingroup G_writing_and_overwriting_wims * * Similar to wimlib_set_output_chunk_size(), but set the chunk size for writing - * packed streams. + * packed streams (solid blocks). */ extern int wimlib_set_output_pack_chunk_size(WIMStruct *wim, uint32_t chunk_size); @@ -3631,11 +3820,6 @@ wimlib_set_print_errors(bool show_messages); * Bitwise OR of relevant flags prefixed with @c WIMLIB_WRITE_FLAG. These * flags will be used to write each split WIM part. Specify 0 here to get * the default behavior. - * @param progress_func - * If non-NULL, a function that will be called periodically with the - * progress of the current operation - * (::WIMLIB_PROGRESS_MSG_SPLIT_BEGIN_PART and - * ::WIMLIB_PROGRESS_MSG_SPLIT_END_PART). * * @return 0 on success; nonzero on error. This function may return most error * codes that can be returned by wimlib_write() as well as the following error @@ -3648,13 +3832,17 @@ wimlib_set_print_errors(bool show_messages); * when they are copied from the joined WIM to the split WIM parts, nor are * compressed resources re-compressed (unless explicitly requested with * ::WIMLIB_WRITE_FLAG_RECOMPRESS). + * + * If a progress function is registered with @p wim, 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. */ extern int wimlib_split(WIMStruct *wim, const wimlib_tchar *swm_name, uint64_t part_size, - int write_flags, - wimlib_progress_func_t progress_func); + int write_flags); /** * @ingroup G_mounting_wim_images @@ -3678,10 +3866,6 @@ wimlib_split(WIMStruct *wim, * ::WIMLIB_UNMOUNT_FLAG_COMMIT, ::WIMLIB_UNMOUNT_FLAG_REBUILD, and/or * ::WIMLIB_UNMOUNT_FLAG_RECOMPRESS. None of these flags affect read-only * mounts. - * @param progress_func - * If non-NULL, a function that will be called periodically with the - * progress of the current operation. Currently, only - * ::WIMLIB_PROGRESS_MSG_WRITE_STREAMS will be sent. * * @return 0 on success; nonzero on error. * @@ -3722,8 +3906,20 @@ wimlib_split(WIMStruct *wim, */ extern int wimlib_unmount_image(const wimlib_tchar *dir, - int unmount_flags, - wimlib_progress_func_t progress_func); + int unmount_flags); + +/** + * @ingroup G_mounting_wim_images + * + * Same as wimlib_unmount_image(), but allows specifying a progress function. + * If changes are committed from a read-write mount, the progress function will + * receive ::WIMLIB_PROGRESS_MSG_WRITE_STREAMS messages. + */ +extern int +wimlib_unmount_image_with_progress(const wimlib_tchar *dir, + int unmount_flags, + wimlib_progress_func_t progfunc, + void *progctx); /** * @ingroup G_modifying_wims @@ -3742,9 +3938,6 @@ wimlib_unmount_image(const wimlib_tchar *dir, * Number of commands in @p cmds. * @param update_flags * ::WIMLIB_UPDATE_FLAG_SEND_PROGRESS or 0. - * @param progress_func - * If non-NULL, a function that will be called periodically with the - * progress of the current operation. * * @return 0 on success; nonzero on error. On failure, all update commands will * be rolled back, and no visible changes shall have been made to @p wim. @@ -3762,7 +3955,7 @@ wimlib_unmount_image(const wimlib_tchar *dir, * An unknown operation type was specified in the update commands; or, * attempted to execute an add command where ::WIMLIB_ADD_FLAG_NTFS was set * in the @p add_flags, but the same image had previously already been - * added from a NTFS volume; or, both ::WIMLIB_ADD_FLAG_RPFIX and + * added from an NTFS volume; or, both ::WIMLIB_ADD_FLAG_RPFIX and * ::WIMLIB_ADD_FLAG_NORPFIX were specified in the @p add_flags for one add * command; or, ::WIMLIB_ADD_FLAG_NTFS or ::WIMLIB_ADD_FLAG_RPFIX were * specified in the @p add_flags for an add command in which @p @@ -3835,8 +4028,7 @@ wimlib_update_image(WIMStruct *wim, int image, const struct wimlib_update_command *cmds, size_t num_cmds, - int update_flags, - wimlib_progress_func_t progress_func); + int update_flags); /** * @ingroup G_writing_and_overwriting_wims @@ -3872,12 +4064,6 @@ wimlib_update_image(WIMStruct *wim, * exporting an image from a compressed WIM to another WIM of the same * compression type without ::WIMLIB_WRITE_FLAG_RECOMPRESS specified in @p * write_flags). - * @param progress_func - * If non-NULL, a function that will be called periodically with the - * progress of the current operation. The possible messages are - * ::WIMLIB_PROGRESS_MSG_WRITE_METADATA_BEGIN, - * ::WIMLIB_PROGRESS_MSG_WRITE_METADATA_END, and - * ::WIMLIB_PROGRESS_MSG_WRITE_STREAMS. * * @return 0 on success; nonzero on error. * @@ -3916,14 +4102,18 @@ wimlib_update_image(WIMStruct *wim, * ::WIMLIB_ERR_UNEXPECTED_END_OF_FILE, all of which indicate failure (for * different reasons) to read the metadata resource for an image that needed to * be written. + * + * If a progress function is registered with @p wim, it will receive the + * messages ::WIMLIB_PROGRESS_MSG_WRITE_STREAMS, + * ::WIMLIB_PROGRESS_MSG_WRITE_METADATA_BEGIN, and + * ::WIMLIB_PROGRESS_MSG_WRITE_METADATA_END. */ extern int wimlib_write(WIMStruct *wim, const wimlib_tchar *path, int image, int write_flags, - unsigned num_threads, - wimlib_progress_func_t progress_func); + unsigned num_threads); /** * @ingroup G_writing_and_overwriting_wims @@ -3950,8 +4140,7 @@ wimlib_write_to_fd(WIMStruct *wim, int fd, int image, int write_flags, - unsigned num_threads, - wimlib_progress_func_t progress_func); + unsigned num_threads); /** * @defgroup G_compression Compression and decompression functions