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);