X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=programs%2Fimagex.c;h=e44ff276b49414526d827b1d40d7b3e2bb4a1ff6;hb=14a395345aaa9dce84bf178a86243388c1c9f497;hp=69d7a6c74e7e5760a04c30d44d2d4f5934d1a3b9;hpb=0edea6a7d2affc25ee132e00551cea69fd20a4a8;p=wimlib diff --git a/programs/imagex.c b/programs/imagex.c index 69d7a6c7..e44ff276 100644 --- a/programs/imagex.c +++ b/programs/imagex.c @@ -6,7 +6,7 @@ */ /* - * Copyright (C) 2012-2018 Eric Biggers + * Copyright (C) 2012-2021 Eric Biggers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -48,23 +48,27 @@ #define WIMLIB_COMPRESSION_TYPE_INVALID (-1) -#ifdef __WIN32__ +#ifdef _WIN32 # include "imagex-win32.h" # define print_security_descriptor win32_print_security_descriptor -#else /* __WIN32__ */ +#else /* _WIN32 */ # include # include # define print_security_descriptor default_print_security_descriptor static inline void set_fd_to_binary_mode(int fd) { } -#endif /* !__WIN32 */ +/* NetBSD is missing getopt_long_only() but has getopt_long() */ +#ifndef HAVE_GETOPT_LONG_ONLY +# define getopt_long_only getopt_long +#endif +#endif /* !_WIN32 */ /* Don't confuse the user by presenting the mounting commands on Windows when * they will never work. However on UNIX-like systems we always present them, * even if WITH_FUSE is not defined at this point, as to not tie the build of * wimlib-imagex to a specific build of wimlib. */ -#ifdef __WIN32__ +#ifdef _WIN32 # define WIM_MOUNTING_SUPPORTED 0 #else # define WIM_MOUNTING_SUPPORTED 1 @@ -167,6 +171,7 @@ enum { IMAGEX_COMPACT_OPTION, IMAGEX_COMPRESS_OPTION, IMAGEX_CONFIG_OPTION, + IMAGEX_CREATE_OPTION, IMAGEX_DEBUG_OPTION, IMAGEX_DELTA_FROM_OPTION, IMAGEX_DEREFERENCE_OPTION, @@ -177,6 +182,7 @@ enum { IMAGEX_FORCE_OPTION, IMAGEX_HEADER_OPTION, IMAGEX_IMAGE_PROPERTY_OPTION, + IMAGEX_INCLUDE_INTEGRITY_OPTION, IMAGEX_INCLUDE_INVALID_NAMES_OPTION, IMAGEX_LAZY_OPTION, IMAGEX_METADATA_OPTION, @@ -196,6 +202,7 @@ enum { IMAGEX_PRESERVE_DIR_STRUCTURE_OPTION, IMAGEX_REBUILD_OPTION, IMAGEX_RECOMPRESS_OPTION, + IMAGEX_RECOVER_DATA_OPTION, IMAGEX_RECURSIVE_OPTION, IMAGEX_REF_OPTION, IMAGEX_RPFIX_OPTION, @@ -233,6 +240,7 @@ static const struct option apply_options[] = { {T("include-invalid-names"), no_argument, NULL, IMAGEX_INCLUDE_INVALID_NAMES_OPTION}, {T("wimboot"), no_argument, NULL, IMAGEX_WIMBOOT_OPTION}, {T("compact"), required_argument, NULL, IMAGEX_COMPACT_OPTION}, + {T("recover-data"), no_argument, NULL, IMAGEX_RECOVER_DATA_OPTION}, {NULL, 0, NULL, 0}, }; @@ -241,6 +249,7 @@ static const struct option capture_or_append_options[] = { {T("check"), no_argument, NULL, IMAGEX_CHECK_OPTION}, {T("no-check"), no_argument, NULL, IMAGEX_NOCHECK_OPTION}, {T("nocheck"), no_argument, NULL, IMAGEX_NOCHECK_OPTION}, + {T("include-integrity"), no_argument, NULL, IMAGEX_INCLUDE_INTEGRITY_OPTION}, {T("compress"), required_argument, NULL, IMAGEX_COMPRESS_OPTION}, {T("chunk-size"), required_argument, NULL, IMAGEX_CHUNK_SIZE_OPTION}, {T("solid"), no_argument, NULL, IMAGEX_SOLID_OPTION}, @@ -268,11 +277,13 @@ static const struct option capture_or_append_options[] = { {T("wimboot"), no_argument, NULL, IMAGEX_WIMBOOT_OPTION}, {T("unsafe-compact"), no_argument, NULL, IMAGEX_UNSAFE_COMPACT_OPTION}, {T("snapshot"), no_argument, NULL, IMAGEX_SNAPSHOT_OPTION}, + {T("create"), no_argument, NULL, IMAGEX_CREATE_OPTION}, {NULL, 0, NULL, 0}, }; static const struct option delete_options[] = { {T("check"), no_argument, NULL, IMAGEX_CHECK_OPTION}, + {T("include-integrity"), no_argument, NULL, IMAGEX_INCLUDE_INTEGRITY_OPTION}, {T("soft"), no_argument, NULL, IMAGEX_SOFT_OPTION}, {T("unsafe-compact"), no_argument, NULL, IMAGEX_UNSAFE_COMPACT_OPTION}, {NULL, 0, NULL, 0}, @@ -291,6 +302,7 @@ static const struct option export_options[] = { {T("check"), no_argument, NULL, IMAGEX_CHECK_OPTION}, {T("nocheck"), no_argument, NULL, IMAGEX_NOCHECK_OPTION}, {T("no-check"), no_argument, NULL, IMAGEX_NOCHECK_OPTION}, + {T("include-integrity"), no_argument, NULL, IMAGEX_INCLUDE_INTEGRITY_OPTION}, {T("compress"), required_argument, NULL, IMAGEX_COMPRESS_OPTION}, {T("recompress"), no_argument, NULL, IMAGEX_RECOMPRESS_OPTION}, {T("chunk-size"), required_argument, NULL, IMAGEX_CHUNK_SIZE_OPTION}, @@ -326,6 +338,7 @@ static const struct option extract_options[] = { {T("preserve-dir-structure"), no_argument, NULL, IMAGEX_PRESERVE_DIR_STRUCTURE_OPTION}, {T("wimboot"), no_argument, NULL, IMAGEX_WIMBOOT_OPTION}, {T("compact"), required_argument, NULL, IMAGEX_COMPACT_OPTION}, + {T("recover-data"), no_argument, NULL, IMAGEX_RECOVER_DATA_OPTION}, {NULL, 0, NULL, 0}, }; @@ -334,6 +347,7 @@ static const struct option info_options[] = { {T("check"), no_argument, NULL, IMAGEX_CHECK_OPTION}, {T("nocheck"), no_argument, NULL, IMAGEX_NOCHECK_OPTION}, {T("no-check"), no_argument, NULL, IMAGEX_NOCHECK_OPTION}, + {T("include-integrity"), no_argument, NULL, IMAGEX_INCLUDE_INTEGRITY_OPTION}, {T("extract-xml"), required_argument, NULL, IMAGEX_EXTRACT_XML_OPTION}, {T("header"), no_argument, NULL, IMAGEX_HEADER_OPTION}, {T("lookup-table"), no_argument, NULL, IMAGEX_BLOBS_OPTION}, @@ -345,6 +359,7 @@ static const struct option info_options[] = { static const struct option join_options[] = { {T("check"), no_argument, NULL, IMAGEX_CHECK_OPTION}, + {T("include-integrity"), no_argument, NULL, IMAGEX_INCLUDE_INTEGRITY_OPTION}, {NULL, 0, NULL, 0}, }; @@ -365,6 +380,7 @@ static const struct option optimize_options[] = { {T("check"), no_argument, NULL, IMAGEX_CHECK_OPTION}, {T("nocheck"), no_argument, NULL, IMAGEX_NOCHECK_OPTION}, {T("no-check"), no_argument, NULL, IMAGEX_NOCHECK_OPTION}, + {T("include-integrity"), no_argument, NULL, IMAGEX_INCLUDE_INTEGRITY_OPTION}, {T("compress"), required_argument, NULL, IMAGEX_COMPRESS_OPTION}, {T("recompress"), no_argument, NULL, IMAGEX_RECOMPRESS_OPTION}, {T("chunk-size"), required_argument, NULL, IMAGEX_CHUNK_SIZE_OPTION}, @@ -381,6 +397,7 @@ static const struct option optimize_options[] = { static const struct option split_options[] = { {T("check"), no_argument, NULL, IMAGEX_CHECK_OPTION}, + {T("include-integrity"), no_argument, NULL, IMAGEX_INCLUDE_INTEGRITY_OPTION}, {NULL, 0, NULL, 0}, }; @@ -403,6 +420,7 @@ static const struct option update_options[] = { * update_command_add_option(). */ {T("threads"), required_argument, NULL, IMAGEX_THREADS_OPTION}, {T("check"), no_argument, NULL, IMAGEX_CHECK_OPTION}, + {T("include-integrity"), no_argument, NULL, IMAGEX_INCLUDE_INTEGRITY_OPTION}, {T("rebuild"), no_argument, NULL, IMAGEX_REBUILD_OPTION}, {T("command"), required_argument, NULL, IMAGEX_COMMAND_OPTION}, {T("wimboot-config"), required_argument, NULL, IMAGEX_WIMBOOT_CONFIG_OPTION}, @@ -1037,12 +1055,12 @@ stdin_get_contents(size_t *len_ret) static tchar * translate_text_to_tstr(char *text, size_t num_bytes, size_t *num_tchars_ret) { -#ifndef __WIN32__ +#ifndef _WIN32 /* On non-Windows, assume an ASCII-compatible encoding, such as UTF-8. * */ *num_tchars_ret = num_bytes; return text; -#else /* !__WIN32__ */ +#else /* !_WIN32 */ /* On Windows, translate the text to UTF-16LE */ wchar_t *text_wstr; size_t num_wchars; @@ -1069,7 +1087,7 @@ translate_text_to_tstr(char *text, size_t num_bytes, size_t *num_tchars_ret) } *num_tchars_ret = num_wchars; return text_wstr; -#endif /* __WIN32__ */ +#endif /* _WIN32 */ } static tchar * @@ -1148,6 +1166,31 @@ report_scan_progress(const struct wimlib_progress_info_scan *scan, bool done) last_scan_progress = *scan; } } + +static struct wimlib_progress_info_split last_split_progress; + +static void +report_split_progress(uint64_t bytes_completed_in_part) +{ + uint64_t completed_bytes = last_split_progress.completed_bytes + + bytes_completed_in_part; + unsigned percent_done = TO_PERCENT(completed_bytes, + last_split_progress.total_bytes); + unsigned unit_shift; + const tchar *unit_name; + + unit_shift = get_unit(last_split_progress.total_bytes, &unit_name); + imagex_printf(T("\rSplitting WIM: %"PRIu64" %"TS" of " + "%"PRIu64" %"TS" (%u%%) written, part %u of %u"), + completed_bytes >> unit_shift, + unit_name, + last_split_progress.total_bytes >> unit_shift, + unit_name, + percent_done, + last_split_progress.cur_part_number, + last_split_progress.total_parts); +} + /* Progress callback function passed to various wimlib functions. */ static enum wimlib_progress_status imagex_progress_func(enum wimlib_progress_msg msg, @@ -1160,6 +1203,12 @@ imagex_progress_func(enum wimlib_progress_msg msg, switch (msg) { case WIMLIB_PROGRESS_MSG_WRITE_STREAMS: + if (last_split_progress.total_bytes != 0) { + /* wimlib_split() in progress; use the split-specific + * progress message. */ + report_split_progress(info->write_streams.completed_compressed_bytes); + break; + } { static bool started; if (!started) { @@ -1216,7 +1265,7 @@ imagex_progress_func(enum wimlib_progress_msg msg, * default installation. On UNIX-like systems, warn the * user when fixing the target of an absolute symbolic * link, so they know to disable this if they want. */ - #ifndef __WIN32__ + #ifndef _WIN32 imagex_printf(T("\nWARNING: Adjusted target of " "absolute symbolic link \"%"TS"\"\n" " (Use --norpfix to capture " @@ -1315,26 +1364,9 @@ imagex_progress_func(enum wimlib_progress_msg msg, } break; case WIMLIB_PROGRESS_MSG_SPLIT_BEGIN_PART: - percent_done = TO_PERCENT(info->split.completed_bytes, - info->split.total_bytes); - unit_shift = get_unit(info->split.total_bytes, &unit_name); - imagex_printf(T("Writing \"%"TS"\" (part %u of %u): %"PRIu64" %"TS" of " - "%"PRIu64" %"TS" (%u%%) written\n"), - info->split.part_name, - info->split.cur_part_number, - info->split.total_parts, - info->split.completed_bytes >> unit_shift, - unit_name, - info->split.total_bytes >> unit_shift, - unit_name, - percent_done); - break; case WIMLIB_PROGRESS_MSG_SPLIT_END_PART: - if (info->split.completed_bytes == info->split.total_bytes) { - imagex_printf(T("Finished writing split WIM part %u of %u\n"), - info->split.cur_part_number, - info->split.total_parts); - } + last_split_progress = info->split; + report_split_progress(0); break; case WIMLIB_PROGRESS_MSG_UPDATE_END_COMMAND: switch (info->update.command->op) { @@ -1718,6 +1750,9 @@ imagex_apply(int argc, tchar **argv, int cmd) if (ret) goto out_free_refglobs; break; + case IMAGEX_RECOVER_DATA_OPTION: + extract_flags |= WIMLIB_EXTRACT_FLAG_RECOVER_DATA; + break; default: goto out_usage; } @@ -1782,7 +1817,7 @@ imagex_apply(int argc, tchar **argv, int cmd) goto out_wimlib_free; } -#ifndef __WIN32__ +#ifndef _WIN32 { /* Interpret a regular file or block device target as an NTFS * volume. */ @@ -1840,14 +1875,18 @@ out_usage: goto out_free_refglobs; } -/* Create a WIM image from a directory tree, NTFS volume, or multiple files or - * directory trees. 'wimlib-imagex capture': create a new WIM file containing - * the desired image. 'wimlib-imagex append': add a new image to an existing - * WIM file. */ +/* + * Create a WIM image from a directory tree, NTFS volume, or multiple files or + * directory trees. 'wimcapture': create a new WIM file containing the desired + * image. 'wimappend': add a new image to an existing WIM file; or, with + * '--create' behave like 'wimcapture' if the WIM file doesn't exist. + */ static int imagex_capture_or_append(int argc, tchar **argv, int cmd) { int c; + bool create = false; + bool appending = (cmd == CMD_APPEND); int open_flags = 0; int add_flags = WIMLIB_ADD_FLAG_EXCLUDE_VERBOSE | WIMLIB_ADD_FLAG_WINCONFIG | @@ -1895,6 +1934,8 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) break; case IMAGEX_CHECK_OPTION: open_flags |= WIMLIB_OPEN_FLAG_CHECK_INTEGRITY; + /* fall-through */ + case IMAGEX_INCLUDE_INTEGRITY_OPTION: write_flags |= WIMLIB_WRITE_FLAG_CHECK_INTEGRITY; break; case IMAGEX_NOCHECK_OPTION: @@ -1999,6 +2040,9 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) template_image_name_or_num = optarg; } } + #ifdef _WIN32 + imagex_printf(T("[WARNING] '--update-of' is unreliable on Windows!\n")); + #endif break; case IMAGEX_DELTA_FROM_OPTION: ret = string_list_append(&base_wimfiles, optarg); @@ -2010,16 +2054,18 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) 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; case IMAGEX_SNAPSHOT_OPTION: add_flags |= WIMLIB_ADD_FLAG_SNAPSHOT; break; + case IMAGEX_CREATE_OPTION: + if (cmd == CMD_CAPTURE) { + imagex_error(T("'--create' is only valid for 'wimappend', not 'wimcapture'")); + goto out_err; + } + create = true; + break; default: goto out_usage; } @@ -2054,6 +2100,8 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) if (!tstrcmp(wimfile, T("-"))) { /* Writing captured WIM to standard output. */ + if (create) + appending = false; #if 0 if (!(write_flags & WIMLIB_WRITE_FLAG_PIPABLE)) { imagex_error("Can't write a non-pipable WIM to " @@ -2065,7 +2113,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) #else write_flags |= WIMLIB_WRITE_FLAG_PIPABLE; #endif - if (cmd == CMD_APPEND) { + if (appending) { imagex_error(T("Using standard output for append does " "not make sense.")); goto out_err; @@ -2074,6 +2122,28 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) wimfile = NULL; imagex_output_to_stderr(); set_fd_to_binary_mode(wim_fd); + } else { + struct stat stbuf; + + /* Check for 'wimappend --create' acting as wimcapture */ + if (create && tstat(wimfile, &stbuf) != 0 && errno == ENOENT) { + + appending = false; + + /* Ignore '--update-of' for the target WIMFILE */ + if (template_image_name_or_num && + (!template_wimfile || + !tstrcmp(template_wimfile, wimfile))) + { + template_image_name_or_num = NULL; + template_wimfile = NULL; + } + } + } + + if ((write_flags & WIMLIB_WRITE_FLAG_UNSAFE_COMPACT) && !appending) { + imagex_error(T("'--unsafe-compact' is only valid for append!")); + goto out_err; } /* If template image was specified using --update-of=IMAGE rather @@ -2083,7 +2153,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) /* Capturing delta WIM based on single WIM: default to * base WIM. */ template_wimfile = base_wimfiles.strings[0]; - } else if (cmd == CMD_APPEND) { + } else if (appending) { /* Appending to WIM: default to WIM being appended to. */ template_wimfile = wimfile; @@ -2161,7 +2231,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) } /* Open the existing WIM, or create a new one. */ - if (cmd == CMD_APPEND) { + if (appending) { ret = wimlib_open_wim_with_progress(wimfile, open_flags | WIMLIB_OPEN_FLAG_WRITE_ACCESS, &wim, @@ -2185,7 +2255,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) int ctype = compression_type; - if (cmd == CMD_APPEND) { + if (appending) { struct wimlib_wim_info info; wimlib_get_wim_info(wim, &info); ctype = info.compression_type; @@ -2208,7 +2278,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) goto out_free_wim; } -#ifndef __WIN32__ +#ifndef _WIN32 /* Detect if source is regular file or block device and set NTFS volume * capture mode. */ if (!source_list) { @@ -2234,7 +2304,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) /* If the user did not specify an image name, and the basename of the * source already exists as an image name in the WIM file, append a * suffix to make it unique. */ - if (cmd == CMD_APPEND && name_defaulted) { + if (appending && name_defaulted) { unsigned long conflict_idx; tchar *name_end = tstrchr(name, T('\0')); for (conflict_idx = 1; @@ -2286,7 +2356,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) * open the WIM if needed and parse the image index. */ if (template_image_name_or_num) { - if (cmd == CMD_APPEND && !tstrcmp(template_wimfile, wimfile)) { + if (appending && !tstrcmp(template_wimfile, wimfile)) { template_wim = wim; } else { for (size_t i = 0; i < base_wimfiles.num_strings; i++) { @@ -2371,7 +2441,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) /* Write the new WIM or overwrite the existing WIM with the new image * appended. */ - if (cmd == CMD_APPEND) { + if (appending) { ret = wimlib_overwrite(wim, write_flags, num_threads); } else if (wimfile) { ret = wimlib_write(wim, wimfile, WIMLIB_ALL_IMAGES, @@ -2428,6 +2498,8 @@ imagex_delete(int argc, tchar **argv, int cmd) switch (c) { case IMAGEX_CHECK_OPTION: open_flags |= WIMLIB_OPEN_FLAG_CHECK_INTEGRITY; + /* fall-through */ + case IMAGEX_INCLUDE_INTEGRITY_OPTION: write_flags |= WIMLIB_WRITE_FLAG_CHECK_INTEGRITY; break; case IMAGEX_SOFT_OPTION: @@ -2649,7 +2721,7 @@ print_blobs(WIMStruct *wim) wimlib_iterate_lookup_table(wim, 0, print_resource, NULL); } -#ifndef __WIN32__ +#ifndef _WIN32 static void default_print_security_descriptor(const uint8_t *sd, size_t size) { @@ -2889,6 +2961,8 @@ imagex_export(int argc, tchar **argv, int cmd) break; case IMAGEX_CHECK_OPTION: open_flags |= WIMLIB_OPEN_FLAG_CHECK_INTEGRITY; + /* fall-through */ + case IMAGEX_INCLUDE_INTEGRITY_OPTION: write_flags |= WIMLIB_WRITE_FLAG_CHECK_INTEGRITY; break; case IMAGEX_NOCHECK_OPTION: @@ -3226,6 +3300,9 @@ imagex_extract(int argc, tchar **argv, int cmd) if (ret) goto out_free_refglobs; break; + case IMAGEX_RECOVER_DATA_OPTION: + extract_flags |= WIMLIB_EXTRACT_FLAG_RECOVER_DATA; + break; default: goto out_usage; } @@ -3289,9 +3366,15 @@ imagex_extract(int argc, tchar **argv, int cmd) argc -= num_paths; argv += num_paths; } else { + const tchar *listfile = argv[0] + 1; + + if (!tstrcmp(listfile, T("-"))) { + tputs(T("Reading pathlist file from standard input...")); + listfile = NULL; + } + ret = wimlib_extract_pathlist(wim, image, dest_dir, - argv[0] + 1, - extract_flags); + listfile, extract_flags); argc--; argv++; } @@ -3344,8 +3427,6 @@ imagex_info(int argc, tchar **argv, int cmd) { int c; bool boot = false; - bool check = false; - bool nocheck = false; bool header = false; bool blobs = false; bool xml = false; @@ -3358,6 +3439,7 @@ imagex_info(int argc, tchar **argv, int cmd) int image; int ret; int open_flags = 0; + int write_flags = 0; struct wimlib_wim_info info; for_opt(c, info_options) { @@ -3366,10 +3448,13 @@ imagex_info(int argc, tchar **argv, int cmd) boot = true; break; case IMAGEX_CHECK_OPTION: - check = true; + open_flags |= WIMLIB_OPEN_FLAG_CHECK_INTEGRITY; + /* fall-through */ + case IMAGEX_INCLUDE_INTEGRITY_OPTION: + write_flags |= WIMLIB_WRITE_FLAG_CHECK_INTEGRITY; break; case IMAGEX_NOCHECK_OPTION: - nocheck = true; + write_flags |= WIMLIB_WRITE_FLAG_NO_CHECK_INTEGRITY; break; case IMAGEX_HEADER_OPTION: header = true; @@ -3423,14 +3508,6 @@ imagex_info(int argc, tchar **argv, int cmd) goto out; } - if (check && nocheck) { - imagex_error(T("Can't specify both --check and --nocheck")); - goto out_err; - } - - if (check) - open_flags |= WIMLIB_OPEN_FLAG_CHECK_INTEGRITY; - ret = wimlib_open_wim_with_progress(wimfile, open_flags, &wim, imagex_progress_func, NULL); if (ret) @@ -3568,15 +3645,11 @@ imagex_info(int argc, tchar **argv, int cmd) /* Only call wimlib_overwrite() if something actually needs to * be changed. */ if (boot || any_property_changes || - (check && !info.has_integrity_table) || - (nocheck && info.has_integrity_table)) + ((write_flags & WIMLIB_WRITE_FLAG_CHECK_INTEGRITY) && + !info.has_integrity_table) || + ((write_flags & WIMLIB_WRITE_FLAG_NO_CHECK_INTEGRITY) && + info.has_integrity_table)) { - int write_flags = 0; - - if (check) - write_flags |= WIMLIB_WRITE_FLAG_CHECK_INTEGRITY; - if (nocheck) - write_flags |= WIMLIB_WRITE_FLAG_NO_CHECK_INTEGRITY; ret = wimlib_overwrite(wim, write_flags, 1); } else { imagex_printf(T("The file \"%"TS"\" was not modified " @@ -3593,7 +3666,6 @@ out: out_usage: usage(CMD_INFO, stderr); -out_err: ret = -1; goto out; } @@ -3612,6 +3684,8 @@ imagex_join(int argc, tchar **argv, int cmd) switch (c) { case IMAGEX_CHECK_OPTION: swm_open_flags |= WIMLIB_OPEN_FLAG_CHECK_INTEGRITY; + /* fall-through */ + case IMAGEX_INCLUDE_INTEGRITY_OPTION: wim_write_flags |= WIMLIB_WRITE_FLAG_CHECK_INTEGRITY; break; default: @@ -3792,6 +3866,8 @@ imagex_optimize(int argc, tchar **argv, int cmd) switch (c) { case IMAGEX_CHECK_OPTION: open_flags |= WIMLIB_OPEN_FLAG_CHECK_INTEGRITY; + /* fall-through */ + case IMAGEX_INCLUDE_INTEGRITY_OPTION: write_flags |= WIMLIB_WRITE_FLAG_CHECK_INTEGRITY; break; case IMAGEX_NOCHECK_OPTION: @@ -3930,7 +4006,7 @@ imagex_split(int argc, tchar **argv, int cmd) int c; int open_flags = 0; int write_flags = 0; - unsigned long part_size; + uint64_t part_size; tchar *tmp; int ret; WIMStruct *wim; @@ -3939,6 +4015,8 @@ imagex_split(int argc, tchar **argv, int cmd) switch (c) { case IMAGEX_CHECK_OPTION: open_flags |= WIMLIB_OPEN_FLAG_CHECK_INTEGRITY; + /* fall-through */ + case IMAGEX_INCLUDE_INTEGRITY_OPTION: write_flags |= WIMLIB_WRITE_FLAG_CHECK_INTEGRITY; break; default: @@ -3964,6 +4042,8 @@ imagex_split(int argc, tchar **argv, int cmd) goto out; ret = wimlib_split(wim, argv[1], part_size, write_flags); + if (ret == 0) + tprintf(T("\nFinished splitting \"%"TS"\"\n"), argv[0]); wimlib_free(wim); out: return ret; @@ -4084,6 +4164,8 @@ imagex_update(int argc, tchar **argv, int cmd) break; case IMAGEX_CHECK_OPTION: open_flags |= WIMLIB_OPEN_FLAG_CHECK_INTEGRITY; + /* fall-through */ + case IMAGEX_INCLUDE_INTEGRITY_OPTION: write_flags |= WIMLIB_WRITE_FLAG_CHECK_INTEGRITY; break; case IMAGEX_REBUILD_OPTION: @@ -4378,7 +4460,7 @@ static const struct imagex_command imagex_commands[] = { [CMD_VERIFY] = {T("verify"), imagex_verify}, }; -#ifdef __WIN32__ +#ifdef _WIN32 /* Can be a directory or source list file. But source list file is probably * a rare use case, so just say directory. */ @@ -4404,7 +4486,7 @@ T( " [--threads=NUM_THREADS] [--no-acls] [--strict-acls]\n" " [--rpfix] [--norpfix] [--update-of=[WIMFILE:]IMAGE]\n" " [--delta-from=WIMFILE] [--wimboot] [--unix-data]\n" -" [--dereference] [--snapshot]\n" +" [--dereference] [--snapshot] [--create]\n" ), [CMD_APPLY] = T( @@ -4412,7 +4494,7 @@ T( " [--check] [--ref=\"GLOB\"] [--no-acls] [--strict-acls]\n" " [--no-attributes] [--rpfix] [--norpfix]\n" " [--include-invalid-names] [--wimboot] [--unix-data]\n" -" [--compact=FORMAT]\n" +" [--compact=FORMAT] [--recover-data]\n" ), [CMD_CAPTURE] = T( @@ -4445,8 +4527,8 @@ T( " %"TS" WIMFILE IMAGE [(PATH | @LISTFILE)...]\n" " [--check] [--ref=\"GLOB\"] [--dest-dir=CMD_DIR]\n" " [--to-stdout] [--no-acls] [--strict-acls]\n" -" [--no-attributes] [--include-invalid-names]\n" -" [--no-globs] [--nullglob] [--preserve-dir-structure]\n" +" [--no-attributes] [--include-invalid-names] [--no-globs]\n" +" [--nullglob] [--preserve-dir-structure] [--recover-data]\n" ), [CMD_INFO] = T( @@ -4530,7 +4612,7 @@ version(void) static const tchar * const fmt = T( "wimlib-imagex " PACKAGE_VERSION " (using wimlib %"TS")\n" -"Copyright (C) 2012-2018 Eric Biggers\n" +"Copyright (C) 2012-2021 Eric Biggers\n" "License GPLv3+; GNU GPL version 3 or later .\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" @@ -4584,7 +4666,7 @@ static void recommend_man_page(int cmd, FILE *fp) { const tchar *format_str; -#ifdef __WIN32__ +#ifdef _WIN32 format_str = T("Some uncommon options are not listed;\n" "See %"TS".pdf in the doc directory for more details.\n"); #else @@ -4625,7 +4707,7 @@ usage_all(FILE *fp) recommend_man_page(CMD_NONE, fp); } -#ifdef __WIN32__ +#ifdef _WIN32 extern int wmain(int argc, wchar_t **argv); #define main wmain #endif