X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Flookup_table.c;h=c6b45fed3d5d20fd3ef113a8353a8166773a2e4d;hp=4fbcf7e56a3ccea040c19ffae1e466d34b2e86ff;hb=0d4c61e4b3589848bac73c667b2244af7d88ed34;hpb=394c5bd3292c0f3168416c0a5f25989e557b3cfc diff --git a/src/lookup_table.c b/src/lookup_table.c index 4fbcf7e5..c6b45fed 100644 --- a/src/lookup_table.c +++ b/src/lookup_table.c @@ -89,15 +89,16 @@ clone_lookup_table_entry(const struct wim_lookup_table_entry *old) #ifdef __WIN32__ case RESOURCE_WIN32: case RESOURCE_WIN32_ENCRYPTED: +#else + case RESOURCE_IN_FILE_ON_DISK: #endif #ifdef WITH_FUSE case RESOURCE_IN_STAGING_FILE: -#endif - case RESOURCE_IN_FILE_ON_DISK: BUILD_BUG_ON((void*)&old->file_on_disk != (void*)&old->staging_file_name); - new->staging_file_name = TSTRDUP(old->staging_file_name); - if (!new->staging_file_name) +#endif + new->file_on_disk = TSTRDUP(old->file_on_disk); + if (!new->file_on_disk) goto out_free; break; case RESOURCE_IN_ATTACHED_BUFFER: @@ -144,14 +145,18 @@ free_lookup_table_entry(struct wim_lookup_table_entry *lte) { if (lte) { switch (lte->resource_location) { - case RESOURCE_IN_STAGING_FILE: - case RESOURCE_IN_ATTACHED_BUFFER: - case RESOURCE_IN_FILE_ON_DISK: -#ifdef __WIN32__ + #ifdef __WIN32__ case RESOURCE_WIN32: -#endif + case RESOURCE_WIN32_ENCRYPTED: + #else + case RESOURCE_IN_FILE_ON_DISK: + #endif + #ifdef WITH_FUSE + case RESOURCE_IN_STAGING_FILE: BUILD_BUG_ON((void*)<e->file_on_disk != (void*)<e->staging_file_name); + #endif + case RESOURCE_IN_ATTACHED_BUFFER: BUILD_BUG_ON((void*)<e->file_on_disk != (void*)<e->attached_buffer); FREE(lte->file_on_disk); @@ -667,15 +672,19 @@ print_lookup_table_entry(const struct wim_lookup_table_entry *lte, FILE *out) break; #ifdef __WIN32__ case RESOURCE_WIN32: -#endif + case RESOURCE_WIN32_ENCRYPTED: +#else case RESOURCE_IN_FILE_ON_DISK: +#endif 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; } @@ -856,6 +865,34 @@ inode_stream_lte(const struct wim_inode *inode, unsigned stream_idx, return inode_stream_lte_unresolved(inode, stream_idx, table); } +struct wim_lookup_table_entry * +inode_unnamed_lte_resolved(const struct wim_inode *inode) +{ + wimlib_assert(inode->i_resolved); + for (unsigned i = 0; i <= inode->i_num_ads; i++) { + if (inode_stream_name_nbytes(inode, i) == 0 && + !is_zero_hash(inode_stream_hash_resolved(inode, i))) + { + return inode_stream_lte_resolved(inode, i); + } + } + return NULL; +} + +struct wim_lookup_table_entry * +inode_unnamed_lte_unresolved(const struct wim_inode *inode, + const struct wim_lookup_table *table) +{ + wimlib_assert(!inode->i_resolved); + for (unsigned i = 0; i <= inode->i_num_ads; i++) { + if (inode_stream_name_nbytes(inode, i) == 0 && + !is_zero_hash(inode_stream_hash_unresolved(inode, i))) + { + return inode_stream_lte_unresolved(inode, i, table); + } + } + return NULL; +} /* Return the lookup table entry for the unnamed data stream of an inode, or * NULL if there is none. @@ -914,6 +951,19 @@ retrieve_lte_pointer(struct wim_lookup_table_entry *lte) return NULL; } +/* Calculate the SHA1 message digest of a stream and move it from the list of + * unhashed streams to the stream lookup table, possibly joining it with an + * existing lookup table entry for an identical stream. + * + * @lte: An unhashed lookup table entry. + * @lookup_table: Lookup table for the WIM. + * @lte_ret: On success, write a pointer to the resulting lookup table + * entry to this location. This will be the same as @lte + * if it was inserted into the lookup table, or different if + * a duplicate stream was found. + * + * Returns 0 on success; nonzero if there is an error reading the stream. + */ int hash_unhashed_stream(struct wim_lookup_table_entry *lte, struct wim_lookup_table *lookup_table, @@ -952,9 +1002,7 @@ hash_unhashed_stream(struct wim_lookup_table_entry *lte, /* No duplicate stream, so we need to insert * this stream into the lookup table and treat * it as a hashed stream. */ - list_del(<e->unhashed_list); lookup_table_insert(lookup_table, lte); - lte->out_refcnt = lte->refcnt; lte->unhashed = 0; } if (lte_ret)