]> wimlib.net Git - wimlib/blobdiff - src/dentry.c
add_params: Embed inode table and sd_set directly
[wimlib] / src / dentry.c
index 48b310411f2d1ed447bcd6eb19298f4ab90e01fc..6e13d3d697838ca681bd92b35ffd2b6e3763ac02 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,
@@ -1278,11 +1301,6 @@ replace_forbidden_characters(utf16lechar *name)
                if (*p == cpu_to_le16('/'))
        #endif
                {
-               #ifdef __WIN32__
-                       *p = cpu_to_le16(0xfffd);
-               #else
-                       *p = cpu_to_le16('?');
-               #endif
                        if (name) {
                                WARNING("File, directory, or stream name \"%"WS"\"\n"
                                        "          contains forbidden characters; "
@@ -1290,6 +1308,11 @@ replace_forbidden_characters(utf16lechar *name)
                                        name);
                                name = NULL;
                        }
+               #ifdef __WIN32__
+                       *p = cpu_to_le16(0xfffd);
+               #else
+                       *p = cpu_to_le16('?');
+               #endif
                }
        }
 }