IMAGEX_RECOMPRESS_OPTION,
IMAGEX_RECURSIVE_OPTION,
IMAGEX_REF_OPTION,
+ IMAGEX_RESUME_OPTION,
IMAGEX_RPFIX_OPTION,
IMAGEX_SOFT_OPTION,
IMAGEX_SOURCE_LIST_OPTION,
{T("rpfix"), no_argument, NULL, IMAGEX_RPFIX_OPTION},
{T("norpfix"), no_argument, NULL, IMAGEX_NORPFIX_OPTION},
{T("include-invalid-names"), no_argument, NULL, IMAGEX_INCLUDE_INVALID_NAMES_OPTION},
+
+ /* --resume is undocumented for now as it needs improvement. */
+ {T("resume"), no_argument, NULL, IMAGEX_RESUME_OPTION},
{NULL, 0, NULL, 0},
};
return (off_t)-1;
}
-tchar pat_ntfs_log[] = T("/$ntfs.log");
-tchar pat_hiberfil_sys[] = T("/hiberfil.sys");
-tchar pat_pagefile_sys[] = T("/pagefile.sys");
-tchar pat_system_volume_information[] = T("/System Volume Information");
-tchar pat_recycler[] = T("/RECYCLER");
-tchar pat_windows_csc[] = T("/Windows/CSC");
-
-tchar *default_pats[] = {
- pat_ntfs_log,
- pat_hiberfil_sys,
- pat_pagefile_sys,
- pat_system_volume_information,
- pat_recycler,
- pat_windows_csc,
-};
-
-static struct wimlib_capture_config default_capture_config = {
- .exclusion_pats = {
- .num_pats = sizeof(default_pats) / sizeof(default_pats[0]),
- .pats = default_pats,
- },
-};
-
enum {
PARSE_STRING_SUCCESS = 0,
PARSE_STRING_FAILURE = 1,
unit_shift = get_unit(info->write_streams.total_bytes, &unit_name);
percent_done = TO_PERCENT(info->write_streams.completed_bytes,
info->write_streams.total_bytes);
+
if (info->write_streams.completed_streams == 0) {
const tchar *data_type;
data_type, info->write_streams.num_threads,
(info->write_streams.num_threads == 1) ? T("") : T("s"));
}
- imagex_printf(T("\r%"PRIu64" %"TS" of %"PRIu64" %"TS" (uncompressed) "
- "written (%u%% done)"),
- info->write_streams.completed_bytes >> unit_shift,
- unit_name,
- info->write_streams.total_bytes >> unit_shift,
- unit_name,
- percent_done);
+ if (info->write_streams.total_parts <= 1) {
+ imagex_printf(T("\r%"PRIu64" %"TS" of %"PRIu64" %"TS" (uncompressed) "
+ "written (%u%% done)"),
+ info->write_streams.completed_bytes >> unit_shift,
+ unit_name,
+ info->write_streams.total_bytes >> unit_shift,
+ unit_name,
+ percent_done);
+ } else {
+ imagex_printf(T("\rWriting resources from part %u of %u: "
+ "%"PRIu64 " %"TS" of %"PRIu64" %"TS" (%u%%) written"),
+ (info->write_streams.completed_parts ==
+ info->write_streams.total_parts) ?
+ info->write_streams.completed_parts :
+ info->write_streams.completed_parts + 1,
+ info->write_streams.total_parts,
+ info->write_streams.completed_bytes >> unit_shift,
+ unit_name,
+ info->write_streams.total_bytes >> unit_shift,
+ unit_name,
+ percent_done);
+ }
if (info->write_streams.completed_bytes >= info->write_streams.total_bytes)
imagex_printf(T("\n"));
break;
}
break;
case WIMLIB_PROGRESS_MSG_SCAN_DENTRY:
- if (info->scan.excluded)
- imagex_printf(T("Excluding \"%"TS"\" from capture\n"), info->scan.cur_path);
- else
+ switch (info->scan.status) {
+ case WIMLIB_SCAN_DENTRY_OK:
imagex_printf(T("Scanning \"%"TS"\"\n"), info->scan.cur_path);
+ break;
+ case WIMLIB_SCAN_DENTRY_EXCLUDED:
+ imagex_printf(T("Excluding \"%"TS"\" from capture\n"), info->scan.cur_path);
+ break;
+ case WIMLIB_SCAN_DENTRY_UNSUPPORTED:
+ imagex_printf(T("WARNING: Excluding unsupported file or directory\n"
+ " \"%"TS"\" from capture\n"), info->scan.cur_path);
+ break;
+ }
break;
- /*case WIMLIB_PROGRESS_MSG_SCAN_END:*/
- /*break;*/
case WIMLIB_PROGRESS_MSG_VERIFY_INTEGRITY:
unit_shift = get_unit(info->integrity.total_bytes, &unit_name);
percent_done = TO_PERCENT(info->integrity.completed_bytes,
info->extract.wimfile_name,
info->extract.target);
break;
- /*case WIMLIB_PROGRESS_MSG_EXTRACT_DIR_STRUCTURE_BEGIN:*/
- /*imagex_printf(T("Applying directory structure to %"TS"\n"),*/
- /*info->extract.target);*/
- /*break;*/
case WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS:
percent_done = TO_PERCENT(info->extract.completed_bytes,
info->extract.total_bytes);
if (info->extract.completed_bytes >= info->extract.total_bytes)
imagex_printf(T("\n"));
break;
+ case WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN:
+ imagex_printf(T("\nReading split pipable WIM part %u of %u\n"),
+ info->extract.part_number,
+ info->extract.total_parts);
+ break;
case WIMLIB_PROGRESS_MSG_APPLY_TIMESTAMPS:
if (info->extract.extract_root_wim_source_path[0] == T('\0'))
imagex_printf(T("Setting timestamps on all extracted files...\n"));
info->extract.target);
}
break;
- case WIMLIB_PROGRESS_MSG_JOIN_STREAMS:
- percent_done = TO_PERCENT(info->join.completed_bytes,
- info->join.total_bytes);
- unit_shift = get_unit(info->join.total_bytes, &unit_name);
- imagex_printf(T("Writing resources from part %u of %u: "
- "%"PRIu64 " %"TS" of %"PRIu64" %"TS" (%u%%) written\n"),
- (info->join.completed_parts == info->join.total_parts) ?
- info->join.completed_parts : info->join.completed_parts + 1,
- info->join.total_parts,
- info->join.completed_bytes >> unit_shift,
- unit_name,
- info->join.total_bytes >> unit_shift,
- unit_name,
- percent_done);
- break;
case WIMLIB_PROGRESS_MSG_SPLIT_BEGIN_PART:
percent_done = TO_PERCENT(info->split.completed_bytes,
info->split.total_bytes);
break;
case WIMLIB_PROGRESS_MSG_SPLIT_END_PART:
if (info->split.completed_bytes == info->split.total_bytes) {
- imagex_printf(T("Finished writing part %u of %u WIM parts\n"),
+ imagex_printf(T("Finished writing split WIM part %u of %u\n"),
info->split.cur_part_number,
info->split.total_parts);
}
switch (op) {
case WIMLIB_UPDATE_OP_ADD:
if (!tstrcmp(option, T("--verbose")))
- cmd->add.add_flags |= WIMLIB_ADD_IMAGE_FLAG_VERBOSE;
+ cmd->add.add_flags |= WIMLIB_ADD_FLAG_VERBOSE;
else if (!tstrcmp(option, T("--unix-data")))
- cmd->add.add_flags |= WIMLIB_ADD_IMAGE_FLAG_UNIX_DATA;
+ cmd->add.add_flags |= WIMLIB_ADD_FLAG_UNIX_DATA;
else if (!tstrcmp(option, T("--no-acls")) || !tstrcmp(option, T("--noacls")))
- cmd->add.add_flags |= WIMLIB_ADD_IMAGE_FLAG_NO_ACLS;
+ cmd->add.add_flags |= WIMLIB_ADD_FLAG_NO_ACLS;
else if (!tstrcmp(option, T("--strict-acls")))
- cmd->add.add_flags |= WIMLIB_ADD_IMAGE_FLAG_STRICT_ACLS;
+ cmd->add.add_flags |= WIMLIB_ADD_FLAG_STRICT_ACLS;
else if (!tstrcmp(option, T("--dereference")))
- cmd->add.add_flags |= WIMLIB_ADD_IMAGE_FLAG_DEREFERENCE;
+ cmd->add.add_flags |= WIMLIB_ADD_FLAG_DEREFERENCE;
else
recognized = false;
break;
extract_flags |= WIMLIB_EXTRACT_FLAG_REPLACE_INVALID_FILENAMES;
extract_flags |= WIMLIB_EXTRACT_FLAG_ALL_CASE_CONFLICTS;
break;
+ case IMAGEX_RESUME_OPTION:
+ extract_flags |= WIMLIB_EXTRACT_FLAG_RESUME;
+ break;
default:
goto out_usage;
}
}
#endif
-#ifdef __WIN32__
- win32_acquire_restore_privileges();
-#endif
if (wim) {
ret = wimlib_extract_image(wim, image, target, extract_flags,
additional_swms, num_additional_swms,
}
if (ret == 0)
imagex_printf(T("Done applying WIM image.\n"));
-#ifdef __WIN32__
- win32_release_restore_privileges();
-#endif
out_free_swms:
for (unsigned i = 0; i < num_additional_swms; i++)
wimlib_free(additional_swms[i]);
{
int c;
int open_flags = WIMLIB_OPEN_FLAG_WRITE_ACCESS;
- int add_image_flags = WIMLIB_ADD_IMAGE_FLAG_EXCLUDE_VERBOSE;
+ int add_image_flags = WIMLIB_ADD_IMAGE_FLAG_EXCLUDE_VERBOSE |
+ WIMLIB_ADD_IMAGE_FLAG_WINCONFIG;
int write_flags = 0;
int compression_type = WIMLIB_COMPRESSION_TYPE_LZX;
const tchar *wimfile;
break;
case IMAGEX_CONFIG_OPTION:
config_file = optarg;
+ add_image_flags &= ~WIMLIB_ADD_IMAGE_FLAG_WINCONFIG;
break;
case IMAGEX_COMPRESS_OPTION:
compression_type = get_compression_type(optarg);
wimfile = argv[1];
if (!tstrcmp(wimfile, T("-"))) {
+ /* Writing captured WIM to standard output. */
#if 0
if (!(write_flags & WIMLIB_WRITE_FLAG_PIPABLE)) {
imagex_error("Can't write a non-pipable WIM to "
wim_fd = STDOUT_FILENO;
wimfile = NULL;
imagex_info_file = stderr;
+ set_fd_to_binary_mode(wim_fd);
}
if (argc >= 3) {
if (ret)
goto out_free_config;
} else {
- config = &default_capture_config;
+ config = NULL;
}
if (cmd == CMD_APPEND)
tsprintf(name_end, T(" (%lu)"), conflict_idx);
}
}
-#ifdef __WIN32__
- win32_acquire_capture_privileges();
-#endif
-
ret = wimlib_add_image_multisource(wim,
capture_sources,
num_sources,
add_image_flags,
imagex_progress_func);
if (ret)
- goto out_release_privs;
+ goto out_wimlib_free;
if (desc || flags_element) {
/* User provided <DESCRIPTION> or <FLAGS> element. Get the
info.image_count,
desc);
if (ret)
- goto out_release_privs;
+ goto out_wimlib_free;
}
if (flags_element) {
ret = wimlib_set_image_flags(wim, info.image_count,
flags_element);
if (ret)
- goto out_release_privs;
+ goto out_wimlib_free;
}
}
write_flags, num_threads,
imagex_progress_func);
}
-out_release_privs:
-#ifdef __WIN32__
- win32_release_capture_privileges();
-#endif
out_wimlib_free:
wimlib_free(wim);
out_free_config:
- if (config != &default_capture_config) {
+ if (config) {
free(config->exclusion_pats.pats);
free(config->exclusion_exception_pats.pats);
free(config_str);
dest_wimfile = NULL;
dest_wim_fd = STDOUT_FILENO;
imagex_info_file = stderr;
+ set_fd_to_binary_mode(dest_wim_fd);
}
errno = ENOENT;
if (dest_wimfile != NULL && tstat(dest_wimfile, &stbuf) == 0) {
num_additional_swms = 0;
}
-#ifdef __WIN32__
- win32_acquire_restore_privileges();
-#endif
-
ret = wimlib_extract_files(wim, image, cmds, num_cmds, 0,
additional_swms, num_additional_swms,
imagex_progress_func);
" are in the WIM image.\n"),
get_cmd_string(CMD_INFO, false));
}
-#ifdef __WIN32__
- win32_release_restore_privileges();
-#endif
for (unsigned i = 0; i < num_additional_swms; i++)
wimlib_free(additional_swms[i]);
free(additional_swms);
int open_flags = WIMLIB_OPEN_FLAG_WRITE_ACCESS;
int write_flags = 0;
int update_flags = WIMLIB_UPDATE_FLAG_SEND_PROGRESS;
- int default_add_flags = WIMLIB_ADD_IMAGE_FLAG_EXCLUDE_VERBOSE;
+ int default_add_flags = WIMLIB_ADD_FLAG_EXCLUDE_VERBOSE |
+ WIMLIB_ADD_FLAG_WINCONFIG;
int default_delete_flags = 0;
unsigned num_threads = 0;
int c;
/* Global add option */
case IMAGEX_CONFIG_OPTION:
+ default_add_flags &= ~WIMLIB_ADD_FLAG_WINCONFIG;
config_file = optarg;
break;
/* Default add options */
case IMAGEX_VERBOSE_OPTION:
- default_add_flags |= WIMLIB_ADD_IMAGE_FLAG_VERBOSE;
+ default_add_flags |= WIMLIB_ADD_FLAG_VERBOSE;
break;
case IMAGEX_DEREFERENCE_OPTION:
- default_add_flags |= WIMLIB_ADD_IMAGE_FLAG_DEREFERENCE;
+ default_add_flags |= WIMLIB_ADD_FLAG_DEREFERENCE;
break;
case IMAGEX_UNIX_DATA_OPTION:
- default_add_flags |= WIMLIB_ADD_IMAGE_FLAG_UNIX_DATA;
+ default_add_flags |= WIMLIB_ADD_FLAG_UNIX_DATA;
break;
case IMAGEX_NO_ACLS_OPTION:
- default_add_flags |= WIMLIB_ADD_IMAGE_FLAG_NO_ACLS;
+ default_add_flags |= WIMLIB_ADD_FLAG_NO_ACLS;
break;
case IMAGEX_STRICT_ACLS_OPTION:
- default_add_flags |= WIMLIB_ADD_IMAGE_FLAG_STRICT_ACLS;
+ default_add_flags |= WIMLIB_ADD_FLAG_STRICT_ACLS;
break;
default:
goto out_usage;
if (ret)
goto out_free_config;
} else {
- config = &default_capture_config;
+ config = NULL;
}
/* Read update commands from standard input, or the command string if
}
/* Set default flags and capture config on the update commands */
- bool have_add_command = false;
for (size_t i = 0; i < num_cmds; i++) {
switch (cmds[i].op) {
case WIMLIB_UPDATE_OP_ADD:
cmds[i].add.add_flags |= default_add_flags;
cmds[i].add.config = config;
- have_add_command = true;
break;
case WIMLIB_UPDATE_OP_DELETE:
cmds[i].delete.delete_flags |= default_delete_flags;
}
}
-#ifdef __WIN32__
- if (have_add_command)
- win32_acquire_capture_privileges();
-#endif
-
/* Execute the update commands */
ret = wimlib_update_image(wim, image, cmds, num_cmds, update_flags,
imagex_progress_func);
if (ret)
- goto out_release_privs;
+ goto out_free_cmds;
/* Overwrite the updated WIM */
ret = wimlib_overwrite(wim, write_flags, num_threads,
imagex_progress_func);
-out_release_privs:
-#ifdef __WIN32__
- if (have_add_command)
- win32_release_capture_privileges();
-#endif
+out_free_cmds:
free(cmds);
out_free_cmd_file_contents:
free(cmd_file_contents);
out_free_config:
- if (config != &default_capture_config) {
+ if (config) {
free(config->exclusion_pats.pats);
free(config->exclusion_exception_pats.pats);
free(config_str);
static void
version(void)
{
- static const tchar *format =
+ static const tchar *s =
T(
-"%"TS" (" PACKAGE ") " PACKAGE_VERSION "\n"
+IMAGEX_PROGNAME " (" PACKAGE ") " PACKAGE_VERSION "\n"
"Copyright (C) 2012, 2013 Eric Biggers\n"
"License GPLv3+; GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.\n"
"This is free software: you are free to change and redistribute it.\n"
"\n"
"Report bugs to "PACKAGE_BUGREPORT".\n"
);
- tprintf(format, invocation_name);
+ tfputs(s, stdout);
}