struct wim_inode *inode = dentry->d_inode;
struct wim_lookup_table *lookup_table = _lookup_table;
struct wim_lookup_table_entry *lte;
+ int ret;
- inode_resolve_ltes(inode, lookup_table);
+ ret = inode_resolve_ltes(inode, lookup_table);
+ if (ret)
+ return ret;
for (unsigned i = 0; i <= inode->i_num_ads; i++) {
lte = inode_stream_lte_resolved(inode, i);
if (lte)
return 0;
}
-static void
+static int
find_streams_for_extraction(struct wim_dentry *root,
struct list_head *stream_list,
struct wim_lookup_table *lookup_table,
int extract_flags)
{
struct find_streams_ctx ctx;
+ int ret;
INIT_LIST_HEAD(&ctx.stream_list);
ctx.extract_flags = extract_flags;
- for_dentry_in_tree(root, dentry_resolve_and_zero_lte_refcnt, lookup_table);
+ ret = for_dentry_in_tree(root, dentry_resolve_and_zero_lte_refcnt, lookup_table);
+ if (ret)
+ return ret;
for_dentry_in_tree(root, dentry_find_streams_to_extract, &ctx);
list_transfer(&ctx.stream_list, stream_list);
+ return 0;
}
struct apply_operations {
extract_dentry_to_stdout(struct wim_dentry *dentry)
{
int ret = 0;
- if (!dentry_is_regular_file(dentry)) {
+ if (dentry->d_inode->i_attributes & (FILE_ATTRIBUTE_REPARSE_POINT |
+ FILE_ATTRIBUTE_DIRECTORY))
+ {
ERROR("\"%"TS"\" is not a regular file and therefore cannot be "
- "extracted to standard output", dentry->_full_path);
+ "extracted to standard output", dentry_full_path(dentry));
ret = WIMLIB_ERR_NOT_A_REGULAR_FILE;
} else {
struct wim_lookup_table_entry *lte;
static int
dentry_reset_needs_extraction(struct wim_dentry *dentry, void *_ignore)
{
+ struct wim_inode *inode = dentry->d_inode;
+
dentry->needs_extraction = 0;
dentry->not_extracted = 0;
- dentry->is_win32_name = 0;
- dentry->d_inode->i_visited = 0;
- dentry->d_inode->i_dos_name_extracted = 0;
- FREE(dentry->d_inode->i_extracted_file);
- dentry->d_inode->i_extracted_file = NULL;
+ inode->i_visited = 0;
+ inode->i_dos_name_extracted = 0;
+ FREE(inode->i_extracted_file);
+ inode->i_extracted_file = NULL;
if ((void*)dentry->extraction_name != (void*)dentry->file_name)
FREE(dentry->extraction_name);
dentry->extraction_name = NULL;
goto out_dentry_reset_needs_extraction;
/* Build a list of the streams that need to be extracted */
- find_streams_for_extraction(root,
- &stream_list,
- wim->lookup_table, extract_flags);
+ ret = find_streams_for_extraction(root,
+ &stream_list,
+ wim->lookup_table, extract_flags);
+ if (ret)
+ goto out_dentry_reset_needs_extraction;
/* Calculate the number of bytes of data that will be extracted */
calculate_bytes_to_extract(&stream_list, extract_flags,