X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=programs%2Fimagex.c;h=358e2d12a98801107350c81794f6466103eebc89;hb=7bde3fc590afbdef8f71cd7f8ccbd24172bffc63;hp=f3b75e0b22f0144a8fd0c548b10bde7b55bb31ca;hpb=8679240bb2e419f931771a977fa18c00f88e450a;p=wimlib diff --git a/programs/imagex.c b/programs/imagex.c index f3b75e0b..358e2d12 100644 --- a/programs/imagex.c +++ b/programs/imagex.c @@ -105,7 +105,7 @@ static const char *usage_strings[] = { [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[] = { @@ -187,8 +187,9 @@ static const struct option split_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}, }; @@ -360,7 +361,7 @@ static int imagex_progress_func(enum wimlib_progress_msg msg, 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: @@ -406,14 +407,6 @@ static int imagex_progress_func(enum wimlib_progress_msg msg, "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);*/ @@ -426,12 +419,21 @@ static int imagex_progress_func(enum wimlib_progress_msg msg, 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); @@ -637,6 +639,8 @@ static int imagex_apply(int argc, const char **argv) 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) { @@ -1007,7 +1011,7 @@ static int imagex_export(int argc, const char **argv) ret = file_writable(dest_wimfile); if (ret != 0) - return ret; + goto out; dest_ctype = wimlib_get_compression_type(dest_w); if (compression_type_specified @@ -1101,6 +1105,7 @@ static int imagex_info(int argc, const char **argv) int open_flags = WIMLIB_OPEN_FLAG_SPLIT_OK; int part_number; int total_parts; + int num_images; for_opt(c, info_options) { switch (c) { @@ -1166,7 +1171,7 @@ static int imagex_info(int argc, const char **argv) 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 " @@ -1175,7 +1180,18 @@ static int imagex_info(int argc, const char **argv) 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 " @@ -1233,13 +1249,14 @@ static int imagex_info(int argc, const char **argv) "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) @@ -1259,7 +1276,8 @@ static int imagex_info(int argc, const char **argv) /* 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; @@ -1267,7 +1285,8 @@ static int imagex_info(int argc, const char **argv) 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) { @@ -1315,18 +1334,18 @@ static int imagex_info(int argc, const char **argv) /* 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); @@ -1334,7 +1353,7 @@ static int imagex_info(int argc, const char **argv) 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; } } @@ -1470,7 +1489,7 @@ static int imagex_mount_rw_or_ro(int argc, const char **argv) if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) { ret = file_writable(wimfile); if (ret != 0) - return ret; + goto out; } ret = wimlib_mount_image(w, image, dir, mount_flags, additional_swms, @@ -1622,6 +1641,9 @@ static int imagex_unmount(int argc, const char **argv) case 'C': unmount_flags |= WIMLIB_UNMOUNT_FLAG_CHECK_INTEGRITY; break; + case 'R': + unmount_flags |= WIMLIB_UNMOUNT_FLAG_REBUILD; + break; default: usage(UNMOUNT); return -1; @@ -1757,22 +1779,28 @@ int main(int argc, const char **argv) argv++; wimlib_set_print_errors(true); + ret = wimlib_global_init(); + if (ret) + goto out; for_imagex_command(cmd) { if (strcmp(cmd->name, *argv) == 0) { ret = cmd->func(argc, argv); - if (ret > 0) { - imagex_error("Exiting with error code %d:\n" - " %s.", ret, - wimlib_get_error_string(ret)); - if (ret == WIMLIB_ERR_NTFS_3G) - imagex_error_with_errno("errno"); - } - return ret; + goto out; } } imagex_error("Unrecognized command: `%s'", argv[0]); usage_all(); return 1; +out: + if (ret > 0) { + imagex_error("Exiting with error code %d:\n" + " %s.", ret, + wimlib_get_error_string(ret)); + if (ret == WIMLIB_ERR_NTFS_3G && errno != 0) + imagex_error_with_errno("errno"); + } + wimlib_global_cleanup(); + return ret; }