return (dentry_correct_length_unaligned(dentry) + 7) & ~7;
}
-/* Return %true iff @dentry has the UTF-8 file name @name that has length
- * @name_len bytes. */
-static bool dentry_has_name(const struct dentry *dentry, const char *name,
- size_t name_len)
-{
- if (dentry->file_name_utf8_len != name_len)
- return false;
- return memcmp(dentry->file_name_utf8, name, name_len) == 0;
-}
-
/* Return %true iff the alternate data stream entry @entry has the UTF-8 stream
* name @name that has length @name_len bytes. */
static inline bool ads_entry_has_name(const struct ads_entry *entry,
return 0;
}
+/*#define RECURSIVE_FOR_DENTRY_IN_TREE*/
+
+#ifdef RECURSIVE_FOR_DENTRY_IN_TREE
+static int for_dentry_tree_in_rbtree(struct rb_node *node,
+ int (*visitor)(struct dentry*, void*),
+ void *arg)
+{
+ int ret;
+ if (node) {
+ ret = for_dentry_tree_in_rbtree(node->rb_left, visitor, arg);
+ if (ret != 0)
+ return ret;
+ ret = for_dentry_in_tree(rbnode_dentry(node), visitor, arg);
+ if (ret != 0)
+ return ret;
+ ret = for_dentry_tree_in_rbtree(node->rb_right, visitor, arg);
+ if (ret != 0)
+ return ret;
+ }
+ return 0;
+}
+#endif
+
/*
* Calls a function on all directory entries in a WIM dentry tree. Logically,
* this is a pre-order traversal (the function is called on a parent dentry
int for_dentry_in_tree(struct dentry *root,
int (*visitor)(struct dentry*, void*), void *arg)
{
+#ifdef RECURSIVE_FOR_DENTRY_IN_TREE
+ int ret = visitor(root, arg);
+ if (ret != 0)
+ return ret;
+ return for_dentry_tree_in_rbtree(root->d_inode->children.rb_node, visitor, arg);
+#else
int ret;
struct list_head main_stack;
struct list_head sibling_stack;
if (ret != 0) {
// Failed. Restore parent pointers for the
// dentries in the main stack
- list_del(&root->tmp_list);
list_for_each_entry(dentry, &main_stack, tmp_list) {
dentry->parent = container_of(dentry->tmp_list.next,
struct dentry,
main_dentry = dentry;
node = main_dentry->d_inode->children.rb_node;
- } else {
+ } else {
node = dentry->rb_node.rb_right;
}
}
out:
root->parent = root;
return ret;
+#endif
}
/*
}
}
-static int compare_names(const char *name_1, size_t len_1,
- const char *name_2, size_t len_2)
+static int compare_names(const char *name_1, u16 len_1,
+ const char *name_2, u16 len_2)
{
- if (len_1 < len_2)
- return -1;
- else if (len_1 > len_2)
- return 1;
- else
- return memcmp(name_1, name_2, len_1);
+ int result = strncasecmp(name_1, name_2, min(len_1, len_2));
+ if (result) {
+ return result;
+ } else {
+ return (int)len_1 - (int)len_2;
+ }
}
static int dentry_compare_names(const struct dentry *d1, const struct dentry *d2)
inode->link_count = 1;
#ifdef WITH_FUSE
inode->next_stream_id = 1;
+ if (pthread_mutex_init(&inode->i_mutex, NULL) != 0) {
+ ERROR_WITH_ERRNO("Error initializing mutex");
+ FREE(inode);
+ return NULL;
+ }
#endif
INIT_LIST_HEAD(&inode->dentry_list);
}
#ifdef WITH_FUSE
wimlib_assert(inode->num_opened_fds == 0);
FREE(inode->fds);
+ pthread_mutex_destroy(&inode->i_mutex);
#endif
FREE(inode->extracted_file);
FREE(inode);
struct dentry *dentry)
{
u64 cur_offset = dentry->subdir_offset;
- struct dentry *prev_child = NULL;
- struct dentry *first_child = NULL;
struct dentry *child;
struct dentry cur_child;
int ret;