]> wimlib.net Git - wimlib/blobdiff - include/wimlib.h
Merge compression updates
[wimlib] / include / wimlib.h
index f56e72cf0047585db6eb4995d5d2b282ab46953f..17e5957401a236446f85db7cefcea06a51e5a985 100644 (file)
@@ -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 <c>2^12</c> and <c>2^26</c>, inclusively.  */
+        * between <c>2^12</c> and <c>2^16</c>, inclusively.  */
        WIMLIB_COMPRESSION_TYPE_XPRESS = 1,
 
        /** The LZX compression format.  This format combines Lempel-Ziv
@@ -895,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.  */
@@ -1405,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
 
@@ -1419,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
  * <b>--unix-data</b> option to <b>wimlib-imagex capture</b> 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
 
@@ -1499,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
 
@@ -1947,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
@@ -3660,6 +3677,39 @@ extern int
 wimlib_resolve_image(WIMStruct *wim,
                     const wimlib_tchar *image_name_or_num);
 
+/**
+ * Sets the file to which the library will print error and warning messages.
+ *
+ * This version of the function takes a C library <c>FILE *</c> 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 <c>--without-error-messages</c> option.
+ */
+extern int
+wimlib_set_error_file(FILE *fp);
+
+/**
+ * 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 <c>--without-error-messages</c> option.
+ */
+extern int
+wimlib_set_error_file_by_name(const wimlib_tchar *path);
+
 /**
  * @ingroup G_modifying_wims
  *
@@ -4229,144 +4279,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;
 
@@ -4374,41 +4286,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.  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(enum wimlib_compression_type 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
@@ -4421,12 +4332,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
@@ -4437,14 +4347,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);
 
 /**
@@ -4480,29 +4390,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
@@ -4515,9 +4402,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
@@ -4527,15 +4411,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);
 
 /**