X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Flookup_table.c;h=9109c481771fa1166e85220d53dc442fef3e6ca4;hp=37d701a1e49403efc7c6387c537c13d05bf62fdd;hb=2fa590c75e9433779557999870f0c8136157c2b7;hpb=b072e7cbca1ccb874e22aa94e3efae37ce211939 diff --git a/src/lookup_table.c b/src/lookup_table.c index 37d701a1..9109c481 100644 --- a/src/lookup_table.c +++ b/src/lookup_table.c @@ -678,7 +678,8 @@ static int write_wim_lookup_table_from_stream_list(struct list_head *stream_list, struct filedes *out_fd, struct resource_entry *out_res_entry, - int write_resource_flags) + int write_resource_flags, + struct wimlib_lzx_context **comp_ctx) { size_t table_size; struct wim_lookup_table_entry *lte; @@ -712,7 +713,8 @@ write_wim_lookup_table_from_stream_list(struct list_head *stream_list, WIMLIB_COMPRESSION_TYPE_NONE, out_res_entry, NULL, - write_resource_flags); + write_resource_flags, + comp_ctx); FREE(table_buf); return ret; } @@ -803,7 +805,8 @@ write_wim_lookup_table(WIMStruct *wim, int image, int write_flags, return write_wim_lookup_table_from_stream_list(stream_list, &wim->out_fd, out_res_entry, - write_resource_flags); + write_resource_flags, + &wim->lzx_context); } @@ -1027,8 +1030,7 @@ wim_pathname_to_stream(WIMStruct *wim, return -ENOENT; } } else { - lte = inode->i_lte; - stream_idx = 0; + lte = inode_unnamed_stream_resolved(inode, &stream_idx); } out: if (dentry_ret) @@ -1167,19 +1169,28 @@ inode_stream_lte(const struct wim_inode *inode, unsigned stream_idx, } struct wim_lookup_table_entry * -inode_unnamed_lte_resolved(const struct wim_inode *inode) +inode_unnamed_stream_resolved(const struct wim_inode *inode, u16 *stream_idx_ret) { 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))) { + *stream_idx_ret = i; return inode_stream_lte_resolved(inode, i); } } + *stream_idx_ret = 0; return NULL; } +struct wim_lookup_table_entry * +inode_unnamed_lte_resolved(const struct wim_inode *inode) +{ + u16 stream_idx; + return inode_unnamed_stream_resolved(inode, &stream_idx); +} + struct wim_lookup_table_entry * inode_unnamed_lte_unresolved(const struct wim_inode *inode, const struct wim_lookup_table *table) @@ -1221,6 +1232,9 @@ inode_unnamed_lte(const struct wim_inode *inode, return inode_unnamed_lte_unresolved(inode, table); } +/* Returns the SHA1 message digest of the unnamed data stream of a WIM inode, or + * 'zero_hash' if the unnamed data stream is missing has all zeroes in its SHA1 + * message digest field. */ const u8 * inode_unnamed_stream_hash(const struct wim_inode *inode) { @@ -1233,7 +1247,7 @@ inode_unnamed_stream_hash(const struct wim_inode *inode) return hash; } } - return NULL; + return zero_hash; }