#include "wimlib_internal.h"
#include "lookup_table.h"
#include "io.h"
+#include <errno.h>
struct lookup_table *new_lookup_table(size_t capacity)
{
}
+void free_lookup_table_entry(struct lookup_table_entry *lte)
+{
+ if (lte) {
+ if (lte->staging_list.next)
+ list_del(<e->staging_list);
+ FREE(lte->file_on_disk);
+ FREE(lte);
+ }
+}
/*
* Inserts an entry into the lookup table.
/* 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);
int lookup_flags,
struct dentry **dentry_ret,
struct lookup_table_entry **lte_ret,
- u8 **hash_ret)
+ unsigned *stream_idx_ret)
{
struct dentry *dentry = get_dentry(w, path);
struct lookup_table_entry *lte;
- const u8 *hash;
+ unsigned stream_idx = 0;
+ const u8 *hash = dentry->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))
+ {
+ stream_idx = i + 1;
hash = dentry->ads_entries[i].hash;
goto do_lookup;
}
return -ENOENT;
}
}
- hash = dentry->hash;
do_lookup:
lte = __lookup_resource(w->lookup_table, hash);
if (dentry_ret)
*dentry_ret = dentry;
if (lte_ret)
*lte_ret = lte;
- if (hash_ret)
- *hash_ret = hash;
+ if (stream_idx_ret)
+ *stream_idx_ret = stream_idx;
return 0;
}