X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;ds=sidebyside;f=programs%2Fimagex.c;h=5dd523228ae7a53a808c36db7de3379d5e9a06c6;hb=1c893605029270ae2b75ad1d90517aebdb78eb14;hp=d64f2e04d62ca19d9c5bfe00cda192683b8cca3f;hpb=df3f7be471421d70a7a094f8c1ba0e74d33eb00c;p=wimlib diff --git a/programs/imagex.c b/programs/imagex.c index d64f2e04..5dd52322 100644 --- a/programs/imagex.c +++ b/programs/imagex.c @@ -144,6 +144,7 @@ enum { IMAGEX_NO_ACLS_OPTION, IMAGEX_NO_WILDCARDS_OPTION, IMAGEX_NOT_PIPABLE_OPTION, + IMAGEX_PACK_CHUNK_SIZE_OPTION, IMAGEX_PACK_STREAMS_OPTION, IMAGEX_PATH_OPTION, IMAGEX_PIPABLE_OPTION, @@ -195,7 +196,10 @@ static const struct option capture_or_append_options[] = { {T("compress"), required_argument, NULL, IMAGEX_COMPRESS_OPTION}, {T("compress-slow"), no_argument, NULL, IMAGEX_COMPRESS_SLOW_OPTION}, {T("chunk-size"), required_argument, NULL, IMAGEX_CHUNK_SIZE_OPTION}, + {T("pack-chunk-size"), required_argument, NULL, IMAGEX_PACK_CHUNK_SIZE_OPTION}, + {T("solid-chunk-size"),required_argument, NULL, IMAGEX_PACK_CHUNK_SIZE_OPTION}, {T("pack-streams"), no_argument, NULL, IMAGEX_PACK_STREAMS_OPTION}, + {T("solid"), no_argument, NULL, IMAGEX_PACK_STREAMS_OPTION}, {T("config"), required_argument, NULL, IMAGEX_CONFIG_OPTION}, {T("dereference"), no_argument, NULL, IMAGEX_DEREFERENCE_OPTION}, {T("flags"), required_argument, NULL, IMAGEX_FLAGS_OPTION}, @@ -234,7 +238,10 @@ static const struct option export_options[] = { {T("no-check"), no_argument, NULL, IMAGEX_NOCHECK_OPTION}, {T("compress"), required_argument, NULL, IMAGEX_COMPRESS_OPTION}, {T("pack-streams"),no_argument, NULL, IMAGEX_PACK_STREAMS_OPTION}, + {T("solid"), no_argument, NULL, IMAGEX_PACK_STREAMS_OPTION}, {T("chunk-size"), required_argument, NULL, IMAGEX_CHUNK_SIZE_OPTION}, + {T("pack-chunk-size"), required_argument, NULL, IMAGEX_PACK_CHUNK_SIZE_OPTION}, + {T("solid-chunk-size"),required_argument, NULL, IMAGEX_PACK_CHUNK_SIZE_OPTION}, {T("ref"), required_argument, NULL, IMAGEX_REF_OPTION}, {T("threads"), required_argument, NULL, IMAGEX_THREADS_OPTION}, {T("rebuild"), no_argument, NULL, IMAGEX_REBUILD_OPTION}, @@ -297,7 +304,10 @@ static const struct option optimize_options[] = { {T("compress-slow"), no_argument, NULL, IMAGEX_COMPRESS_SLOW_OPTION}, {T("recompress-slow"), no_argument, NULL, IMAGEX_COMPRESS_SLOW_OPTION}, {T("chunk-size"), required_argument, NULL, IMAGEX_CHUNK_SIZE_OPTION}, + {T("pack-chunk-size"), required_argument, NULL, IMAGEX_PACK_CHUNK_SIZE_OPTION}, + {T("solid-chunk-size"),required_argument, NULL, IMAGEX_PACK_CHUNK_SIZE_OPTION}, {T("pack-streams"),no_argument, NULL, IMAGEX_PACK_STREAMS_OPTION}, + {T("solid"), no_argument, NULL, IMAGEX_PACK_STREAMS_OPTION}, {T("threads"), required_argument, NULL, IMAGEX_THREADS_OPTION}, {T("pipable"), no_argument, NULL, IMAGEX_PIPABLE_OPTION}, {T("not-pipable"), no_argument, NULL, IMAGEX_NOT_PIPABLE_OPTION}, @@ -434,11 +444,10 @@ get_compression_type(const tchar *optarg) } } -static int +static void set_compress_slow(void) { - int ret; - static const struct wimlib_lzx_compressor_params slow_params = { + static const struct wimlib_lzx_compressor_params lzx_slow_params = { .hdr = { .size = sizeof(struct wimlib_lzx_compressor_params), }, @@ -446,7 +455,7 @@ set_compress_slow(void) .alg_params = { .slow = { .use_len2_matches = 1, - .num_fast_bytes = 96, + .nice_match_length = 96, .num_optim_passes = 4, .max_search_depth = 100, .max_matches_per_pos = 10, @@ -456,11 +465,24 @@ set_compress_slow(void) }, }, }; - ret = wimlib_set_default_compressor_params(WIMLIB_COMPRESSION_TYPE_LZX, - &slow_params.hdr); - if (ret) - imagex_error(T("Couldn't set slow compression parameters.!")); - return ret; + + static const struct wimlib_lzms_compressor_params lzms_slow_params = { + .hdr = { + .size = sizeof(struct wimlib_lzms_compressor_params), + }, + .min_match_length = 2, + .max_match_length = UINT32_MAX, + .nice_match_length = 96, + .max_search_depth = 100, + .max_matches_per_pos = 10, + .optim_array_length = 1024, + }; + + wimlib_set_default_compressor_params(WIMLIB_COMPRESSION_TYPE_LZX, + &lzx_slow_params.hdr); + + wimlib_set_default_compressor_params(WIMLIB_COMPRESSION_TYPE_LZMS, + &lzms_slow_params.hdr); } struct string_set { @@ -1736,6 +1758,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) int write_flags = 0; int compression_type = WIMLIB_COMPRESSION_TYPE_INVALID; uint32_t chunk_size = UINT32_MAX; + uint32_t pack_chunk_size = UINT32_MAX; const tchar *wimfile; int wim_fd; const tchar *name; @@ -1768,6 +1791,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) struct wimlib_capture_source *capture_sources; size_t num_sources; bool name_defaulted; + bool compress_slow = false; for_opt(c, capture_or_append_options) { switch (c) { @@ -1791,16 +1815,18 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) goto out_err; break; case IMAGEX_COMPRESS_SLOW_OPTION: - ret = set_compress_slow(); - if (ret) - goto out_err; - compression_type = WIMLIB_COMPRESSION_TYPE_LZX; + compress_slow = true; break; case IMAGEX_CHUNK_SIZE_OPTION: chunk_size = parse_chunk_size(optarg); if (chunk_size == UINT32_MAX) goto out_err; break; + case IMAGEX_PACK_CHUNK_SIZE_OPTION: + pack_chunk_size = parse_chunk_size(optarg); + if (pack_chunk_size == UINT32_MAX) + goto out_err; + break; case IMAGEX_PACK_STREAMS_OPTION: write_flags |= WIMLIB_WRITE_FLAG_PACK_STREAMS; break; @@ -1888,19 +1914,26 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) source = argv[0]; wimfile = argv[1]; - /* Set default compression type. */ + /* Set default compression type and parameters. */ + + if (compression_type == WIMLIB_COMPRESSION_TYPE_INVALID) { - struct wimlib_lzx_compressor_params params; - memset(¶ms, 0, sizeof(params)); - params.hdr.size = sizeof(params); - params.algorithm = WIMLIB_LZX_ALGORITHM_FAST; - params.use_defaults = 1; - - wimlib_set_default_compressor_params(WIMLIB_COMPRESSION_TYPE_LZX, - ¶ms.hdr); compression_type = WIMLIB_COMPRESSION_TYPE_LZX; + + if (!compress_slow) { + struct wimlib_lzx_compressor_params params = { + .hdr.size = sizeof(params), + .algorithm = WIMLIB_LZX_ALGORITHM_FAST, + .use_defaults = 1, + }; + wimlib_set_default_compressor_params(WIMLIB_COMPRESSION_TYPE_LZX, + ¶ms.hdr); + } } + if (compress_slow) + set_compress_slow(); + if (!tstrcmp(wimfile, T("-"))) { /* Writing captured WIM to standard output. */ #if 0 @@ -2041,6 +2074,11 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) if (ret) goto out_free_wim; } + if (pack_chunk_size != UINT32_MAX) { + ret = wimlib_set_output_pack_chunk_size(wim, pack_chunk_size); + if (ret) + goto out_free_wim; + } #ifndef __WIN32__ /* Detect if source is regular file or block device and set NTFS volume @@ -2434,6 +2472,7 @@ imagex_export(int argc, tchar **argv, int cmd) STRING_SET(refglobs); unsigned num_threads = 0; uint32_t chunk_size = UINT32_MAX; + uint32_t pack_chunk_size = UINT32_MAX; for_opt(c, export_options) { switch (c) { @@ -2460,6 +2499,11 @@ imagex_export(int argc, tchar **argv, int cmd) if (chunk_size == UINT32_MAX) goto out_err; break; + case IMAGEX_PACK_CHUNK_SIZE_OPTION: + pack_chunk_size = parse_chunk_size(optarg); + if (pack_chunk_size == UINT32_MAX) + goto out_err; + break; case IMAGEX_REF_OPTION: ret = string_set_append(&refglobs, optarg); if (ret) @@ -2589,6 +2633,11 @@ imagex_export(int argc, tchar **argv, int cmd) if (ret) goto out_free_dest_wim; } + if (pack_chunk_size != UINT32_MAX) { + ret = wimlib_set_output_pack_chunk_size(dest_wim, pack_chunk_size); + if (ret) + goto out_free_dest_wim; + } image = wimlib_resolve_image(src_wim, src_image_num_or_name); ret = verify_image_exists(image, src_image_num_or_name, src_wimfile); @@ -3388,6 +3437,7 @@ imagex_optimize(int argc, tchar **argv, int cmd) int write_flags = WIMLIB_WRITE_FLAG_REBUILD; int compression_type = WIMLIB_COMPRESSION_TYPE_INVALID; uint32_t chunk_size = UINT32_MAX; + uint32_t pack_chunk_size = UINT32_MAX; int ret; WIMStruct *wim; const tchar *wimfile; @@ -3415,16 +3465,18 @@ imagex_optimize(int argc, tchar **argv, int cmd) break; case IMAGEX_COMPRESS_SLOW_OPTION: write_flags |= WIMLIB_WRITE_FLAG_RECOMPRESS; - compression_type = WIMLIB_COMPRESSION_TYPE_LZX; - ret = set_compress_slow(); - if (ret) - goto out_err; + set_compress_slow(); break; case IMAGEX_CHUNK_SIZE_OPTION: chunk_size = parse_chunk_size(optarg); if (chunk_size == UINT32_MAX) goto out_err; break; + case IMAGEX_PACK_CHUNK_SIZE_OPTION: + pack_chunk_size = parse_chunk_size(optarg); + if (pack_chunk_size == UINT32_MAX) + goto out_err; + break; case IMAGEX_PACK_STREAMS_OPTION: write_flags |= WIMLIB_WRITE_FLAG_PACK_STREAMS; write_flags |= WIMLIB_WRITE_FLAG_RECOMPRESS; @@ -3469,6 +3521,11 @@ imagex_optimize(int argc, tchar **argv, int cmd) if (ret) goto out_wimlib_free; } + if (pack_chunk_size != UINT32_MAX) { + ret = wimlib_set_output_pack_chunk_size(wim, pack_chunk_size); + if (ret) + goto out_wimlib_free; + } old_size = file_get_size(wimfile); tprintf(T("\"%"TS"\" original size: "), wimfile);