]> wimlib.net Git - wimlib/blobdiff - src/dentry.c
dentry.c: Fix broken tree traversal functions
[wimlib] / src / dentry.c
index 48b310411f2d1ed447bcd6eb19298f4ab90e01fc..cf6abec5913c0869c9dffea27a30f4f05d65bdcd 100644 (file)
@@ -250,17 +250,16 @@ int
 for_dentry_in_tree(struct wim_dentry *root,
                   int (*visitor)(struct wim_dentry*, void*), void *arg)
 {
-       int ret = 0;
+       int ret;
 
-       if (root) {
-               int ret = visitor(root, arg);
-               if (ret == 0) {
-                       ret = for_dentry_tree_in_rbtree(root->d_inode->i_children.rb_node,
-                                                       visitor,
-                                                       arg);
-               }
-       }
-       return ret;
+       if (!root)
+               return 0;
+       ret = (*visitor)(root, arg);
+       if (ret)
+               return ret;
+       return for_dentry_tree_in_rbtree(root->d_inode->i_children.rb_node,
+                                        visitor,
+                                        arg);
 }
 
 /* Like for_dentry_in_tree(), but the visitor function is always called on a
@@ -269,14 +268,15 @@ int
 for_dentry_in_tree_depth(struct wim_dentry *root,
                         int (*visitor)(struct wim_dentry*, void*), void *arg)
 {
-       int ret = 0;
-       if (root) {
-               ret = for_dentry_tree_in_rbtree_depth(root->d_inode->i_children.rb_node,
-                                                     visitor, arg);
-               if (ret == 0)
-                       ret = visitor(root, arg);
-       }
-       return ret;
+       int ret;
+
+       if (!root)
+               return 0;
+       ret = for_dentry_tree_in_rbtree_depth(root->d_inode->i_children.rb_node,
+                                             visitor, arg);
+       if (ret)
+               return ret;
+       return (*visitor)(root, arg);
 }
 
 /* Calculate the full path of @dentry.  The full path of its parent must have
@@ -499,6 +499,10 @@ get_dentry_utf16le(WIMStruct *w, const utf16lechar *path,
        const utf16lechar *p, *pp;
 
        cur_dentry = parent_dentry = wim_root_dentry(w);
+       if (!cur_dentry) {
+               errno = ENOENT;
+               return NULL;
+       }
        p = path;
        while (1) {
                while (*p == cpu_to_le16('/'))
@@ -805,6 +809,25 @@ new_dentry_with_inode(const tchar *name, struct wim_dentry **dentry_ret)
        return __new_dentry_with_inode(name, dentry_ret, false);
 }
 
+int
+new_filler_directory(const tchar *name, struct wim_dentry **dentry_ret)
+{
+       int ret;
+       struct wim_dentry *dentry;
+
+       DEBUG("Creating filler directory \"%"TS"\"", name);
+       ret = new_dentry_with_inode(name, &dentry);
+       if (ret)
+               goto out;
+       /* Leave the inode number as 0; this is allowed for non
+        * hard-linked files. */
+       dentry->d_inode->i_resolved = 1;
+       dentry->d_inode->i_attributes = FILE_ATTRIBUTE_DIRECTORY;
+       *dentry_ret = dentry;
+       ret = 0;
+out:
+       return ret;
+}
 
 static int
 init_ads_entry(struct wim_ads_entry *ads_entry, const void *name,