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
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
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('/'))
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,