/* Decrement the reference count for the dentry having hash value @hash in the
* lookup table. The lookup table entry is unlinked and freed if there are no
* references to in remaining. */
-bool lookup_table_decrement_refcnt(struct lookup_table* table, const u8 hash[])
+struct lookup_table_entry *
+lookup_table_decrement_refcnt(struct lookup_table* table, const u8 hash[])
{
size_t pos = *(size_t*)hash % table->capacity;
struct lookup_table_entry *prev = NULL;
if (memcmp(hash, entry->hash, WIM_HASH_SIZE) == 0) {
wimlib_assert(entry->refcnt != 0);
if (--entry->refcnt == 0) {
- if (entry->staging_num_times_opened == 0)
+ if (entry->num_opened_fds == 0) {
free_lookup_table_entry(entry);
+ entry = NULL;
+ }
if (prev)
prev->next = next;
else
table->array[pos] = next;
- return true;
+ break;
}
}
prev = entry;
entry = next;
}
- return false;
+ return entry;
}
return 0;
if (lte->output_resource_entry.flags & WIM_RESHDR_FLAG_METADATA)
- DEBUG("Writing metadata entry at %lu", ftello(out));
+ DEBUG("Writing metadata entry at %lu (orig size = %zu)",
+ ftello(out), lte->output_resource_entry.original_size);
p = put_resource_entry(buf, <e->output_resource_entry);
p = put_u16(p, lte->part_number);
{
struct dentry *dentry = get_dentry(w, path);
struct lookup_table_entry *lte;
- const u8 *hash;
+ u8 *hash;
if (!dentry)
return -ENOENT;
if (!(lookup_flags & LOOKUP_FLAG_DIRECTORY_OK)
if (lookup_flags & LOOKUP_FLAG_ADS_OK) {
const char *stream_name = path_stream_name(path);
if (stream_name) {
+ size_t stream_name_len = strlen(stream_name);
for (u16 i = 0; i < dentry->num_ads; i++) {
- if (strcmp(stream_name, dentry->ads_entries[i].stream_name) == 0) {
+ if (ads_entry_has_name(&dentry->ads_entries[i],
+ stream_name,
+ stream_name_len))
+ {
hash = dentry->ads_entries[i].hash;
goto do_lookup;
}