X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fwim.c;h=bd31c5b3ea9d1e1f1ee9e6ef262e502586988a5c;hb=ad37dd86e75416ffc47c97b35f097012be5eeaa2;hp=915e036dd629de15b4f96d1dee7da4f29ab37639;hpb=01919fdd57105c0ab91316b79c10e3992e686436;p=wimlib diff --git a/src/wim.c b/src/wim.c index 915e036d..bd31c5b3 100644 --- a/src/wim.c +++ b/src/wim.c @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 2012 Eric Biggers + * Copyright (C) 2012, 2013 Eric Biggers * * wimlib - Library for working with WIM files * @@ -204,6 +204,7 @@ WIMLIBAPI int wimlib_get_num_images(const WIMStruct *w) int select_wim_image(WIMStruct *w, int image) { struct wim_image_metadata *imd; + int ret; DEBUG("Selecting image %d", image); @@ -233,20 +234,21 @@ int select_wim_image(WIMStruct *w, int 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; } @@ -515,7 +517,7 @@ static int begin_read(WIMStruct *w, const char *in_wim_path, int open_flags, 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) { @@ -597,7 +599,7 @@ void destroy_image_metadata(struct wim_image_metadata *imd, * closes all files associated with the WIMStruct. */ WIMLIBAPI void wimlib_free(WIMStruct *w) { - DEBUG2("Freeing WIMStruct"); + DEBUG("Freeing WIMStruct"); if (!w) return; @@ -633,4 +635,21 @@ WIMLIBAPI void wimlib_free(WIMStruct *w) } #endif FREE(w); + DEBUG("Freed WIMStruct"); +} + +/* 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(); }