[Toybox] [PATCH 2/5] lib: Add dirtree_for_each().

Georgi Chorbadzhiyski gf at unixsol.org
Wed Mar 7 00:15:57 PST 2012


---
 lib/dirtree.c |   32 ++++++++++++++++++++++++++++++++
 lib/lib.h     |    1 +
 2 files changed, 33 insertions(+), 0 deletions(-)

diff --git a/lib/dirtree.c b/lib/dirtree.c
index efdb2e6..9260731 100644
--- a/lib/dirtree.c
+++ b/lib/dirtree.c
@@ -87,4 +87,36 @@ struct dirtree *dirtree_read(char *path, struct dirtree *parent, void *cb_param,
 	return dtroot;
 }
 
+static int dirtree_node(char *path, struct dirtree *node, void *cb_param)
+{
+	char *s = path + strlen(path);
+	struct dirtree *n = node;
+	int (*callback)(char *path) = cb_param;
+
+	for ( ; ; n = n->parent) {
+		while (s!=path) {
+			if (*(--s) == '/') break;
+		}
+		if (!n) break;
+	}
+	if (s != path) s++;
+
+	callback(s);
 
+	return 0;
+}
+
+void dirtree_for_each(char *path, int (*callback)(char *path))
+{
+	struct stat sb;
+	if (stat(path, &sb) == -1) {
+		perror_msg("%s", path);
+		return;
+	}
+	callback(path);
+	if (S_ISDIR(sb.st_mode)) {
+		strncpy(toybuf, path, sizeof(toybuf) - 1);
+		toybuf[sizeof(toybuf) - 1] = 0;
+		dirtree_read(toybuf, NULL, callback, dirtree_node);
+	}
+}
diff --git a/lib/lib.h b/lib/lib.h
index f0d15fc..be5543f 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -51,6 +51,7 @@ struct dirtree {
 struct dirtree *dirtree_add_node(char *path);
 struct dirtree *dirtree_read(char *path, struct dirtree *parent, void *cb_param,
                     int (*callback)(char *path, struct dirtree *node, void *param));
+void dirtree_for_each(char *path, int (*callback)(char *path));
 
 // lib.c
 void xstrcpy(char *dest, char *src, size_t size);
-- 
1.7.5.1




More information about the Toybox mailing list