* 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 "xml.h"
#include "io.h"
-struct args {
+struct split_args {
WIMStruct *w;
char *swm_base_name;
size_t swm_base_name_len;
off_t lookup_table_offset = ftello(w->out_fp);
int ret;
- DEBUG("Writing lookup table for SWM (offset %"PRIu64")",
+ DEBUG("Writing lookup table for SWM (offset %"PRIu64")",
lookup_table_offset);
while (lte_chain_head != NULL) {
if (ret != 0)
return ret;
struct lookup_table_entry *prev = lte_chain_head;
- lte_chain_head = prev->next_lte_in_swm;
+ lte_chain_head = lte_chain_head->next_lte_in_swm;
prev->next_lte_in_swm = NULL;
}
off_t xml_data_offset = ftello(w->out_fp);
if (lookup_table_offset == -1 || xml_data_offset == -1)
return WIMLIB_ERR_WRITE;
w->hdr.lookup_table_res_entry.offset = lookup_table_offset;
- w->hdr.lookup_table_res_entry.size =
+ w->hdr.lookup_table_res_entry.size =
xml_data_offset - lookup_table_offset;
- ret = finish_write(w, WIM_ALL_IMAGES, write_flags, 0);
- if (ret != 0)
- return ret;
-
- ret = fclose(w->out_fp);
- if (ret != 0)
- ret = WIMLIB_ERR_WRITE;
- w->out_fp = NULL;
- return ret;
+ return finish_write(w, WIM_ALL_IMAGES,
+ write_flags | WIMLIB_WRITE_FLAG_NO_LOOKUP_TABLE);
}
static int copy_resource_to_swm(struct lookup_table_entry *lte, void *__args)
{
- struct args *args = (struct args*)__args;
+ struct split_args *args = (struct split_args*)__args;
WIMStruct *w = args->w;
int ret;
if (lte->resource_entry.flags & WIM_RESHDR_FLAG_METADATA)
return 0;
- if (args->size_remaining < 0 ||
+ if (args->size_remaining < 0 ||
(u64)args->size_remaining < lte->resource_entry.size) {
/* No space for this resource. Finish the previous swm and
args->lte_chain_tail = NULL;
args->lte_chain_head = NULL;
- sprintf(args->swm_base_name + args->swm_base_name_len, "%d",
- ++args->part_number);
- strcat(args->swm_base_name, args->swm_suffix);
+ sprintf(args->swm_base_name + args->swm_base_name_len, "%d%s",
+ ++args->part_number, args->swm_suffix);
w->hdr.part_number = args->part_number;
if (args->write_flags & WIMLIB_OPEN_FLAG_SHOW_PROGRESS)
printf("Writing `%s' (%"PRIu64" of %"PRIu64" bytes, "
- "%.0f%% done)\n",
- args->swm_base_name,
+ "%.0f%% done)\n",
+ args->swm_base_name,
args->total_bytes_written,
args->total_bytes,
(double)args->total_bytes_written /
/* Splits the WIM file @wimfile into multiple parts prefixed by @swm_name with
* size at most @part_size. */
-WIMLIBAPI int wimlib_split(const char *wimfile, const char *swm_name,
+WIMLIBAPI int wimlib_split(const char *wimfile, const char *swm_name,
size_t part_size, int flags)
{
int ret;
}
if (write_flags & WIMLIB_OPEN_FLAG_SHOW_PROGRESS)
- printf("Writing `%s' (%.2f %% done)\n",
- swm_name,
+ printf("Writing `%s' (%.2f %% done)\n",
+ swm_name,
(double)total_bytes_written /
(double)total_bytes * 100.0);
w->write_metadata = true;
for (int i = 0; i < w->hdr.image_count; i++) {
-
struct lookup_table_entry *metadata_lte;
+ DEBUG("Writing metadata resource %d", i);
+
metadata_lte = w->image_metadata[i].metadata_lte;
ret = copy_resource(metadata_lte, w);
if (ret != 0)
}
w->write_metadata = false;
- struct args args = {
+ struct split_args args = {
.w = w,
.swm_base_name = name,
.swm_base_name_len = swm_base_name_len,
FILE *fp = fopen(p, "r+b");
if (!fp) {
- ERROR_WITH_ERRNO("Failed to open `%s'");
+ ERROR_WITH_ERRNO("Failed to open `%s'", p);
return WIMLIB_ERR_OPEN;
}
u8 buf[4];
put_u16(&buf[0], i);
put_u16(&buf[2], total_parts);
- if (fseek(fp, 40, SEEK_SET) != 0 ||
+ if (fseek(fp, 40, SEEK_SET) != 0 ||
fwrite(buf, 1, sizeof(buf), fp) != sizeof(buf)
|| fclose(fp) != 0) {
ERROR_WITH_ERRNO("Error overwriting header of `%s'",