]> wimlib.net Git - wimlib/blobdiff - include/wimlib/lookup_table.h
wimlib_mount_image(): Correctly handle unnamed stream in ADS entries
[wimlib] / include / wimlib / lookup_table.h
index 28862d5a3b9b753ea53e88c87881f923bfe38782..6a14daaa549c9f0c967c656ae7f6d9ad4318855e 100644 (file)
@@ -163,6 +163,12 @@ struct wim_lookup_table_entry {
         * resource is read again.  */
        u16 dont_check_metadata_hash : 1;
 
+       /* Only used during WIM write.  Normal value is 0 (resource not
+        * filtered).  */
+       u16 filtered : 2;
+#define FILTERED_SAME_WIM      0x1  /* Resource already in same WIM  */
+#define FILTERED_EXTERNAL_WIM  0x2  /* Resource already in external WIM  */
+
        /* (On-disk field)
         * Number of times this lookup table entry is referenced by dentries.
         * Unfortunately, this field is not always set correctly in Microsoft's
@@ -298,12 +304,6 @@ wim_resource_chunks(const struct wim_lookup_table_entry *lte)
        return DIV_ROUND_UP(wim_resource_size(lte), WIM_CHUNK_SIZE);
 }
 
-static inline u64
-wim_resource_compressed_size(const struct wim_lookup_table_entry *lte)
-{
-       return lte->resource_entry.size;
-}
-
 static inline int
 wim_resource_compression_type(const struct wim_lookup_table_entry *lte)
 {
@@ -375,7 +375,8 @@ for_lookup_table_entry(struct wim_lookup_table *table,
                       void *arg);
 
 extern int
-cmp_streams_by_wim_position(const void *p1, const void *p2);
+sort_stream_list_by_sequential_order(struct list_head *stream_list,
+                                    size_t list_head_offset);
 
 extern int
 for_lookup_table_entry_pos_sorted(struct wim_lookup_table *table,
@@ -384,12 +385,14 @@ for_lookup_table_entry_pos_sorted(struct wim_lookup_table *table,
                                  void *arg);
 
 extern struct wim_lookup_table_entry *
-__lookup_resource(const struct wim_lookup_table *table, const u8 hash[]);
+lookup_resource(const struct wim_lookup_table *table, const u8 hash[]);
 
 extern int
-lookup_resource(WIMStruct *wim, const tchar *path,
-               int lookup_flags, struct wim_dentry **dentry_ret,
-               struct wim_lookup_table_entry **lte_ret, u16 *stream_idx_ret);
+wim_pathname_to_stream(WIMStruct *wim, const tchar *path,
+                      int lookup_flags,
+                      struct wim_dentry **dentry_ret,
+                      struct wim_lookup_table_entry **lte_ret,
+                      u16 *stream_idx_ret);
 
 extern void
 lte_decrement_refcnt(struct wim_lookup_table_entry *lte,
@@ -415,6 +418,9 @@ extern int
 inode_resolve_ltes(struct wim_inode *inode, struct wim_lookup_table *table,
                   bool force);
 
+extern int
+resource_not_found_error(const struct wim_inode *inode, const u8 *hash);
+
 extern void
 inode_unresolve_ltes(struct wim_inode *inode);
 
@@ -438,9 +444,9 @@ inode_stream_lte_unresolved(const struct wim_inode *inode, unsigned stream_idx,
        if (!table)
                return NULL;
        if (stream_idx == 0)
-               return __lookup_resource(table, inode->i_hash);
+               return lookup_resource(table, inode->i_hash);
        else
-               return __lookup_resource(table,
+               return lookup_resource(table,
                                         inode->i_ads_entries[
                                                stream_idx - 1].hash);
 }
@@ -498,6 +504,9 @@ inode_stream_name_nbytes(const struct wim_inode *inode, unsigned stream_idx)
                return inode->i_ads_entries[stream_idx - 1].stream_name_nbytes;
 }
 
+extern struct wim_lookup_table_entry *
+inode_unnamed_stream_resolved(const struct wim_inode *inode, u16 *stream_idx_ret);
+
 extern struct wim_lookup_table_entry *
 inode_unnamed_lte_resolved(const struct wim_inode *inode);
 
@@ -508,6 +517,9 @@ inode_unnamed_lte_unresolved(const struct wim_inode *inode,
 extern struct wim_lookup_table_entry *
 inode_unnamed_lte(const struct wim_inode *inode, const struct wim_lookup_table *table);
 
+extern const u8 *
+inode_unnamed_stream_hash(const struct wim_inode *inode);
+
 extern u64
 lookup_table_total_stream_size(struct wim_lookup_table *table);