[SPLIT] =
"imagex split WIMFILE SPLIT_WIMFILE PART_SIZE_MB [--check]\n",
[UNMOUNT] =
-"imagex unmount DIRECTORY [--commit] [--check]\n",
+"imagex unmount DIRECTORY [--commit] [--check] [--rebuild]\n",
};
static const struct option common_options[] = {
};
static const struct option unmount_options[] = {
- {"commit", no_argument, NULL, 'c'},
- {"check", no_argument, NULL, 'C'},
+ {"commit", no_argument, NULL, 'c'},
+ {"check", no_argument, NULL, 'C'},
+ {"rebuild", no_argument, NULL, 'R'},
{NULL, 0, NULL, 0},
};
info->write_streams.completed_bytes >> 20,
info->write_streams.total_bytes >> 20,
percent_done);
- if (info->write_streams.completed_bytes == info->write_streams.total_bytes)
+ if (info->write_streams.completed_bytes >= info->write_streams.total_bytes)
putchar('\n');
break;
case WIMLIB_PROGRESS_MSG_SCAN_BEGIN:
"NTFS volume" : "directory"),
info->extract.target);
break;
- case WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END:
- printf("Done applying WIM image.\n",
- info->extract.image);
- if (info->extract.extract_flags & WIMLIB_EXTRACT_FLAG_NTFS) {
- printf("Unmounting NTFS volume `%s'...\n",
- info->extract.target);
- }
- break;
/*case WIMLIB_PROGRESS_MSG_EXTRACT_DIR_STRUCTURE_BEGIN:*/
/*printf("Applying directory structure to %s\n",*/
/*info->extract.target);*/
info->extract.completed_bytes >> 20,
info->extract.total_bytes >> 20,
percent_done);
- if (info->extract.completed_bytes == info->extract.total_bytes)
+ if (info->extract.completed_bytes >= info->extract.total_bytes)
putchar('\n');
break;
case WIMLIB_PROGRESS_MSG_EXTRACT_DENTRY:
puts(info->extract.cur_path);
break;
+ case WIMLIB_PROGRESS_MSG_APPLY_TIMESTAMPS:
+ printf("Setting timestamps on all extracted files...\n");
+ break;
+ case WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END:
+ if (info->extract.extract_flags & WIMLIB_EXTRACT_FLAG_NTFS) {
+ printf("Unmounting NTFS volume `%s'...\n",
+ info->extract.target);
+ }
+ break;
case WIMLIB_PROGRESS_MSG_JOIN_STREAMS:
percent_done = TO_PERCENT(info->join.completed_bytes,
info->join.total_bytes);
ret = wimlib_extract_image(w, image, target, extract_flags,
additional_swms, num_additional_swms,
imagex_progress_func);
+ if (ret == 0)
+ printf("Done applying WIM image.\n");
out:
wimlib_free(w);
if (additional_swms) {
int open_flags = WIMLIB_OPEN_FLAG_SPLIT_OK;
int part_number;
int total_parts;
+ int num_images;
for_opt(c, info_options) {
switch (c) {
image = wimlib_resolve_image(w, image_num_or_name);
if (image == WIMLIB_NO_IMAGE && strcmp(image_num_or_name, "0") != 0) {
imagex_error("The image `%s' does not exist",
- image_num_or_name);
+ image_num_or_name);
if (boot)
imagex_error("If you would like to set the boot "
"index to 0, specify image \"0\" with "
goto out;
}
- if (image == WIMLIB_ALL_IMAGES && wimlib_get_num_images(w) > 1) {
+ num_images = wimlib_get_num_images(w);
+
+ if (num_images == 0) {
+ if (boot) {
+ imagex_error("--boot is meaningless on a WIM with no "
+ "images");
+ ret = WIMLIB_ERR_INVALID_IMAGE;
+ goto out;
+ }
+ }
+
+ if (image == WIMLIB_ALL_IMAGES && num_images > 1) {
if (boot) {
imagex_error("Cannot specify the --boot flag "
"without specifying a specific "
"file `%s' for "
"writing ",
xml_out_file);
+ ret = -1;
goto out;
}
ret = wimlib_extract_xml_data(w, fp);
if (fclose(fp) != 0) {
imagex_error("Failed to close the file `%s'",
xml_out_file);
- goto out;
+ ret = -1;
}
if (ret != 0)
/* Modification operations */
if (total_parts != 1) {
imagex_error("Modifying a split WIM is not supported.");
- return -1;
+ ret = -1;
+ goto out;
}
if (image == WIMLIB_ALL_IMAGES)
image = 1;
if (image == WIMLIB_NO_IMAGE && new_name) {
imagex_error("Cannot specify new_name (`%s') when "
"using image 0", new_name);
- return -1;
+ ret = -1;
+ goto out;
}
if (boot) {
/* Only call wimlib_overwrite() if something actually needs to
* be changed. */
if (boot || new_name || new_desc ||
- check != wimlib_has_integrity_table(w)) {
+ (check && !wimlib_has_integrity_table(w)))
+ {
+ int write_flags;
ret = file_writable(wimfile);
if (ret != 0)
return ret;
- int write_flags;
- if (check) {
+ if (check)
write_flags = WIMLIB_WRITE_FLAG_CHECK_INTEGRITY;
- } else {
+ else
write_flags = 0;
- }
ret = wimlib_overwrite(w, write_flags, 1,
imagex_progress_func);
ret = 0;
} else {
printf("The file `%s' was not modified because nothing "
- "needed to be done.\n", wimfile);
+ "needed to be done.\n", wimfile);
ret = 0;
}
}
case 'C':
unmount_flags |= WIMLIB_UNMOUNT_FLAG_CHECK_INTEGRITY;
break;
+ case 'R':
+ unmount_flags |= WIMLIB_UNMOUNT_FLAG_REBUILD;
+ break;
default:
usage(UNMOUNT);
return -1;
imagex_error("Exiting with error code %d:\n"
" %s.", ret,
wimlib_get_error_string(ret));
- if (ret == WIMLIB_ERR_NTFS_3G)
+ if (ret == WIMLIB_ERR_NTFS_3G && errno != 0)
imagex_error_with_errno("errno");
}
return ret;