#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:
{
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);
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;
}
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.
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,
/* 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)