X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=programs%2Fimagex.c;h=508030148b1e15925b4fd062347a0741f7642dfb;hb=30826518fab5bb66fec87355324a2f0474fc66c1;hp=41ab646dbacb138557d63659bb5cf11dadf33e11;hpb=b5b9681794d1f5f13350e3567f6f6e74f5c779cf;p=wimlib diff --git a/programs/imagex.c b/programs/imagex.c index 41ab646d..50803014 100644 --- a/programs/imagex.c +++ b/programs/imagex.c @@ -46,6 +46,8 @@ # include #endif +#define WIMLIB_COMPRESSION_TYPE_INVALID (-1) + #ifdef __WIN32__ # include "imagex-win32.h" # define print_security_descriptor win32_print_security_descriptor @@ -166,7 +168,7 @@ enum { IMAGEX_NO_ACLS_OPTION, IMAGEX_NO_ATTRIBUTES_OPTION, IMAGEX_NO_REPLACE_OPTION, - IMAGEX_NO_WILDCARDS_OPTION, + IMAGEX_NO_GLOBS_OPTION, IMAGEX_NULLGLOB_OPTION, IMAGEX_ONE_FILE_ONLY_OPTION, IMAGEX_PACK_CHUNK_SIZE_OPTION, @@ -298,7 +300,8 @@ static const struct option extract_options[] = { {T("dest-dir"), required_argument, NULL, IMAGEX_DEST_DIR_OPTION}, {T("to-stdout"), no_argument, NULL, IMAGEX_TO_STDOUT_OPTION}, {T("include-invalid-names"), no_argument, NULL, IMAGEX_INCLUDE_INVALID_NAMES_OPTION}, - {T("no-wildcards"), no_argument, NULL, IMAGEX_NO_WILDCARDS_OPTION}, + {T("no-wildcards"), no_argument, NULL, IMAGEX_NO_GLOBS_OPTION}, + {T("no-globs"), no_argument, NULL, IMAGEX_NO_GLOBS_OPTION}, {T("nullglob"), no_argument, NULL, IMAGEX_NULLGLOB_OPTION}, {T("preserve-dir-structure"), no_argument, NULL, IMAGEX_PRESERVE_DIR_STRUCTURE_OPTION}, {T("wimboot"), no_argument, NULL, IMAGEX_WIMBOOT_OPTION}, @@ -365,6 +368,7 @@ static const struct option unmount_options[] = { {T("check"), no_argument, NULL, IMAGEX_CHECK_OPTION}, {T("rebuild"), no_argument, NULL, IMAGEX_REBUILD_OPTION}, {T("lazy"), no_argument, NULL, IMAGEX_LAZY_OPTION}, + {T("force"), no_argument, NULL, IMAGEX_FORCE_OPTION}, {T("new-image"), no_argument, NULL, IMAGEX_NEW_IMAGE_OPTION}, {NULL, 0, NULL, 0}, }; @@ -504,7 +508,6 @@ set_compress_slow(void) .nice_match_length = 96, .num_optim_passes = 4, .max_search_depth = 100, - .max_matches_per_pos = 10, .main_nostat_cost = 15, .len_nostat_cost = 15, .aligned_nostat_cost = 7, @@ -520,7 +523,6 @@ set_compress_slow(void) .max_match_length = UINT32_MAX, .nice_match_length = 96, .max_search_depth = 100, - .max_matches_per_pos = 10, .optim_array_length = 1024, }; @@ -1078,13 +1080,22 @@ imagex_progress_func(enum wimlib_progress_msg msg, imagex_printf(T("\nWARNING: Excluding unsupported file or directory\n" " \"%"TS"\" from capture\n"), info->scan.cur_path); break; - case WIMLIB_SCAN_DENTRY_EXCLUDED_SYMLINK: - imagex_printf(T("\nWARNING: Ignoring absolute symbolic link " - "with out-of-tree target:\n" - " \"%"TS"\" => \"%"TS"\"\n" + case WIMLIB_SCAN_DENTRY_FIXED_SYMLINK: + /* Symlink fixups are enabled by default. This is + * mainly intended for Windows, which for some reason + * uses absolute junctions (with drive letters!) in the + * 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__ + imagex_printf(T("\nWARNING: Adjusted target of " + "absolute symbolic link \"%"TS"\"\n" " (Use --norpfix to capture " "absolute symbolic links as-is)\n"), - info->scan.cur_path, info->scan.symlink_target); + info->scan.cur_path); + #endif + break; + default: break; } break; @@ -1198,6 +1209,20 @@ imagex_progress_func(enum wimlib_progress_msg msg, imagex_printf(T("\nExtracting \"%"TS"\" as normal file (not WIMBoot pointer)\n"), info->wimboot_exclude.path_in_wim); break; + case WIMLIB_PROGRESS_MSG_UNMOUNT_BEGIN: + if (info->unmount.mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) { + if (info->unmount.unmount_flags & WIMLIB_UNMOUNT_FLAG_COMMIT) { + imagex_printf(T("Committing changes to %"TS" (image %d)\n"), + info->unmount.mounted_wim, + info->unmount.mounted_image); + } else { + imagex_printf(T("Discarding changes to %"TS" (image %d)\n"), + info->unmount.mounted_wim, + info->unmount.mounted_image); + imagex_printf(T("\t(Use --commit to keep changes.)\n")); + } + } + break; default: break; } @@ -2430,8 +2455,10 @@ print_dentry_detailed(const struct wimlib_dir_entry *dentry) tprintf(T("Link Count = %"PRIu32"\n"), dentry->num_links); if (dentry->unix_mode != 0) { - tprintf(T("UNIX Data = uid:%"PRIu32" gid:%"PRIu32" mode:0%"PRIo32"\n"), - dentry->unix_uid, dentry->unix_gid, dentry->unix_mode); + tprintf(T("UNIX Data = uid:%"PRIu32" gid:%"PRIu32" " + "mode:0%"PRIo32" rdev:0x%"PRIx32"\n"), + dentry->unix_uid, dentry->unix_gid, + dentry->unix_mode, dentry->unix_rdev); } for (uint32_t i = 0; i <= dentry->num_named_streams; i++) { @@ -2882,7 +2909,7 @@ imagex_extract(int argc, tchar **argv, int cmd) extract_flags |= WIMLIB_EXTRACT_FLAG_REPLACE_INVALID_FILENAMES; extract_flags |= WIMLIB_EXTRACT_FLAG_ALL_CASE_CONFLICTS; break; - case IMAGEX_NO_WILDCARDS_OPTION: + case IMAGEX_NO_GLOBS_OPTION: extract_flags &= ~WIMLIB_EXTRACT_FLAG_GLOB_PATHS; break; case IMAGEX_NULLGLOB_OPTION: @@ -2907,7 +2934,7 @@ imagex_extract(int argc, tchar **argv, int cmd) if (!(extract_flags & (WIMLIB_EXTRACT_FLAG_GLOB_PATHS | WIMLIB_EXTRACT_FLAG_STRICT_GLOB))) { - imagex_error(T("Can't combine --no-wildcards and --nullglob!")); + imagex_error(T("Can't combine --no-globs and --nullglob!")); goto out_err; } @@ -2969,6 +2996,15 @@ imagex_extract(int argc, tchar **argv, int cmd) if (!imagex_be_quiet) imagex_printf(T("Done extracting files.\n")); } else if (ret == WIMLIB_ERR_PATH_DOES_NOT_EXIST) { + if ((extract_flags & (WIMLIB_EXTRACT_FLAG_STRICT_GLOB | + WIMLIB_EXTRACT_FLAG_GLOB_PATHS)) + == (WIMLIB_EXTRACT_FLAG_STRICT_GLOB | + WIMLIB_EXTRACT_FLAG_GLOB_PATHS)) + { + tfprintf(stderr, + T("Note: You can use the '--nullglob' " + "option to ignore missing files.\n")); + } tfprintf(stderr, T("Note: You can use `%"TS"' to see what " "files and directories\n" " are in the WIM image.\n"), @@ -3653,7 +3689,14 @@ imagex_unmount(int argc, tchar **argv, int cmd) unmount_flags |= WIMLIB_UNMOUNT_FLAG_REBUILD; break; case IMAGEX_LAZY_OPTION: - unmount_flags |= WIMLIB_UNMOUNT_FLAG_LAZY; + case IMAGEX_FORCE_OPTION: + /* Now, unmount is lazy by default. However, committing + * the image will fail with + * WIMLIB_ERR_MOUNTED_IMAGE_IS_BUSY if there are open + * file descriptors on the WIM image. The + * WIMLIB_UNMOUNT_FLAG_FORCE option forces these file + * descriptors to be closed. */ + unmount_flags |= WIMLIB_UNMOUNT_FLAG_FORCE; break; case IMAGEX_NEW_IMAGE_OPTION: unmount_flags |= WIMLIB_UNMOUNT_FLAG_NEW_IMAGE; @@ -3673,13 +3716,19 @@ imagex_unmount(int argc, tchar **argv, int cmd) "without --commit also specified!")); goto out_err; } - imagex_printf(T("Committing changes as new image...\n")); } ret = wimlib_unmount_image_with_progress(argv[0], unmount_flags, imagex_progress_func, NULL); - if (ret) + if (ret) { imagex_error(T("Failed to unmount \"%"TS"\""), argv[0]); + if (ret == WIMLIB_ERR_MOUNTED_IMAGE_IS_BUSY) { + imagex_printf(T( + "\tNote: Use --commit --force to force changes " + "to be committed, regardless\n" + "\t of open files.\n")); + } + } out: return ret; @@ -3983,6 +4032,7 @@ T( " DEST_WIMFILE [DEST_IMAGE_NAME [DEST_IMAGE_DESCRIPTION]]\n" " [--boot] [--check] [--nocheck] [--compress=TYPE]\n" " [--ref=\"GLOB\"] [--threads=NUM_THREADS] [--rebuild]\n" +" [--wimboot]\n" ), [CMD_EXTRACT] = T( @@ -3990,7 +4040,7 @@ T( " [--check] [--ref=\"GLOB\"] [--dest-dir=CMD_DIR]\n" " [--to-stdout] [--no-acls] [--strict-acls]\n" " [--no-attributes] [--include-invalid-names]\n" -" [--no-wildcards] [--nullglob] [--preserve-dir-structure]\n" +" [--no-globs] [--nullglob] [--preserve-dir-structure]\n" ), [CMD_INFO] = T( @@ -4029,8 +4079,8 @@ T( #if WIM_MOUNTING_SUPPORTED [CMD_UNMOUNT] = T( -" %"TS" DIRECTORY [--commit] [--check] [--rebuild] [--lazy]\n" -" [--new-image]\n" +" %"TS" DIRECTORY [--commit] [--force] [--new-image]\n" +" [--check] [--rebuild]\n" ), #endif [CMD_UPDATE] =