*/
/*
- * Copyright (C) 2012 Eric Biggers
+ * Copyright (C) 2012, 2013 Eric Biggers
*
* This file is part of wimlib, a library for working with WIM files.
*
#include "xml.h"
#include <stdlib.h>
-static int move_lte_to_table(struct wim_lookup_table_entry *lte,
- void *other_tab)
+static int
+move_lte_to_table(struct wim_lookup_table_entry *lte, void *other_tab)
{
hlist_del(<e->hash_list);
lookup_table_insert((struct wim_lookup_table*)other_tab, lte);
return 0;
}
-static int lookup_table_join(struct wim_lookup_table *table,
- struct wim_lookup_table *new)
+static int
+lookup_table_join(struct wim_lookup_table *table,
+ struct wim_lookup_table *new)
{
- return for_lookup_table_entry(new, move_lte_to_table, table);
+ for_lookup_table_entry(new, move_lte_to_table, table);
+ new->num_entries = 0;
+ return 0;
}
/*
* The reason we join the lookup tables is so we only have to search one lookup
* table to find the location of a resource in the entire WIM.
*/
-int new_joined_lookup_table(WIMStruct *w,
- WIMStruct **additional_swms,
- unsigned num_additional_swms,
- struct wim_lookup_table **table_ret)
+int
+new_joined_lookup_table(WIMStruct *w,
+ WIMStruct **additional_swms,
+ unsigned num_additional_swms,
+ struct wim_lookup_table **table_ret)
{
struct wim_lookup_table *table;
int ret;
}
-static int join_wims(WIMStruct **swms, unsigned num_swms,
- WIMStruct *joined_wim, int write_flags,
- wimlib_progress_func_t progress_func)
+static int
+join_wims(WIMStruct **swms, unsigned num_swms,
+ WIMStruct *joined_wim, int write_flags,
+ wimlib_progress_func_t progress_func)
{
int ret;
unsigned i;
progress_func(WIMLIB_PROGRESS_MSG_JOIN_STREAMS, &progress);
}
- /* Write the resources (streams and metadata resources) from each SWM
- * part */
- swms[0]->write_metadata = true;
+ /* Write the non-metadata resources from each SWM part */
for (i = 0; i < num_swms; i++) {
- swms[i]->fp = fopen(swms[i]->filename, "rb");
+ swms[i]->fp = tfopen(swms[i]->filename, T("rb"));
if (!swms[i]->fp) {
- ERROR_WITH_ERRNO("Failed to reopen `%s'",
+ ERROR_WITH_ERRNO("Failed to reopen `%"TS"'",
swms[i]->filename);
return WIMLIB_ERR_OPEN;
}
swms[i]->out_fp = joined_wim->out_fp;
swms[i]->hdr.part_number = 1;
- ret = for_lookup_table_entry(swms[i]->lookup_table,
- copy_resource, swms[i]);
+
+ ret = for_lookup_table_entry_pos_sorted(swms[i]->lookup_table,
+ copy_resource,
+ swms[i]);
swms[i]->out_fp = NULL;
- fclose(swms[i]->fp);
- swms[i]->fp = NULL;
- if (ret != 0)
+ if (i != 0) {
+ fclose(swms[i]->fp);
+ swms[i]->fp = NULL;
+ }
+
+ if (ret)
return ret;
if (progress_func) {
}
}
+ /* Copy the metadata resources from the first SWM part */
+ joined_wim->hdr.image_count = swms[0]->hdr.image_count;
+ for (i = 0; i < joined_wim->hdr.image_count; i++) {
+ ret = copy_resource(swms[0]->image_metadata[i]->metadata_lte,
+ joined_wim);
+ if (ret)
+ return ret;
+ }
+
+ /* Write lookup table, XML data, and optional integrity table */
joined_wim->hdr.image_count = swms[0]->hdr.image_count;
for (i = 0; i < num_swms; i++)
lookup_table_join(joined_wim->lookup_table, swms[i]->lookup_table);
free_wim_info(joined_wim->wim_info);
joined_wim->wim_info = swms[0]->wim_info;
+ joined_wim->image_metadata = swms[0]->image_metadata;
ret = finish_write(joined_wim, WIMLIB_ALL_IMAGES, write_flags, progress_func);
joined_wim->wim_info = NULL;
+ joined_wim->image_metadata = NULL;
return ret;
}
-static int cmp_swms_by_part_number(const void *swm1, const void *swm2)
+static int
+cmp_swms_by_part_number(const void *swm1, const void *swm2)
{
u16 partno_1 = (*(const WIMStruct**)swm1)->hdr.part_number;
u16 partno_2 = (*(const WIMStruct**)swm2)->hdr.part_number;
/*
* Join a set of split WIMs into a stand-alone WIM.
*/
-WIMLIBAPI int wimlib_join(const char **swm_names, unsigned num_swms,
- const char *output_path, int swm_open_flags,
- int wim_write_flags,
- wimlib_progress_func_t progress_func)
+WIMLIBAPI int
+wimlib_join(const tchar * const *swm_names,
+ unsigned num_swms,
+ const tchar *output_path,
+ int swm_open_flags,
+ int wim_write_flags,
+ wimlib_progress_func_t progress_func)
{
int ret;
WIMStruct *joined_wim = NULL;