X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=include%2Fwimlib.h;h=76c79237e42d017238dc4b7a139d9170ad77f899;hb=f03cd53bd986ce7b1c96dfa51cf4fbb2b9de05d5;hp=23c53ad68bf2affac160ab0dcf995d774c798a32;hpb=9d25885329baa8e2e89a75687a584ec40fb3a976;p=wimlib diff --git a/include/wimlib.h b/include/wimlib.h index 23c53ad6..76c79237 100644 --- a/include/wimlib.h +++ b/include/wimlib.h @@ -31,7 +31,7 @@ /** * @mainpage * - * This is the documentation for the library interface of wimlib 1.7.0, a C + * This is the documentation for the library interface of wimlib 1.7.1, 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 @@ -383,7 +383,7 @@ #define WIMLIB_MINOR_VERSION 7 /** Patch version of the library (for example, the 5 in 1.2.5). */ -#define WIMLIB_PATCH_VERSION 0 +#define WIMLIB_PATCH_VERSION 1 #ifdef __cplusplus extern "C" { @@ -458,7 +458,7 @@ enum wimlib_compression_type { /** The XPRESS compression format. This format combines Lempel-Ziv * factorization with Huffman encoding. Compression and decompression * are both fast. This format supports chunk sizes that are powers of 2 - * between 2^12 and 2^26, inclusively. */ + * between 2^12 and 2^16, inclusively. */ WIMLIB_COMPRESSION_TYPE_XPRESS = 1, /** The LZX compression format. This format combines Lempel-Ziv @@ -620,6 +620,12 @@ enum wimlib_progress_msg { /** Starting to unmount a WIM image. @p info will point to * ::wimlib_progress_info.unmount. */ WIMLIB_PROGRESS_MSG_UNMOUNT_BEGIN = 25, + + /** wimlib has used a file's data for the last time (including all data + * streams, if it has multiple). @p info will point to + * ::wimlib_progress_info.done_with_file. This message is only received + * if ::WIMLIB_WRITE_FLAG_SEND_DONE_WITH_FILE_MESSAGES was provided. */ + WIMLIB_PROGRESS_MSG_DONE_WITH_FILE = 26, }; /** Valid return values from user-provided progress functions @@ -889,10 +895,11 @@ union wimlib_progress_info { * potentially multiple streams per file (named data streams). * A "stream" may be the default contents of a file, a named * data stream, or a reparse data buffer. */ - uint64_t num_streams; + uint64_t total_streams; - /** Reserved. */ - const wimlib_tchar *reserved_2; + /** Number of (not necessarily unique) streams that have been + * extracted so far. */ + uint64_t completed_streams; /** Currently only used for * ::WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN. */ @@ -1024,6 +1031,28 @@ union wimlib_progress_info { /** Flags passed to wimlib_unmount_image(). */ uint32_t unmount_flags; } unmount; + + /** Valid on messages ::WIMLIB_PROGRESS_MSG_DONE_WITH_FILE. */ + struct wimlib_progress_info_done_with_file { + /* Path to the file whose data has been written to the WIM file, + * or is currently being asynchronously compressed in memory, + * and therefore is no longer needed by wimlib. + * + * WARNING: The file data will not actually be accessible in the + * WIM file until the WIM file has been completely written. + * Ordinarily you should not treat this message as a + * green light to go ahead and delete the specified file, since + * that would result in data loss if the WIM file cannot be + * successfully created for any reason. + * + * If a file has multiple names (hard links), + * ::WIMLIB_PROGRESS_MSG_DONE_WITH_FILE will only be received + * for one name. Also, this message will not be received for + * empty files or reparse points (or symbolic links), unless + * they have nonempty named data streams. + */ + const wimlib_tchar *path_to_file; + } done_with_file; }; /** @@ -1377,12 +1406,18 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour /** @addtogroup G_modifying_wims * @{ */ -/** 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. */ +/** UNIX-like systems only: Directly capture an NTFS volume rather than a + * generic directory. This requires that wimlib was compiled with support for + * libntfs-3g. + * + * This flag cannot be combined with ::WIMLIB_ADD_FLAG_DEREFERENCE or + * ::WIMLIB_ADD_FLAG_UNIX_DATA. + * + * Do not use this flag on Windows, where wimlib already supports all + * Windows-native filesystems, including NTFS, through the Windows APIs. */ #define WIMLIB_ADD_FLAG_NTFS 0x00000001 -/** Follow symlinks; archive and dump the files they point to. Currently only +/** Follow symbolic links when scanning the directory tree. Currently only * supported on UNIX-like systems. */ #define WIMLIB_ADD_FLAG_DEREFERENCE 0x00000002 @@ -1391,65 +1426,72 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour * scanned. */ #define WIMLIB_ADD_FLAG_VERBOSE 0x00000004 -/** Mark the image being added as the bootable image of the WIM. Not valid for - * wimlib_update_image(). */ +/** Mark the image being added as the bootable image of the WIM. This flag is + * valid only for wimlib_add_image() and wimlib_add_image_multisource(). + * + * Note that you can also change the bootable image of a WIM using + * wimlib_set_wim_info(). + * + * Note: ::WIMLIB_ADD_FLAG_BOOT does something different from, and independent + * from, ::WIMLIB_ADD_FLAG_WIMBOOT. */ #define WIMLIB_ADD_FLAG_BOOT 0x00000008 /** UNIX-like systems only: Store the UNIX owner, group, mode, and device ID - * (major and minor number) of each file. See the documentation for the + * (major and minor number) of each file. Also allows capturing special files + * such as device nodes and FIFOs. See the documentation for the * --unix-data option to wimlib-imagex capture for more * information. */ #define WIMLIB_ADD_FLAG_UNIX_DATA 0x00000010 /** Do not capture security descriptors. Only has an effect in NTFS capture - * mode, or in Windows native builds. */ + * mode, or in Windows native builds. */ #define WIMLIB_ADD_FLAG_NO_ACLS 0x00000020 /** Fail immediately if the full security descriptor of any file or directory * cannot be accessed. Only has an effect in Windows native builds. The * default behavior without this flag is to first try omitting the SACL from the * security descriptor, then to try omitting the security descriptor entirely. - * */ + */ #define WIMLIB_ADD_FLAG_STRICT_ACLS 0x00000040 /** Call the progress function with the message * ::WIMLIB_PROGRESS_MSG_SCAN_DENTRY when a directory or file is excluded from * capture. This is a subset of the messages provided by - * ::WIMLIB_ADD_FLAG_VERBOSE. */ + * ::WIMLIB_ADD_FLAG_VERBOSE. */ #define WIMLIB_ADD_FLAG_EXCLUDE_VERBOSE 0x00000080 -/** Reparse-point fixups: Modify absolute symbolic links (or junction points, - * in the case of Windows) that point inside the directory being captured to - * instead be absolute relative to the directory being captured, rather than the - * current root. +/** Reparse-point fixups: Modify absolute symbolic links (and junctions, in the + * case of Windows) that point inside the directory being captured to instead be + * absolute relative to the directory being captured. * - * Without this flag, the default is to do this if WIM_HDR_FLAG_RP_FIX is set in - * the WIM header or if this is the first image being added. - * WIM_HDR_FLAG_RP_FIX is set if the first image in a WIM is captured with - * reparse point fixups enabled and currently cannot be unset. */ + * Without this flag, the default is to do reparse-point fixups if + * WIM_HDR_FLAG_RP_FIX is set in the WIM header or if this is the first image + * being added. WIM_HDR_FLAG_RP_FIX is set if the first image in a WIM is + * captured with reparse point fixups enabled and currently cannot be unset. */ #define WIMLIB_ADD_FLAG_RPFIX 0x00000100 -/** Don't do reparse point fixups. The default behavior is described in the - * documentation for ::WIMLIB_ADD_FLAG_RPFIX. */ +/** Don't do reparse point fixups. See ::WIMLIB_ADD_FLAG_RPFIX. */ #define WIMLIB_ADD_FLAG_NORPFIX 0x00000200 /** Do not automatically exclude unsupported files or directories from capture; * 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. */ + * UNIX-like systems when not also using ::WIMLIB_ADD_FLAG_UNIX_DATA. Instead, + * fail with ::WIMLIB_ERR_UNSUPPORTED_FILE when such a file is encountered. */ #define WIMLIB_ADD_FLAG_NO_UNSUPPORTED_EXCLUDE 0x00000400 /** * Automatically select a capture configuration appropriate for capturing * filesystems containing Windows operating systems. For example, - * "pagefile.sys" and "System Volume Information" will be excluded. + * "/pagefile.sys" and "System Volume Information" will be excluded. * - * When this flag is specified, the corresponding @p config parameter or member - * must be @c NULL. + * When this flag is specified, the corresponding @p config parameter (for + * wimlib_add_image()) or member (for wimlib_update_image()) must be @c NULL. + * Otherwise, ::WIMLIB_ERR_INVALID_PARAM will be returned. * - * Note that the default behavior--- that is, when this flag is not specified - * and @p config is @c NULL--- is to use no capture configuration, meaning that - * no files are excluded from capture. + * Note that the default behavior--- that is, when neither + * ::WIMLIB_ADD_FLAG_WINCONFIG nor ::WIMLIB_ADD_FLAG_WIMBOOT is specified and @p + * config is @c NULL--- is to use no capture configuration, meaning that no + * files are excluded from capture. */ #define WIMLIB_ADD_FLAG_WINCONFIG 0x00000800 @@ -1471,6 +1513,9 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour * * since that makes access to the data faster (at the cost of a worse * compression ratio compared to the 32768-byte LZX chunks usually used). + * + * Note: ::WIMLIB_ADD_FLAG_WIMBOOT does something different from, and + * independent from, ::WIMLIB_ADD_FLAG_BOOT. */ #define WIMLIB_ADD_FLAG_WIMBOOT 0x00001000 @@ -1919,7 +1964,7 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour * all streams recompressed in solid mode. * * Currently, new solid blocks will, by default, be written using LZMS - * compression with 64 MiB (67108864 byte) chunks. Use + * 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 @@ -1936,6 +1981,13 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour */ #define WIMLIB_WRITE_FLAG_PACK_STREAMS 0x00001000 +/** + * Send ::WIMLIB_PROGRESS_MSG_DONE_WITH_FILE messages while writing the WIM + * file. This is only needed in the unusual case that the library user needs to + * know exactly when wimlib has read each file for the last time. + */ +#define WIMLIB_WRITE_FLAG_SEND_DONE_WITH_FILE_MESSAGES 0x00002000 + /** @} */ /** @addtogroup G_general * @{ */ @@ -2816,8 +2868,9 @@ wimlib_get_compression_type_string(int ctype); * The error code returned by one of wimlib's functions. * * @return - * Pointer to a statically allocated string describing the error code, - * or @c NULL if the error code is not valid. + * Pointer to a statically allocated string describing the error code. If + * the error code is for some reason not recognized by the library, the + * string will be "Unknown error". */ extern const wimlib_tchar * wimlib_get_error_string(enum wimlib_error_code code); @@ -3625,6 +3678,43 @@ extern int wimlib_resolve_image(WIMStruct *wim, const wimlib_tchar *image_name_or_num); +/** + * @ingroup G_general + * + * Sets the file to which the library will print error and warning messages. + * + * This version of the function takes a C library FILE * opened for + * writing (or appending). Use wimlib_set_error_file_by_name() to specify the + * file by name instead. + * + * This also enables error messages, as if by a call to + * wimlib_set_print_errors(true). + * + * @return 0 on success; nonzero on error. + * @retval ::WIMLIB_ERR_UNSUPPORTED + * wimlib was compiled using the --without-error-messages option. + */ +extern int +wimlib_set_error_file(FILE *fp); + +/** + * @ingroup G_general + * + * Sets the path to the file to which the library will print error and warning + * messages. The library will open this file for appending. + * + * This also enables error messages, as if by a call to + * wimlib_set_print_errors(true). + * + * @return 0 on success; nonzero on error. + * @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 +wimlib_set_error_file_by_name(const wimlib_tchar *path); + /** * @ingroup G_modifying_wims * @@ -4194,144 +4284,6 @@ wimlib_write_to_fd(WIMStruct *wim, * @{ */ -/** Header for compression parameters to pass to wimlib_create_compressor() or - * wimlib_set_default_compressor_params(). */ -struct wimlib_compressor_params_header { - /** Size of the parameters, in bytes. */ - uint32_t size; -}; - -/** Header for decompression parameters to pass to wimlib_create_decompressor() - * or wimlib_set_default_decompressor_params() */ -struct wimlib_decompressor_params_header { - /** Size of the parameters, in bytes. */ - uint32_t size; -}; - -/** LZX compression parameters that can optionally be passed to - * wimlib_create_compressor() with the compression type - * ::WIMLIB_COMPRESSION_TYPE_LZX. */ -struct wimlib_lzx_compressor_params { - /** hdr.size Must be set to the size of this structure, in bytes. */ - struct wimlib_compressor_params_header hdr; - - /** Relatively fast LZX compression algorithm with a decent compression - * ratio. */ -#define WIMLIB_LZX_ALGORITHM_FAST 0 - - /** Slower LZX compression algorithm that provides a better compression - * ratio. This is the default. */ -#define WIMLIB_LZX_ALGORITHM_SLOW 1 - - /** Algorithm to use to perform the compression: either - * ::WIMLIB_LZX_ALGORITHM_FAST or ::WIMLIB_LZX_ALGORITHM_SLOW. The - * format is still LZX; this refers to the method the code will use to - * perform LZX-compatible compression. */ - uint32_t algorithm : 3; - - /** If set to 1, the default parameters for the specified algorithm are - * used rather than the ones specified in the following union. */ - uint32_t use_defaults : 1; - - union { - /** Parameters for the fast algorithm. */ - struct wimlib_lzx_fast_params { - uint32_t fast_reserved1[10]; - } fast; - - /** Parameters for the "slow" algorithm. */ - struct wimlib_lzx_slow_params { - /** If set to 1, the compressor can output length 2 - * matches. If set 0, the compressor can only output - * matches of length 3 or greater. Suggested value: 1 - */ - uint32_t use_len2_matches : 1; - - uint32_t slow_reserved1 : 31; - - /** Matches with length (in bytes) greater than or equal - * to this value are immediately taken without spending - * time on minimum-cost measurements. Suggested value: - * 32. */ - uint32_t nice_match_length; - - /** Number of passes to compute a match/literal sequence - * for each LZX block. This is for an iterative - * algorithm that attempts to minimize the cost of the - * match/literal sequence by using a cost model provided - * by the previous iteration. Must be at least 1. - * Suggested value: 2. */ - uint32_t num_optim_passes; - - /** Reserved; set to 0. */ - uint32_t slow_reserved_blocksplit; - - /** Maximum depth to search for matches at each - * position. Suggested value: 50. */ - uint32_t max_search_depth; - - /* Note: max_matches_per_pos has been removed and no - * longer has any effect. */ - - uint32_t slow_reserved2[3]; - - /** Assumed cost of a main symbol with zero frequency. - * Must be at least 1 and no more than 16. Suggested - * value: 15. */ - uint8_t main_nostat_cost; - - /** Assumed cost of a length symbol with zero frequency. - * Must be at least 1 and no more than 16. Suggested - * value: 15. */ - uint8_t len_nostat_cost; - - /** Assumed cost of an aligned symbol with zero - * frequency. Must be at least 1 and no more than 8. - * Suggested value: 7. */ - uint8_t aligned_nostat_cost; - - uint8_t slow_reserved3[5]; - } slow; - } alg_params; -}; - -/** LZMS compression parameters that can optionally be passed to - * wimlib_create_compressor() with the compression type - * ::WIMLIB_COMPRESSION_TYPE_LZMS. */ -struct wimlib_lzms_compressor_params { - /** hdr.size Must be set to the size of this structure, in bytes. */ - struct wimlib_compressor_params_header hdr; - - /** Minimum match length to output. This must be at least 2. Suggested - * value: 2 */ - uint32_t min_match_length; - - /** Maximum match length to output. This must be at least @p - * min_match_length. Suggested value: @p UINT32_MAX. */ - uint32_t max_match_length; - - /** Matches with length (in bytes) greater than or equal to this value - * are immediately taken without spending time on minimum-cost - * measurements. The minimum of @p max_match_length and @p - * nice_match_length may not exceed 65536. Suggested value: 32. */ - uint32_t nice_match_length; - - /** Maximum depth to search for matches at each position. Suggested - * value: 50. */ - uint32_t max_search_depth; - - /* Note: max_matches_per_pos has been removed and no longer has any - * effect. */ - - uint32_t reserved1; - - /** Length of the array for the near-optimal LZ parsing algorithm. This - * must be at least 1. Suggested value: 1024. */ - uint32_t optim_array_length; - - uint64_t reserved2[4]; -}; - /** Opaque compressor handle. */ struct wimlib_compressor; @@ -4339,41 +4291,40 @@ struct wimlib_compressor; struct wimlib_decompressor; /** - * Set the default compression parameters for the specified compression type. - * This will affect both explicit and library-internal calls to + * Set the default compression level for the specified compression type. This + * will affect both explicit and library-internal calls to * wimlib_create_compressor(). * * @param ctype - * Compression type for which to set the default compression parameters. - * @param params - * Compression-type specific parameters. This may be @c NULL, in which - * case the "default default" parameters are restored. + * Compression type for which to set the default compression level, as one + * of the ::wimlib_compression_type constants. Or, if this is the special + * value -1, the default compression levels for all known compression types + * will be set. + * @param compression_level + * The default compression level to set. If 0, the "default default" level + * is restored. Otherwise, a higher value indicates higher compression. + * The values are scaled so that 10 is low compression, 50 is medium + * compression, and 100 is high compression. * * @return 0 on success; nonzero on error. * * @retval ::WIMLIB_ERR_INVALID_COMPRESSION_TYPE - * @p ctype was not a supported compression type. - * @retval ::WIMLIB_ERR_INVALID_PARAM - * @p params were invalid. - * @retval ::WIMLIB_ERR_NOMEM - * Not enough memory to duplicate the parameters (perhaps @c params->size - * was invalid). + * @p ctype was neither a supported compression type nor -1. */ extern int -wimlib_set_default_compressor_params(enum wimlib_compression_type ctype, - const struct wimlib_compressor_params_header *params); +wimlib_set_default_compression_level(int ctype, unsigned int compression_level); /** * Returns the approximate number of bytes needed to allocate a compressor with * wimlib_create_compressor() for the specified compression type, block size, - * and parameters. @p params may be @c NULL, in which case the current default - * parameters for @p ctype are used. Returns 0 if the compression type or - * parameters are invalid. + * and compression level. @p compression_level may be 0, in which case the + * current default compression level for @p ctype is used. Returns 0 if the + * compression type is invalid. */ extern uint64_t wimlib_get_compressor_needed_memory(enum wimlib_compression_type ctype, size_t max_block_size, - const struct wimlib_compressor_params_header *params); + unsigned int compression_level); /** * Allocate a compressor for the specified compression type using the specified @@ -4386,12 +4337,11 @@ wimlib_get_compressor_needed_memory(enum wimlib_compression_type ctype, * Maximum block size to support. The exact meaning and allowed values for * this parameter depend on the compression type, but it at least specifies * the maximum allowed value for @p uncompressed_size to wimlib_compress(). - * @param extra_params - * An optional pointer to extra compressor parameters for the specified - * compression type. For LZX, a pointer to ::wimlib_lzx_compressor_params - * may be specified here. For LZMS, a pointer to - * ::wimlib_lzms_compressor_params may be specified here. If left @c NULL, - * the default parameters are used. + * @param compression_level + * The compression level to use. If 0, the default compression level is + * used. Otherwise, a higher value indicates higher compression. The + * values are scaled so that 10 is low compression, 50 is medium + * compression, and 100 is high compression. * @param compressor_ret * A location into which to return the pointer to the allocated compressor, * which can be used for any number of calls to wimlib_compress() before @@ -4402,14 +4352,14 @@ wimlib_get_compressor_needed_memory(enum wimlib_compression_type ctype, * @retval ::WIMLIB_ERR_INVALID_COMPRESSION_TYPE * @p ctype was not a supported compression type. * @retval ::WIMLIB_ERR_INVALID_PARAM - * The compression parameters were invalid. + * The compressor does not support the specified maximum block size. * @retval ::WIMLIB_ERR_NOMEM * Insufficient memory to allocate the compressor. */ extern int wimlib_create_compressor(enum wimlib_compression_type ctype, size_t max_block_size, - const struct wimlib_compressor_params_header *extra_params, + unsigned int compression_level, struct wimlib_compressor **compressor_ret); /** @@ -4445,29 +4395,6 @@ wimlib_compress(const void *uncompressed_data, size_t uncompressed_size, extern void wimlib_free_compressor(struct wimlib_compressor *compressor); -/** - * Set the default decompression parameters for the specified compression type. - * This will affect both explicit and library-internal calls to - * wimlib_create_decompressor(). - * - * @param ctype - * Compression type for which to set the default decompression parameters. - * @param params - * Compression-type specific parameters. This may be @c NULL, in which - * case the "default default" parameters are restored. - * - * @return 0 on success; nonzero on error. - * - * @retval ::WIMLIB_ERR_INVALID_COMPRESSION_TYPE - * @p ctype was not a supported compression type. - * @retval ::WIMLIB_ERR_NOMEM - * Not enough memory to duplicate the parameters (perhaps @c params->size - * was invalid). - */ -extern int -wimlib_set_default_decompressor_params(enum wimlib_compression_type ctype, - const struct wimlib_decompressor_params_header *params); - /** * Allocate a decompressor for the specified compression type using the * specified parameters. This function is part of wimlib's compression API; it @@ -4480,9 +4407,6 @@ wimlib_set_default_decompressor_params(enum wimlib_compression_type ctype, * this parameter depend on the compression type, but it at least specifies * the maximum allowed value for @p uncompressed_size to * wimlib_decompress(). - * @param extra_params - * An optional pointer to extra decompressor parameters for the specified - * compression type. If @c NULL, the default parameters are used. * @param decompressor_ret * A location into which to return the pointer to the allocated * decompressor, which can be used for any number of calls to @@ -4492,15 +4416,12 @@ wimlib_set_default_decompressor_params(enum wimlib_compression_type ctype, * * @retval ::WIMLIB_ERR_INVALID_COMPRESSION_TYPE * @p ctype was not a supported compression type. - * @retval ::WIMLIB_ERR_INVALID_PARAM - * The decompression parameters were invalid. * @retval ::WIMLIB_ERR_NOMEM * Insufficient memory to allocate the decompressor. */ extern int wimlib_create_decompressor(enum wimlib_compression_type ctype, size_t max_block_size, - const struct wimlib_decompressor_params_header *extra_params, struct wimlib_decompressor **decompressor_ret); /**