# include "imagex-win32.h"
# define tbasename win32_wbasename
# define tglob win32_wglob
+# define OS_PREFERRED_PATH_SEPARATOR L'\\'
+# define OS_PREFERRED_PATH_SEPARATOR_STRING L"\\"
#else /* __WIN32__ */
# include <glob.h>
# include <getopt.h>
# include <langinfo.h>
# define tbasename basename
# define tglob glob
+# define OS_PREFERRED_PATH_SEPARATOR '/'
+# define OS_PREFERRED_PATH_SEPARATOR_STRING "/"
#endif /* !__WIN32 */
" (DIRECTORY | NTFS_VOLUME) [--check] [--hardlink]\n"
" [--symlink] [--verbose] [--ref=\"GLOB\"] [--unix-data]\n"
" [--no-acls] [--strict-acls] [--rpfix] [--norpfix]\n"
-" [--including-invalid-names]\n"
+" [--include-invalid-names]\n"
),
[CAPTURE] =
T(
IMAGEX_PROGNAME" extract WIMFILE (IMAGE_NUM | IMAGE_NAME) [PATH...]\n"
" [--check] [--ref=\"GLOB\"] [--verbose] [--unix-data]\n"
" [--no-acls] [--strict-acls] [--to-stdout] [--dest-dir=DIR]\n"
-" [--including-invalid-names]\n"
+" [--include-invalid-names]\n"
),
[INFO] =
T(
IMAGEX_FORCE_OPTION,
IMAGEX_HARDLINK_OPTION,
IMAGEX_HEADER_OPTION,
- IMAGEX_INCLUDING_INVALID_NAMES_OPTION,
+ IMAGEX_INCLUDE_INVALID_NAMES_OPTION,
IMAGEX_LAZY_OPTION,
IMAGEX_LOOKUP_TABLE_OPTION,
IMAGEX_METADATA_OPTION,
{T("strict-acls"), no_argument, NULL, IMAGEX_STRICT_ACLS_OPTION},
{T("rpfix"), no_argument, NULL, IMAGEX_RPFIX_OPTION},
{T("norpfix"), no_argument, NULL, IMAGEX_NORPFIX_OPTION},
- {T("including-invalid-names"), no_argument, NULL, IMAGEX_INCLUDING_INVALID_NAMES_OPTION},
+ {T("include-invalid-names"), no_argument, NULL, IMAGEX_INCLUDE_INVALID_NAMES_OPTION},
{NULL, 0, NULL, 0},
};
static const struct option capture_or_append_options[] = {
{T("strict-acls"), no_argument, NULL, IMAGEX_STRICT_ACLS_OPTION},
{T("dest-dir"), required_argument, NULL, IMAGEX_DEST_DIR_OPTION},
{T("to-stdout"), no_argument, NULL, IMAGEX_TO_STDOUT_OPTION},
- {T("including-invalid-names"), no_argument, NULL, IMAGEX_INCLUDING_INVALID_NAMES_OPTION},
+ {T("include-invalid-names"), no_argument, NULL, IMAGEX_INCLUDE_INVALID_NAMES_OPTION},
{NULL, 0, NULL, 0},
};
case WIMLIB_PROGRESS_MSG_SCAN_BEGIN:
tprintf(T("Scanning \"%"TS"\""), info->scan.source);
if (*info->scan.wim_target_path) {
- tprintf(T(" (loading as WIM path: \"/%"TS"\")...\n"),
+ tprintf(T(" (loading as WIM path: "
+ "\""WIMLIB_WIM_PATH_SEPARATOR_STRING"%"TS"\")...\n"),
info->scan.wim_target_path);
} else {
tprintf(T(" (loading as root of WIM image)...\n"));
unit_shift = get_unit(info->integrity.total_bytes, &unit_name);
percent_done = TO_PERCENT(info->integrity.completed_bytes,
info->integrity.total_bytes);
- tprintf(T("\rVerifying integrity of \"%"TS"\": %"PRIu64" "TS" "
- "of %"PRIu64" "TS" (%u%%) done"),
+ tprintf(T("\rVerifying integrity of \"%"TS"\": %"PRIu64" %"TS" "
+ "of %"PRIu64" %"TS" (%u%%) done"),
info->integrity.filename,
info->integrity.completed_bytes >> unit_shift,
unit_name,
info->extract.target);
break;
case WIMLIB_PROGRESS_MSG_EXTRACT_TREE_BEGIN:
- tprintf(T("Extracting \"%"TS"\" from image %d (\"%"TS"\") "
+ tprintf(T("Extracting "
+ "\""WIMLIB_WIM_PATH_SEPARATOR_STRING"%"TS"\" from image %d (\"%"TS"\") "
"in \"%"TS"\" to \"%"TS"\"\n"),
info->extract.extract_root_wim_source_path,
info->extract.image,
info->split.cur_part_number);
}
break;
+ case WIMLIB_PROGRESS_MSG_UPDATE_END_COMMAND:
+ switch (info->update.command->op) {
+ case WIMLIB_UPDATE_OP_DELETE:
+ tprintf(T("Deleted WIM path "
+ "\""WIMLIB_WIM_PATH_SEPARATOR_STRING "%"TS"\"\n"),
+ info->update.command->delete.wim_path);
+ break;
+ case WIMLIB_UPDATE_OP_RENAME:
+ tprintf(T("Renamed WIM path "
+ "\""WIMLIB_WIM_PATH_SEPARATOR_STRING "%"TS"\" => "
+ "\""WIMLIB_WIM_PATH_SEPARATOR_STRING "%"TS"\"\n"),
+ info->update.command->rename.wim_source_path,
+ info->update.command->rename.wim_target_path);
+ break;
+ case WIMLIB_UPDATE_OP_ADD:
+ default:
+ break;
+ }
+ break;
default:
break;
}
case IMAGEX_RPFIX_OPTION:
extract_flags |= WIMLIB_EXTRACT_FLAG_RPFIX;
break;
- case IMAGEX_INCLUDING_INVALID_NAMES_OPTION:
+ case IMAGEX_INCLUDE_INVALID_NAMES_OPTION:
extract_flags |= WIMLIB_EXTRACT_FLAG_REPLACE_INVALID_FILENAMES;
extract_flags |= WIMLIB_EXTRACT_FLAG_ALL_CASE_CONFLICTS;
break;
bool capture_sources_malloced;
struct wimlib_capture_source *capture_sources;
size_t num_sources;
+ bool name_defaulted;
for_opt(c, capture_or_append_options) {
switch (c) {
if (argc >= 3) {
name = argv[2];
+ name_defaulted = false;
} else {
/* Set default name to SOURCE argument, omitting any directory
* prefixes and trailing slashes. This requires making a copy
- * of @source. */
+ * of @source. Leave some free characters at the end in case we
+ * append a number to keep the name unique. */
source_name_len = tstrlen(source);
- source_copy = alloca((source_name_len + 1) * sizeof(tchar));
+ source_copy = alloca((source_name_len + 1 + 25) * sizeof(tchar));
name = tbasename(tstrcpy(source_copy, source));
+ name_defaulted = true;
}
/* Image description defaults to NULL if not given. */
desc = (argc >= 4) ? argv[3] : NULL;
}
}
}
+
+ if (cmd == APPEND && name_defaulted) {
+ /* 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. */
+ unsigned long conflict_idx;
+ tchar *name_end = tstrchr(name, T('\0'));
+ for (conflict_idx = 1;
+ wimlib_image_name_in_use(w, name);
+ conflict_idx++)
+ {
+ tsprintf(name_end, T(" (%lu)"), conflict_idx);
+ }
+ }
#ifdef __WIN32__
win32_acquire_capture_privileges();
#endif
free_extract_commands(cmds, num_cmds, dest_dir);
return NULL;
}
- tsprintf(cmds[i].fs_dest_path, T("%"TS"/%"TS), dest_dir,
- tbasename(paths[i]));
+ tsprintf(cmds[i].fs_dest_path, T("%"TS""OS_PREFERRED_PATH_SEPARATOR_STRING"%"TS),
+ dest_dir, tbasename(paths[i]));
}
}
*num_cmds_ret = num_cmds;
extract_flags |= WIMLIB_EXTRACT_FLAG_TO_STDOUT;
imagex_be_quiet = true;
break;
- case IMAGEX_INCLUDING_INVALID_NAMES_OPTION:
+ case IMAGEX_INCLUDE_INVALID_NAMES_OPTION:
extract_flags |= WIMLIB_EXTRACT_FLAG_REPLACE_INVALID_FILENAMES;
extract_flags |= WIMLIB_EXTRACT_FLAG_ALL_CASE_CONFLICTS;
break;
int ret;
int open_flags = 0;
int write_flags = 0;
- int update_flags = 0;
+ int update_flags = WIMLIB_UPDATE_FLAG_SEND_PROGRESS;
int default_add_flags = WIMLIB_ADD_IMAGE_FLAG_EXCLUDE_VERBOSE;
int default_delete_flags = 0;
unsigned num_threads = 0;
#ifdef __WIN32__
win32_release_capture_privileges();
#endif
-out_free_cmds:
free(cmds);
out_free_cmd_file_contents:
free(cmd_file_contents);