]> wimlib.net Git - wimlib/blobdiff - src/lookup_table.c
Minor cleanups
[wimlib] / src / lookup_table.c
index 364f469ed08ab7a89426d72f6d41df8868385023..f0359961604fe9e268e01dc4ec477bd13e744da3 100644 (file)
@@ -26,7 +26,7 @@
 
 #include "wimlib_internal.h"
 #include "lookup_table.h"
-#include "io.h"
+#include "buffer_io.h"
 #include <errno.h>
 
 #ifdef WITH_FUSE
@@ -39,21 +39,20 @@ struct lookup_table *new_lookup_table(size_t capacity)
        struct hlist_head *array;
 
        table = MALLOC(sizeof(struct lookup_table));
-       if (!table)
-               goto err;
-       array = CALLOC(capacity, sizeof(array[0]));
-       if (!array) {
-               FREE(table);
-               goto err;
+       if (table) {
+               array = CALLOC(capacity, sizeof(array[0]));
+               if (array) {
+                       table->num_entries = 0;
+                       table->capacity = capacity;
+                       table->array = array;
+               } else {
+                       FREE(table);
+                       table = NULL;
+                       ERROR("Failed to allocate memory for lookup table with capacity %zu",
+                             capacity);
+               }
        }
-       table->num_entries = 0;
-       table->capacity = capacity;
-       table->array = array;
        return table;
-err:
-       ERROR("Failed to allocate memory for lookup table with capacity %zu",
-             capacity);
-       return NULL;
 }
 
 struct lookup_table_entry *new_lookup_table_entry()
@@ -270,12 +269,18 @@ int for_lookup_table_entry(struct lookup_table *table,
  */
 int read_lookup_table(WIMStruct *w)
 {
-       u64    num_entries;
-       u8     buf[WIM_LOOKUP_TABLE_ENTRY_DISK_SIZE];
-       int    ret;
+       u64 num_entries;
+       u8 buf[WIM_LOOKUP_TABLE_ENTRY_DISK_SIZE];
+       int ret;
        struct lookup_table *table;
        struct lookup_table_entry *cur_entry = NULL, *duplicate_entry;
 
+       if (resource_is_compressed(&w->hdr.lookup_table_res_entry)) {
+               ERROR("Didn't expect a compressed lookup table!");
+               ERROR("Ask the author to implement support for this.");
+               return WIMLIB_ERR_COMPRESSED_LOOKUP_TABLE;
+       }
+
        DEBUG("Reading lookup table: offset %"PRIu64", size %"PRIu64"",
              w->hdr.lookup_table_res_entry.offset,
              w->hdr.lookup_table_res_entry.original_size);
@@ -635,7 +640,7 @@ void inode_resolve_ltes(struct inode *inode, struct lookup_table *table)
        /* Resolve the default file stream */
        lte = __lookup_resource(table, inode->hash);
        inode->lte = lte;
-       inode->resolved = true;
+       inode->resolved = 1;
 
        /* Resolve the alternate data streams */
        for (u16 i = 0; i < inode->num_ads; i++) {
@@ -660,7 +665,7 @@ static void inode_unresolve_ltes(struct inode *inode)
                else
                        zero_out_hash(inode->ads_entries[i].hash);
        }
-       inode->resolved = false;
+       inode->resolved = 0;
 }
 
 /* Resolve a dentry's lookup table entries
@@ -686,6 +691,24 @@ int dentry_unresolve_ltes(struct dentry *dentry, void *ignore)
        return 0;
 }
 
+/*
+ * Returns the lookup table entry for stream @stream_idx of the inode, where
+ * stream_idx = 0 means the default un-named file stream, and stream_idx >= 1
+ * corresponds to an alternate data stream.
+ *
+ * This works for both resolved and un-resolved dentries.
+ */
+struct lookup_table_entry *
+inode_stream_lte(const struct inode *inode, unsigned stream_idx,
+                const struct lookup_table *table)
+{
+       if (inode->resolved)
+               return inode_stream_lte_resolved(inode, stream_idx);
+       else
+               return inode_stream_lte_unresolved(inode, stream_idx, table);
+}
+
+
 /* Return the lookup table entry for the unnamed data stream of an inode, or
  * NULL if there is none.
  *