static int sort_image_metadata_by_position(const void *p1, const void *p2)
{
- const struct image_metadata *imd1 = p1;
- const struct image_metadata *imd2 = p2;
+ const struct wim_image_metadata *imd1 = p1;
+ const struct wim_image_metadata *imd2 = p2;
u64 offset1 = imd1->metadata_lte->resource_entry.offset;
u64 offset2 = imd2->metadata_lte->resource_entry.offset;
if (offset1 < offset2)
int select_wim_image(WIMStruct *w, int image)
{
- struct image_metadata *imd;
+ struct wim_image_metadata *imd;
+ int ret;
DEBUG("Selecting image %d", image);
INIT_HLIST_HEAD(&imd->inode_list);
}
}
-
w->current_image = image;
- imd = wim_get_current_image_metadata(w);
-
+ imd = &w->image_metadata[image - 1];
if (imd->root_dentry) {
- return 0;
+ ret = 0;
} else {
#ifdef ENABLE_DEBUG
DEBUG("Reading metadata resource specified by the following "
"lookup table entry:");
- print_lookup_table_entry(imd->metadata_lte);
+ print_lookup_table_entry(imd->metadata_lte, stdout);
#endif
- return read_metadata_resource(w, imd);
+ ret = read_metadata_resource(w, imd);
+ if (ret)
+ w->current_image = WIMLIB_NO_IMAGE;
}
+ return ret;
}
if (w->hdr.image_count != 0) {
w->image_metadata = CALLOC(w->hdr.image_count,
- sizeof(struct image_metadata));
+ sizeof(struct wim_image_metadata));
if (!w->image_metadata) {
ERROR("Failed to allocate memory for %u image metadata structures",
return ret;
/* Make sure all the expected images were found. (We already have
- * returned false if *extra* images were found) */
+ * returned WIMLIB_ERR_IMAGE_COUNT if *extra* images were found) */
if (w->current_image != w->hdr.image_count &&
w->hdr.part_number == 1)
{
* file, rather than their order in the lookup table, which is random
* because of hashing. */
qsort(w->image_metadata, w->current_image,
- sizeof(struct image_metadata), sort_image_metadata_by_position);
+ sizeof(struct wim_image_metadata), sort_image_metadata_by_position);
w->current_image = WIMLIB_NO_IMAGE;
return ret;
}
-void destroy_image_metadata(struct image_metadata *imd,
+void destroy_image_metadata(struct wim_image_metadata *imd,
struct wim_lookup_table *table)
{
free_dentry_tree(imd->root_dentry, table);
#endif
FREE(w);
}
+
+/* Get global memory allocations out of the way. Not strictly necessary in
+ * single-threaded programs like 'imagex'. */
+WIMLIBAPI int wimlib_global_init()
+{
+ libxml_global_init();
+ return iconv_global_init();
+}
+
+/* Free global memory allocations. Not strictly necessary if the process using
+ * wimlib is just about to exit (as is the case for 'imagex'). */
+WIMLIBAPI void wimlib_global_cleanup()
+{
+ libxml_global_cleanup();
+ iconv_global_cleanup();
+}