From 5330de20b3df5cd88f683e95149490e8ec6df377 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Tue, 31 Jan 2023 03:18:47 -0600 Subject: [PATCH] Helps to check in the dirtree changes. (Oops.) --- lib/dirtree.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/dirtree.c b/lib/dirtree.c index 32788d38..98932a07 100644 --- a/lib/dirtree.c +++ b/lib/dirtree.c @@ -136,7 +136,7 @@ static struct dirtree *dirtree_handle_callback(struct dirtree *new, } // Free node that didn't request saving and has no saved children. - if (!new->child && !(flags & DIRTREE_SAVE)) { + if (!new->child && !(flags & DIRTREE_SAVE) && (!new->parent || !(new->parent->again&DIRTREE_BREADTH))) { free(new); new = 0; } @@ -150,7 +150,7 @@ static struct dirtree *dirtree_handle_callback(struct dirtree *new, int dirtree_recurse(struct dirtree *node, int (*callback)(struct dirtree *node), int dirfd, int flags) { - struct dirtree *new = 0, **ddt = &(node->child); + struct dirtree *new = 0, *next, **ddt = &(node->child); struct dirent *entry; DIR *dir = 0; @@ -169,16 +169,16 @@ int dirtree_recurse(struct dirtree *node, // Iterate through stored entries, if any if (callback && *ddt) while (*ddt) { - if (!(new = dirtree_handle_callback(*ddt, callback))) { - new = *ddt; - ddt = &((*ddt)->next); - free(new); - } else if (new == DIRTREE_ABORTVAL) goto done; + next = (*ddt)->next; + if (!(new = dirtree_handle_callback(*ddt, callback))) *ddt = next; + else if (new == DIRTREE_ABORTVAL) goto done; + else ddt = &new->next; // according to the fddir() man page, the filehandle in the DIR * can still // be externally used by things that don't lseek() it. } else while ((entry = readdir(dir))) { if ((flags&DIRTREE_PROC) && !isdigit(*entry->d_name)) continue; + if ((flags&DIRTREE_BREADTH) && isdotdot(entry->d_name)) continue; if (!(new = dirtree_add_node(node, entry->d_name, flags))) continue; if (!new->st.st_blksize && !new->st.st_mode) new->st.st_mode = entry->d_type<<12; @@ -187,6 +187,7 @@ int dirtree_recurse(struct dirtree *node, if (new) { *ddt = new; ddt = &((*ddt)->next); + if (flags&DIRTREE_BREADTH) node->extra++; } } -- 2.39.2