IMAGEX_THREADS_OPTION,
IMAGEX_TO_STDOUT_OPTION,
IMAGEX_UNIX_DATA_OPTION,
+ IMAGEX_UNSAFE_COMPACT_OPTION,
IMAGEX_UPDATE_OF_OPTION,
IMAGEX_VERBOSE_OPTION,
IMAGEX_WIMBOOT_CONFIG_OPTION,
{T("update-of"), required_argument, NULL, IMAGEX_UPDATE_OF_OPTION},
{T("delta-from"), required_argument, NULL, IMAGEX_DELTA_FROM_OPTION},
{T("wimboot"), no_argument, NULL, IMAGEX_WIMBOOT_OPTION},
+ {T("unsafe-compact"), no_argument, NULL, IMAGEX_UNSAFE_COMPACT_OPTION},
{NULL, 0, NULL, 0},
};
static const struct option delete_options[] = {
{T("check"), no_argument, NULL, IMAGEX_CHECK_OPTION},
{T("soft"), no_argument, NULL, IMAGEX_SOFT_OPTION},
+ {T("unsafe-compact"), no_argument, NULL, IMAGEX_UNSAFE_COMPACT_OPTION},
{NULL, 0, NULL, 0},
};
{T("path"), required_argument, NULL, IMAGEX_PATH_OPTION},
{T("detailed"), no_argument, NULL, IMAGEX_DETAILED_OPTION},
{T("one-file-only"), no_argument, NULL, IMAGEX_ONE_FILE_ONLY_OPTION},
+ {T("ref"), required_argument, NULL, IMAGEX_REF_OPTION},
{NULL, 0, NULL, 0},
};
{T("pipable"), no_argument, NULL, IMAGEX_PIPABLE_OPTION},
{T("not-pipable"), no_argument, NULL, IMAGEX_NOT_PIPABLE_OPTION},
{T("wimboot"), no_argument, NULL, IMAGEX_WIMBOOT_OPTION},
+ {T("unsafe-compact"), no_argument, NULL, IMAGEX_UNSAFE_COMPACT_OPTION},
{NULL, 0, NULL, 0},
};
{T("threads"), required_argument, NULL, IMAGEX_THREADS_OPTION},
{T("pipable"), no_argument, NULL, IMAGEX_PIPABLE_OPTION},
{T("not-pipable"), no_argument, NULL, IMAGEX_NOT_PIPABLE_OPTION},
+ {T("unsafe-compact"), no_argument, NULL, IMAGEX_UNSAFE_COMPACT_OPTION},
{NULL, 0, NULL, 0},
};
{T("no-acls"), no_argument, NULL, IMAGEX_NO_ACLS_OPTION},
{T("strict-acls"), no_argument, NULL, IMAGEX_STRICT_ACLS_OPTION},
{T("no-replace"), no_argument, NULL, IMAGEX_NO_REPLACE_OPTION},
+ {T("unsafe-compact"), no_argument, NULL, IMAGEX_UNSAFE_COMPACT_OPTION},
{NULL, 0, NULL, 0},
};
}
}
+static void
+do_metadata_not_found_warning(const tchar *wimfile,
+ const struct wimlib_wim_info *info)
+{
+ if (info->part_number != 1) {
+ imagex_error(T("\"%"TS"\" is not the first part of the split WIM.\n"
+ " You must specify the first part."),
+ wimfile);
+ }
+}
+
/* Returns the size of a file given its name, or -1 if the file does not exist
* or its size cannot be determined. */
static off_t
" make sure you have "
"concatenated together all parts."));
}
+ } else if (ret == WIMLIB_ERR_METADATA_NOT_FOUND && wim) {
+ do_metadata_not_found_warning(wimfile, &info);
}
out_wimlib_free:
wimlib_free(wim);
case IMAGEX_WIMBOOT_OPTION:
add_flags |= WIMLIB_ADD_FLAG_WIMBOOT;
break;
+ case IMAGEX_UNSAFE_COMPACT_OPTION:
+ write_flags |= WIMLIB_WRITE_FLAG_UNSAFE_COMPACT;
+ break;
default:
goto out_usage;
}
case IMAGEX_SOFT_OPTION:
write_flags |= WIMLIB_WRITE_FLAG_SOFT_DELETE;
break;
+ case IMAGEX_UNSAFE_COMPACT_OPTION:
+ write_flags |= WIMLIB_WRITE_FLAG_UNSAFE_COMPACT;
+ break;
default:
goto out_usage;
}
};
int iterate_flags = WIMLIB_ITERATE_DIR_TREE_FLAG_RECURSIVE;
+ STRING_SET(refglobs);
+
for_opt(c, dir_options) {
switch (c) {
case IMAGEX_PATH_OPTION:
case IMAGEX_ONE_FILE_ONLY_OPTION:
iterate_flags &= ~WIMLIB_ITERATE_DIR_TREE_FLAG_RECURSIVE;
break;
+ case IMAGEX_REF_OPTION:
+ ret = string_set_append(&refglobs, optarg);
+ if (ret)
+ goto out_free_refglobs;
+ break;
default:
goto out_usage;
}
ret = wimlib_open_wim_with_progress(wimfile, 0, &wim,
imagex_progress_func, NULL);
if (ret)
- goto out;
+ goto out_free_refglobs;
if (argc >= 2) {
image = wimlib_resolve_image(wim, argv[1]);
image = 1;
}
+ if (refglobs.num_strings) {
+ ret = wim_reference_globs(wim, &refglobs, 0);
+ if (ret)
+ goto out_wimlib_free;
+ }
+
ret = wimlib_iterate_dir_tree(wim, image, path, iterate_flags,
print_dentry, &options);
+ if (ret == WIMLIB_ERR_METADATA_NOT_FOUND) {
+ struct wimlib_wim_info info;
+
+ wimlib_get_wim_info(wim, &info);
+ do_metadata_not_found_warning(wimfile, &info);
+ }
out_wimlib_free:
wimlib_free(wim);
-out:
+out_free_refglobs:
+ string_set_destroy(&refglobs);
return ret;
out_usage:
usage(CMD_DIR, stderr);
ret = -1;
- goto out;
+ goto out_free_refglobs;
}
/* Exports one, or all, images from a WIM file to a new WIM file or an existing
case IMAGEX_WIMBOOT_OPTION:
export_flags |= WIMLIB_EXPORT_FLAG_WIMBOOT;
break;
+ case IMAGEX_UNSAFE_COMPACT_OPTION:
+ write_flags |= WIMLIB_WRITE_FLAG_UNSAFE_COMPACT;
+ break;
default:
goto out_usage;
}
if (ret == WIMLIB_ERR_RESOURCE_NOT_FOUND) {
do_resource_not_found_warning(src_wimfile,
&src_info, &refglobs);
+ } else if (ret == WIMLIB_ERR_METADATA_NOT_FOUND) {
+ do_metadata_not_found_warning(src_wimfile, &src_info);
}
goto out_free_dest_wim;
}
wimlib_get_wim_info(wim, &info);
do_resource_not_found_warning(wimfile, &info, &refglobs);
+ } else if (ret == WIMLIB_ERR_METADATA_NOT_FOUND) {
+ struct wimlib_wim_info info;
+
+ wimlib_get_wim_info(wim, &info);
+ do_metadata_not_found_warning(wimfile, &info);
}
out_wimlib_free:
wimlib_free(wim);
ret = wimlib_mount_image(wim, image, dir, mount_flags, staging_dir);
if (ret) {
- imagex_error(T("Failed to mount image %d from \"%"TS"\" "
- "on \"%"TS"\""),
- image, wimfile, dir);
+ if (ret == WIMLIB_ERR_METADATA_NOT_FOUND) {
+ do_metadata_not_found_warning(wimfile, &info);
+ } else {
+ imagex_error(T("Failed to mount image %d from \"%"TS"\" "
+ "on \"%"TS"\""),
+ image, wimfile, dir);
+ }
}
out_free_wim:
wimlib_free(wim);
case IMAGEX_NOT_PIPABLE_OPTION:
write_flags |= WIMLIB_WRITE_FLAG_NOT_PIPABLE;
break;
+ case IMAGEX_UNSAFE_COMPACT_OPTION:
+ write_flags |= WIMLIB_WRITE_FLAG_UNSAFE_COMPACT;
+ break;
default:
goto out_usage;
}
case IMAGEX_NO_REPLACE_OPTION:
default_add_flags |= WIMLIB_ADD_FLAG_NO_REPLACE;
break;
+ case IMAGEX_UNSAFE_COMPACT_OPTION:
+ write_flags |= WIMLIB_WRITE_FLAG_UNSAFE_COMPACT;
+ break;
default:
goto out_usage;
}