* 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 <stdlib.h>
+#include <stdarg.h>
+
+#ifdef WITH_NTFS_3G
+#include <ntfs-3g/volume.h>
+#endif
+
#include "wimlib_internal.h"
#include "io.h"
#include "lookup_table.h"
#include "xml.h"
-#include <stdlib.h>
+
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);
}
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));
}
/*
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;
end = image;
}
for (; i <= end; i++) {
- ret = wimlib_select_image(w, i);
+ ret = select_wim_image(w, i);
if (ret != 0)
return ret;
ret = visitor(w);
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);
}
}
-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.
*/
return w->hdr.image_count;
}
-int wimlib_select_image(WIMStruct *w, int image)
+int select_wim_image(WIMStruct *w, int image)
{
struct image_metadata *imd;
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
}
}
#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);
}
}
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') {
* 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;
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;
}
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;
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;
}
* closes all files associated with the WIMStruct. */
WIMLIBAPI void wimlib_free(WIMStruct *w)
{
- uint i;
+ DEBUG2("Freeing WIMStruct");
if (!w)
return;
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);
}