X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=programs%2Fimagex.c;h=b7ff47ef14aa829eb2a75190e13d99c60c0dfa3f;hb=f84a3d108722a2290f45d384638206663a9df824;hp=a086558cfedb80120440ad1202936ed93cde1ddf;hpb=747c5e021df09572643c6a75e74a4e8f1a88f861;p=wimlib diff --git a/programs/imagex.c b/programs/imagex.c index a086558c..b7ff47ef 100644 --- a/programs/imagex.c +++ b/programs/imagex.c @@ -194,6 +194,7 @@ enum { IMAGEX_THREADS_OPTION, IMAGEX_TO_STDOUT_OPTION, IMAGEX_UNIX_DATA_OPTION, + IMAGEX_UNSAFE_COMPACT_OPTION, IMAGEX_UPDATE_OF_OPTION, IMAGEX_VERBOSE_OPTION, IMAGEX_WIMBOOT_CONFIG_OPTION, @@ -254,12 +255,14 @@ static const struct option capture_or_append_options[] = { {T("update-of"), required_argument, NULL, IMAGEX_UPDATE_OF_OPTION}, {T("delta-from"), required_argument, NULL, IMAGEX_DELTA_FROM_OPTION}, {T("wimboot"), no_argument, NULL, IMAGEX_WIMBOOT_OPTION}, + {T("unsafe-compact"), no_argument, NULL, IMAGEX_UNSAFE_COMPACT_OPTION}, {NULL, 0, NULL, 0}, }; static const struct option delete_options[] = { {T("check"), no_argument, NULL, IMAGEX_CHECK_OPTION}, {T("soft"), no_argument, NULL, IMAGEX_SOFT_OPTION}, + {T("unsafe-compact"), no_argument, NULL, IMAGEX_UNSAFE_COMPACT_OPTION}, {NULL, 0, NULL, 0}, }; @@ -293,6 +296,7 @@ static const struct option export_options[] = { {T("pipable"), no_argument, NULL, IMAGEX_PIPABLE_OPTION}, {T("not-pipable"), no_argument, NULL, IMAGEX_NOT_PIPABLE_OPTION}, {T("wimboot"), no_argument, NULL, IMAGEX_WIMBOOT_OPTION}, + {T("unsafe-compact"), no_argument, NULL, IMAGEX_UNSAFE_COMPACT_OPTION}, {NULL, 0, NULL, 0}, }; @@ -366,6 +370,7 @@ static const struct option optimize_options[] = { {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}, + {T("unsafe-compact"), no_argument, NULL, IMAGEX_UNSAFE_COMPACT_OPTION}, {NULL, 0, NULL, 0}, }; @@ -410,6 +415,7 @@ static const struct option update_options[] = { {T("no-acls"), no_argument, NULL, IMAGEX_NO_ACLS_OPTION}, {T("strict-acls"), no_argument, NULL, IMAGEX_STRICT_ACLS_OPTION}, {T("no-replace"), no_argument, NULL, IMAGEX_NO_REPLACE_OPTION}, + {T("unsafe-compact"), no_argument, NULL, IMAGEX_UNSAFE_COMPACT_OPTION}, {NULL, 0, NULL, 0}, }; @@ -1951,6 +1957,14 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) case IMAGEX_WIMBOOT_OPTION: add_flags |= WIMLIB_ADD_FLAG_WIMBOOT; break; + case IMAGEX_UNSAFE_COMPACT_OPTION: + if (cmd != CMD_APPEND) { + imagex_error(T("'--unsafe-compact' is only " + "valid for append!")); + goto out_err; + } + write_flags |= WIMLIB_WRITE_FLAG_UNSAFE_COMPACT; + break; default: goto out_usage; } @@ -2108,11 +2122,21 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) ret = wimlib_set_output_chunk_size(wim, chunk_size); if (ret) goto out_free_wim; - } else if ((add_flags & WIMLIB_ADD_FLAG_WIMBOOT) && - compression_type == WIMLIB_COMPRESSION_TYPE_XPRESS) { - ret = wimlib_set_output_chunk_size(wim, 4096); - if (ret) - goto out_free_wim; + } else if ((add_flags & WIMLIB_ADD_FLAG_WIMBOOT)) { + + int ctype = compression_type; + + if (cmd == CMD_APPEND) { + struct wimlib_wim_info info; + wimlib_get_wim_info(wim, &info); + ctype = info.compression_type; + } + + if (ctype == WIMLIB_COMPRESSION_TYPE_XPRESS) { + ret = wimlib_set_output_chunk_size(wim, 4096); + if (ret) + goto out_free_wim; + } } if (solid_ctype != WIMLIB_COMPRESSION_TYPE_INVALID) { ret = wimlib_set_output_pack_compression_type(wim, solid_ctype); @@ -2353,6 +2377,9 @@ imagex_delete(int argc, tchar **argv, int cmd) case IMAGEX_SOFT_OPTION: write_flags |= WIMLIB_WRITE_FLAG_SOFT_DELETE; break; + case IMAGEX_UNSAFE_COMPACT_OPTION: + write_flags |= WIMLIB_WRITE_FLAG_UNSAFE_COMPACT; + break; default: goto out_usage; } @@ -2837,6 +2864,9 @@ imagex_export(int argc, tchar **argv, int cmd) case IMAGEX_WIMBOOT_OPTION: export_flags |= WIMLIB_EXPORT_FLAG_WIMBOOT; break; + case IMAGEX_UNSAFE_COMPACT_OPTION: + write_flags |= WIMLIB_WRITE_FLAG_UNSAFE_COMPACT; + break; default: goto out_usage; } @@ -2926,6 +2956,13 @@ imagex_export(int argc, tchar **argv, int cmd) goto out_free_src_wim; } + if (write_flags & WIMLIB_WRITE_FLAG_UNSAFE_COMPACT) { + imagex_error(T("'--unsafe-compact' is only valid when " + "exporting to an existing WIM file!")); + ret = -1; + goto out_free_src_wim; + } + /* dest_wimfile is not an existing file, so create a new WIM. */ if (compression_type == WIMLIB_COMPRESSION_TYPE_INVALID) { @@ -3735,6 +3772,9 @@ imagex_optimize(int argc, tchar **argv, int cmd) case IMAGEX_NOT_PIPABLE_OPTION: write_flags |= WIMLIB_WRITE_FLAG_NOT_PIPABLE; break; + case IMAGEX_UNSAFE_COMPACT_OPTION: + write_flags |= WIMLIB_WRITE_FLAG_UNSAFE_COMPACT; + break; default: goto out_usage; } @@ -4032,6 +4072,9 @@ imagex_update(int argc, tchar **argv, int cmd) case IMAGEX_NO_REPLACE_OPTION: default_add_flags |= WIMLIB_ADD_FLAG_NO_REPLACE; break; + case IMAGEX_UNSAFE_COMPACT_OPTION: + write_flags |= WIMLIB_WRITE_FLAG_UNSAFE_COMPACT; + break; default: goto out_usage; }