diff options
Diffstat (limited to 'bin/gensquashfs/src/fstree_from_dir.c')
-rw-r--r-- | bin/gensquashfs/src/fstree_from_dir.c | 43 |
1 files changed, 12 insertions, 31 deletions
diff --git a/bin/gensquashfs/src/fstree_from_dir.c b/bin/gensquashfs/src/fstree_from_dir.c index 25a6bd7..22493c5 100644 --- a/bin/gensquashfs/src/fstree_from_dir.c +++ b/bin/gensquashfs/src/fstree_from_dir.c @@ -21,25 +21,6 @@ static sqfs_u32 clamp_timestamp(sqfs_s64 ts) return ts; } -static void discard_node(tree_node_t *root, tree_node_t *n) -{ - tree_node_t *it; - - if (n == root->data.children) { - root->data.children = n->next; - } else { - it = root->data.children; - - while (it != NULL && it->next != n) - it = it->next; - - if (it != NULL) - it->next = n->next; - } - - free(n); -} - static int scan_dir(fstree_t *fs, tree_node_t *root, dir_iterator_t *dir, scan_node_callback cb, void *user) { @@ -58,7 +39,18 @@ static int scan_dir(fstree_t *fs, tree_node_t *root, dir_iterator_t *dir, } n = fstree_get_node_by_path(fs, root, ent->name, false, true); - if (n == NULL) { + if (n == NULL) + ret = 1; + + if (ret == 0 && cb != NULL) + ret = cb(user, root, ent); + + if (ret < 0) { + free(ent); + return -1; + } + + if (ret > 0) { if (S_ISDIR(ent->mode)) dir_tree_iterator_skip(dir); free(ent); @@ -88,17 +80,6 @@ static int scan_dir(fstree_t *fs, tree_node_t *root, dir_iterator_t *dir, perror("creating tree node"); return -1; } - - ret = (cb == NULL) ? 0 : cb(user, fs, n); - - if (ret < 0) - return -1; - - if (ret > 0) { - if (S_ISDIR(n->mode)) - dir_tree_iterator_skip(dir); - discard_node(n->parent, n); - } } return 0; |