X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fwim.c;h=557cda9c498da09adabfb3daac514396a06cac91;hb=f608d8af5cd666233156cebc4cfb62b14add33b7;hp=73288788a3466b92f8b19e0eb3786c29c7d508a4;hpb=5577584b8a50baa958f832ddb9418986e3e38847;p=wimlib diff --git a/src/wim.c b/src/wim.c index 73288788..557cda9c 100644 --- a/src/wim.c +++ b/src/wim.c @@ -11,30 +11,36 @@ * This file is part of wimlib, a library for working with WIM files. * * wimlib is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 2.1 of the License, or (at your option) + * terms of the GNU General Public License as published by the Free + * Software Foundation; either version 3 of the License, or (at your option) * any later version. * * wimlib is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * - * You should have received a copy of the GNU Lesser General Public License + * You should have received a copy of the GNU General Public License * along with wimlib; if not, see http://www.gnu.org/licenses/. */ +#include "config.h" +#include +#include + +#ifdef WITH_NTFS_3G +#include +#endif + #include "wimlib_internal.h" #include "io.h" #include "lookup_table.h" #include "xml.h" -#include + static int print_metadata(WIMStruct *w) { -#ifdef ENABLE_SECURITY_DATA print_security_data(wim_security_data(w)); -#endif return for_dentry_in_tree(wim_root_dentry(w), print_dentry, w->lookup_table); } @@ -48,14 +54,7 @@ static int print_files(WIMStruct *w) WIMStruct *new_wim_struct() { - WIMStruct *w; - - w = CALLOC(1, sizeof(WIMStruct)); - if (!w) - return NULL; - w->link_type = WIM_LINK_TYPE_NONE; - w->current_image = WIM_NO_IMAGE; - return w; + return CALLOC(1, sizeof(WIMStruct)); } /* @@ -70,8 +69,6 @@ int for_image(WIMStruct *w, int image, int (*visitor)(WIMStruct *)) int i; int end; - DEBUG("for_image(w = %p, image = %d, visitor = %p)", w, image, visitor); - if (image == WIM_ALL_IMAGES) { i = 1; end = w->hdr.image_count; @@ -116,6 +113,7 @@ static int append_metadata_resource_entry(struct lookup_table_entry *lte, WIMStruct *w = wim_p; if (lte->resource_entry.flags & WIM_RESHDR_FLAG_METADATA) { + /*fprintf(stderr, "found mlte at %u\n", lte->resource_entry.offset);*/ if (w->current_image == w->hdr.image_count) { ERROR("Expected only %u images, but found more", w->hdr.image_count); @@ -147,18 +145,6 @@ int wim_hdr_flags_compression_type(int wim_hdr_flags) } } -int wim_resource_compression_type(const WIMStruct *w, - const struct resource_entry *entry) -{ - int wim_ctype = wimlib_get_compression_type(w); - return resource_compression_type(wim_ctype, entry->flags); -} - -WIMLIBAPI void wimlib_set_verbose(WIMStruct *w, bool verbose) -{ - w->verbose = verbose; -} - /* * Creates a WIMStruct for a new WIM file. */ @@ -220,12 +206,9 @@ int wimlib_select_image(WIMStruct *w, int image) imd = wim_get_current_image_metadata(w); if (!imd->modified) { DEBUG("Freeing image %u", w->current_image); - free_dentry_tree(imd->root_dentry, NULL, false); + destroy_image_metadata(imd, NULL); imd->root_dentry = NULL; -#ifdef ENABLE_SECURITY_DATA - free_security_data(imd->security_data); imd->security_data = NULL; -#endif } } @@ -238,11 +221,9 @@ int wimlib_select_image(WIMStruct *w, int image) #ifdef ENABLE_DEBUG DEBUG("Reading metadata resource specified by the following " "lookup table entry:"); - print_lookup_table_entry(imd->metadata_lte, NULL); + print_lookup_table_entry(imd->metadata_lte); #endif - return read_metadata_resource(w->fp, - wimlib_get_compression_type(w), - imd); + return read_metadata_resource(w, imd); } } @@ -281,7 +262,8 @@ WIMLIBAPI int wimlib_resolve_image(WIMStruct *w, const char *image_name_or_num) if (!image_name_or_num) return WIM_NO_IMAGE; - if (strcmp(image_name_or_num, "all") == 0) + if (strcmp(image_name_or_num, "all") == 0 + || strcmp(image_name_or_num, "*") == 0) return WIM_ALL_IMAGES; image = strtol(image_name_or_num, &p, 10); if (p != image_name_or_num && *p == '\0') { @@ -350,17 +332,43 @@ WIMLIBAPI void wimlib_print_available_images(const WIMStruct *w, int image) * not WIM_NO_IMAGE. */ WIMLIBAPI int wimlib_print_metadata(WIMStruct *w, int image) { + if (!w) + return WIMLIB_ERR_INVALID_PARAM; + if (w->hdr.part_number != 1) { + ERROR("We cannot show the metadata from part %hu of a %hu-part split WIM.", + w->hdr.part_number, w->hdr.total_parts); + ERROR("Select the first part of the split WIM to see the metadata."); + return WIMLIB_ERR_SPLIT_UNSUPPORTED; + } + if (image == WIM_ALL_IMAGES) + DEBUG("Printing metadata for all images"); + else + DEBUG("Printing metadata for image %d", image); return for_image(w, image, print_metadata); } WIMLIBAPI int wimlib_print_files(WIMStruct *w, int image) { + if (!w) + return WIMLIB_ERR_INVALID_PARAM; + if (w->hdr.part_number != 1) { + ERROR("We cannot list the files from part %hu of a %hu-part split WIM", + w->hdr.part_number, w->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(w, image, print_files); } /* Sets the index of the bootable image. */ WIMLIBAPI int wimlib_set_boot_idx(WIMStruct *w, int boot_idx) { + if (!w) + return WIMLIB_ERR_INVALID_PARAM; + if (w->hdr.total_parts != 1) { + ERROR("We cannot modify the boot index of a split WIM"); + return WIMLIB_ERR_SPLIT_UNSUPPORTED; + } if (boot_idx < 0 || boot_idx > w->hdr.image_count) return WIMLIB_ERR_INVALID_IMAGE; w->hdr.boot_idx = boot_idx; @@ -409,7 +417,8 @@ static int begin_read(WIMStruct *w, const char *in_wim_path, int flags) w->fp = fopen(in_wim_path, "rb"); if (!w->fp) { - ERROR_WITH_ERRNO("Failed to open the file `%s' for reading"); + ERROR_WITH_ERRNO("Failed to open the file `%s' for reading", + in_wim_path); return WIMLIB_ERR_OPEN; } @@ -458,9 +467,7 @@ static int begin_read(WIMStruct *w, const char *in_wim_path, int flags) return WIMLIB_ERR_COMPRESSED_LOOKUP_TABLE; } - ret = read_lookup_table(w->fp, w->hdr.lookup_table_res_entry.offset, - w->hdr.lookup_table_res_entry.size, - &w->lookup_table); + ret = read_lookup_table(w); if (ret != 0) return ret; @@ -542,7 +549,7 @@ WIMLIBAPI int wimlib_open_wim(const char *wim_file, int flags, ret = begin_read(w, wim_file, flags); if (ret != 0) { - ERROR("Could not begin reading the WIM file `%s'", wim_file); + DEBUG("Could not begin reading the WIM file `%s'", wim_file); wimlib_free(w); return ret; } @@ -554,7 +561,7 @@ WIMLIBAPI int wimlib_open_wim(const char *wim_file, int flags, * closes all files associated with the WIMStruct. */ WIMLIBAPI void wimlib_free(WIMStruct *w) { - uint i; + DEBUG2("Freeing WIMStruct"); if (!w) return; @@ -566,19 +573,19 @@ WIMLIBAPI void wimlib_free(WIMStruct *w) free_lookup_table(w->lookup_table); FREE(w->filename); - FREE(w->output_dir); FREE(w->xml_data); free_wim_info(w->wim_info); if (w->image_metadata) { - for (i = 0; i < w->hdr.image_count; i++) { - free_dentry_tree(w->image_metadata[i].root_dentry, - NULL, false); - #ifdef ENABLE_SECURITY_DATA - free_security_data(w->image_metadata[i].security_data); - #endif - } + for (uint i = 0; i < w->hdr.image_count; i++) + destroy_image_metadata(&w->image_metadata[i], NULL); FREE(w->image_metadata); } +#ifdef WITH_NTFS_3G + if (w->ntfs_vol) { + DEBUG("Unmounting NTFS volume"); + ntfs_umount(w->ntfs_vol, FALSE); + } +#endif FREE(w); }