X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fwim.c;h=20afd389aa535f8bf604ad32bb4df9ea3b00d885;hp=1e006dabbadf5b51901497229ce236c0a7003dbe;hb=465a630d28e93b09e55ca07b1a6cae8def3b42f5;hpb=e3689bfa91c108ea0f5c86160bd594f98cd541a6 diff --git a/src/wim.c b/src/wim.c index 1e006dab..20afd389 100644 --- a/src/wim.c +++ b/src/wim.c @@ -71,6 +71,7 @@ new_wim_struct(void) wim->in_fd.fd = -1; wim->out_fd.fd = -1; } + INIT_LIST_HEAD(&wim->subwims); return wim; } @@ -167,9 +168,11 @@ select_wim_image(WIMStruct *wim, int image) 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 @@ -278,12 +281,6 @@ 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); } @@ -336,8 +333,10 @@ wimlib_set_wim_info(WIMStruct *wim, const struct wimlib_wim_info *info, int whic 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) { @@ -755,15 +754,27 @@ can_delete_from_wim(WIMStruct *wim) 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); @@ -774,7 +785,6 @@ wimlib_free(WIMStruct *wim) FREE(wim->image_metadata); } FREE(wim); - DEBUG("Freed WIMStruct"); } static bool @@ -797,6 +807,7 @@ WIMLIBAPI int wimlib_global_init(int init_flags) { static bool already_inited = false; + int ret; if (already_inited) return 0; @@ -809,10 +820,14 @@ wimlib_global_init(int init_flags) #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 */