}
-static int
-image_print_files(WIMStruct *wim)
-{
- return for_dentry_in_tree(wim_root_dentry(wim), print_dentry_full_path,
- NULL);
-}
-
static WIMStruct *
new_wim_struct(void)
{
if (wim) {
wim->in_fd.fd = -1;
wim->out_fd.fd = -1;
+ INIT_LIST_HEAD(&wim->subwims);
}
return wim;
}
return WIMLIB_ERR_INVALID_IMAGE;
}
- if (wim->hdr.part_number != 1) {
- ERROR("Cannot select an image from a non-first part of a split WIM");
- return WIMLIB_ERR_SPLIT_UNSUPPORTED;
+ if (!wim_has_metadata(wim)) {
+ ERROR("\"%"TS"\" does not contain metadata resources!", wim->filename);
+ if (wim->hdr.part_number != 1)
+ ERROR("Specify the first part of the split WIM instead.");
+ return WIMLIB_ERR_METADATA_NOT_FOUND;
}
/* If a valid image is currently selected, it can be freed if it is not
}
}
-/* API function documented in wimlib.h */
-WIMLIBAPI void
-wimlib_print_wim_information(const WIMStruct *wim)
-{
- struct wimlib_wim_info info;
-
- wimlib_get_wim_info((WIMStruct*)wim, &info);
-
- tputs(T("WIM Information:"));
- tputs(T("----------------"));
- tprintf(T("Path: %"TS"\n"), wim->filename);
- tfputs(T("GUID: 0x"), stdout);
- print_byte_field(info.guid, WIM_GID_LEN, stdout);
- tputchar(T('\n'));
- tprintf(T("Image Count: %d\n"), info.image_count);
- tprintf(T("Compression: %"TS"\n"),
- wimlib_get_compression_type_string(info.compression_type));
- tprintf(T("Part Number: %d/%d\n"), info.part_number, info.total_parts);
- tprintf(T("Boot Index: %d\n"), info.boot_index);
- tprintf(T("Size: %"PRIu64" bytes\n"), info.total_bytes);
- tprintf(T("Integrity Info: %"TS"\n"),
- info.has_integrity_table ? T("yes") : T("no"));
- tprintf(T("Relative path junction: %"TS"\n"),
- info.has_rpfix ? T("yes") : T("no"));
- tputchar(T('\n'));
-}
-
/* API function documented in wimlib.h */
WIMLIBAPI void
wimlib_print_available_images(const WIMStruct *wim, int image)
WIMLIBAPI int
wimlib_print_metadata(WIMStruct *wim, int image)
{
- if (wim->hdr.part_number != 1) {
- ERROR("Cannot show the metadata from part %hu of a %hu-part split WIM!",
- wim->hdr.part_number, wim->hdr.total_parts);
- ERROR("Select the first part of the split WIM to see the metadata.");
- return WIMLIB_ERR_SPLIT_UNSUPPORTED;
- }
return for_image(wim, image, image_print_metadata);
}
-/* API function documented in wimlib.h */
-WIMLIBAPI int
-wimlib_print_files(WIMStruct *wim, int image)
-{
- if (wim->hdr.part_number != 1) {
- ERROR("Cannot list the files from part %hu of a %hu-part split WIM!",
- wim->hdr.part_number, wim->hdr.total_parts);
- ERROR("Select the first part of the split WIM if you'd like to list the files.");
- return WIMLIB_ERR_SPLIT_UNSUPPORTED;
- }
- return for_image(wim, image, image_print_files);
-}
-
/* API function documented in wimlib.h */
WIMLIBAPI int
wimlib_get_wim_info(WIMStruct *wim, struct wimlib_wim_info *info)
return 0;
}
-
-/* API function documented in wimlib.h */
-WIMLIBAPI int
-wimlib_get_boot_idx(const WIMStruct *wim)
-{
- struct wimlib_wim_info info;
-
- wimlib_get_wim_info((WIMStruct*)wim, &info);
- return info.boot_index;
-}
-
-/* API function documented in wimlib.h */
-WIMLIBAPI int
-wimlib_get_compression_type(const WIMStruct *wim)
-{
- struct wimlib_wim_info info;
-
- wimlib_get_wim_info((WIMStruct*)wim, &info);
- return info.compression_type;
-}
-
-/* API function documented in wimlib.h */
-WIMLIBAPI int
-wimlib_get_num_images(const WIMStruct *wim)
-{
- struct wimlib_wim_info info;
-
- wimlib_get_wim_info((WIMStruct*)wim, &info);
- return info.image_count;
-}
-
-/* API function documented in wimlib.h */
-WIMLIBAPI int
-wimlib_get_part_number(const WIMStruct *wim, int *total_parts_ret)
-{
- struct wimlib_wim_info info;
-
- wimlib_get_wim_info((WIMStruct*)wim, &info);
- if (total_parts_ret)
- *total_parts_ret = info.total_parts;
- return info.part_number;
-}
-
-/* API function documented in wimlib.h */
-WIMLIBAPI bool
-wimlib_has_integrity_table(const WIMStruct *wim)
-{
- struct wimlib_wim_info info;
-
- wimlib_get_wim_info((WIMStruct*)wim, &info);
- return info.has_integrity_table;
-}
-
/* API function documented in wimlib.h */
WIMLIBAPI int
wimlib_set_wim_info(WIMStruct *wim, const struct wimlib_wim_info *info, int which)
if (ret)
return ret;
- if (which & WIMLIB_CHANGE_GUID)
+ if (which & WIMLIB_CHANGE_GUID) {
memcpy(wim->hdr.guid, info->guid, WIM_GID_LEN);
+ wim->guid_set_explicitly = 1;
+ }
if (which & WIMLIB_CHANGE_BOOT_INDEX) {
if (info->boot_index > wim->hdr.image_count) {
return 0;
}
-/* API function documented in wimlib.h */
-WIMLIBAPI int
-wimlib_set_boot_idx(WIMStruct *wim, int boot_idx)
-{
- struct wimlib_wim_info info;
-
- info.boot_index = boot_idx;
- return wimlib_set_wim_info(wim, &info, WIMLIB_CHANGE_BOOT_INDEX);
-}
-
static int
do_open_wim(const tchar *filename, struct filedes *fd_ret)
{
* intervening time...
*
* Warning: in Windows native builds, realpath() calls the
- * replacement function in win32.c.
+ * replacement function in win32_replacements.c.
*/
wim->filename = realpath(wimfile, NULL);
if (!wim->filename) {
return ret;
}
- if (wim->hdr.total_parts != 1 && !(open_flags & WIMLIB_OPEN_FLAG_SPLIT_OK)) {
- ERROR("\"%"TS"\": This WIM is part %u of a %u-part WIM",
- wimfile, wim->hdr.part_number, wim->hdr.total_parts);
- return WIMLIB_ERR_SPLIT_UNSUPPORTED;
- }
+ if ((open_flags & WIMLIB_OPEN_FLAG_ERROR_IF_SPLIT) &&
+ (wim->hdr.total_parts != 1))
+ return WIMLIB_ERR_IS_SPLIT_WIM;
DEBUG("According to header, WIM contains %u images", wim->hdr.image_count);
wim_checksum_unhashed_streams(WIMStruct *wim)
{
int ret;
+
+ if (!wim_has_metadata(wim))
+ return 0;
for (int i = 0; i < wim->hdr.image_count; i++) {
struct wim_lookup_table_entry *lte, *tmp;
struct wim_image_metadata *imd = wim->image_metadata[i];
}
}
if (wim->hdr.total_parts != 1) {
- ERROR("Cannot modify \"%"TS"\": is part of a spanned set",
+ ERROR("Cannot modify \"%"TS"\": is part of a split WIM",
wim->filename);
return WIMLIB_ERR_WIM_IS_READONLY;
}
WIMLIBAPI void
wimlib_free(WIMStruct *wim)
{
- DEBUG("Freeing WIMStruct");
-
if (!wim)
return;
+
+ DEBUG("Freeing WIMStruct (filename=\"%"TS"\", image_count=%u)",
+ wim->filename, wim->hdr.image_count);
+
+ while (!list_empty(&wim->subwims)) {
+ WIMStruct *subwim;
+
+ subwim = list_entry(wim->subwims.next, WIMStruct, subwim_node);
+ list_del(&subwim->subwim_node);
+ DEBUG("Freeing subwim.");
+ wimlib_free(subwim);
+ }
+
if (filedes_valid(&wim->in_fd))
filedes_close(&wim->in_fd);
if (filedes_valid(&wim->out_fd))
filedes_close(&wim->out_fd);
+
free_lookup_table(wim->lookup_table);
FREE(wim->filename);
FREE(wim->image_metadata);
}
FREE(wim);
- DEBUG("Freed WIMStruct");
}
static bool
wimlib_global_init(int init_flags)
{
static bool already_inited = false;
+ int ret;
if (already_inited)
return 0;
#endif
}
#ifdef __WIN32__
- win32_global_init(init_flags);
+ ret = win32_global_init(init_flags);
+ if (ret)
+ return ret;
+#else
+ ret = 0;
#endif
already_inited = true;
- return 0;
+ return ret;
}
/* API function documented in wimlib.h */