X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Flookup_table.c;h=c76823d14e4cacc3b4be3f620a14cadcb9dd13ec;hp=4cae97ce0cbdc7a69b1e7e66a22dbd8bf1bb42dc;hb=2850f8933244f6c63f608eec612ad804e01072e1;hpb=5d3d469e410dc5f4a28814ad231336fc174cba56 diff --git a/src/lookup_table.c b/src/lookup_table.c index 4cae97ce..c76823d1 100644 --- a/src/lookup_table.c +++ b/src/lookup_table.c @@ -721,6 +721,19 @@ read_wim_lookup_table(WIMStruct *wim) } wim_res_hdr_to_spec(&reshdr, wim, cur_rspec); + /* If this is a packed run, the current stream entry may + * specify a stream within the resource, and not the + * resource itself. Zero possibly irrelevant data until + * it is read for certain. (Note that the computation + * of 'back_to_back_pack' tests if 'size_in_wim' is + * nonzero to see if the resource info has been read; + * hence we need to set it to 0 here.) */ + if (reshdr.flags & WIM_RESHDR_FLAG_PACKED_STREAMS) { + cur_rspec->size_in_wim = 0; + cur_rspec->uncompressed_size = 0; + cur_rspec->offset_in_wim = 0; + } + if (prev_entry) lte_bind_wim_resource_spec(prev_entry, cur_rspec); } @@ -814,10 +827,7 @@ read_wim_lookup_table(WIMStruct *wim) } if (cur_entry->refcnt != 1) { - if (wimlib_print_errors) { - ERROR("Found metadata resource with refcnt != 1:"); - print_lookup_table_entry(cur_entry, stderr); - } + ERROR("Found metadata resource with refcnt != 1"); ret = WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY; goto err; } @@ -857,14 +867,8 @@ read_wim_lookup_table(WIMStruct *wim) * resource. */ duplicate_entry = lookup_stream(table, cur_entry->hash); if (duplicate_entry) { - if (wimlib_print_errors) { - WARNING("The WIM lookup table contains two entries with the " - "same SHA1 message digest!"); - WARNING("The first entry is:"); - print_lookup_table_entry(duplicate_entry, stderr); - WARNING("The second entry is:"); - print_lookup_table_entry(cur_entry, stderr); - } + WARNING("The WIM lookup table contains two entries " + "with the same SHA1 message digest!"); free_lookup_table_entry(cur_entry); continue; } @@ -1127,87 +1131,6 @@ hash_unhashed_stream(struct wim_lookup_table_entry *lte, return 0; } -void -print_lookup_table_entry(const struct wim_lookup_table_entry *lte, FILE *out) -{ - if (lte == NULL) { - tputc(T('\n'), out); - return; - } - - - tprintf(T("Uncompressed size = %"PRIu64" bytes\n"), - lte->size); - if (lte->flags & WIM_RESHDR_FLAG_PACKED_STREAMS) { - tprintf(T("Offset = %"PRIu64" bytes\n"), - lte->offset_in_res); - - tprintf(T("Raw uncompressed size = %"PRIu64" bytes\n"), - lte->rspec->uncompressed_size); - - tprintf(T("Raw compressed size = %"PRIu64" bytes\n"), - lte->rspec->size_in_wim); - - tprintf(T("Raw offset = %"PRIu64" bytes\n"), - lte->rspec->offset_in_wim); - } else if (lte->resource_location == RESOURCE_IN_WIM) { - tprintf(T("Compressed size = %"PRIu64" bytes\n"), - lte->rspec->size_in_wim); - - tprintf(T("Offset = %"PRIu64" bytes\n"), - lte->rspec->offset_in_wim); - } - - tfprintf(out, T("Reference Count = %u\n"), lte->refcnt); - - if (lte->unhashed) { - tfprintf(out, T("(Unhashed: inode %p, stream_id = %u)\n"), - lte->back_inode, lte->back_stream_id); - } else { - tfprintf(out, T("Hash = 0x")); - print_hash(lte->hash, out); - tputc(T('\n'), out); - } - - tfprintf(out, T("Flags = ")); - u8 flags = lte->flags; - if (flags & WIM_RESHDR_FLAG_COMPRESSED) - tfputs(T("WIM_RESHDR_FLAG_COMPRESSED, "), out); - if (flags & WIM_RESHDR_FLAG_FREE) - tfputs(T("WIM_RESHDR_FLAG_FREE, "), out); - if (flags & WIM_RESHDR_FLAG_METADATA) - tfputs(T("WIM_RESHDR_FLAG_METADATA, "), out); - if (flags & WIM_RESHDR_FLAG_SPANNED) - tfputs(T("WIM_RESHDR_FLAG_SPANNED, "), out); - if (flags & WIM_RESHDR_FLAG_PACKED_STREAMS) - tfputs(T("WIM_RESHDR_FLAG_PACKED_STREAMS, "), out); - tputc(T('\n'), out); - switch (lte->resource_location) { - case RESOURCE_IN_WIM: - if (lte->rspec->wim->filename) { - tfprintf(out, T("WIM file = `%"TS"'\n"), - lte->rspec->wim->filename); - } - break; -#ifdef __WIN32__ - case RESOURCE_WIN32_ENCRYPTED: -#endif - case RESOURCE_IN_FILE_ON_DISK: - tfprintf(out, T("File on Disk = `%"TS"'\n"), - lte->file_on_disk); - break; -#ifdef WITH_FUSE - case RESOURCE_IN_STAGING_FILE: - tfprintf(out, T("Staging File = `%"TS"'\n"), - lte->staging_file_name); - break; -#endif - default: - break; - } - tputc(T('\n'), out); -} - void lte_to_wimlib_resource_entry(const struct wim_lookup_table_entry *lte, struct wimlib_resource_entry *wentry)