aboutsummaryrefslogtreecommitdiff
path: root/gnu/libexec/uucp/libunix/walk.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/libexec/uucp/libunix/walk.c')
-rw-r--r--gnu/libexec/uucp/libunix/walk.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/gnu/libexec/uucp/libunix/walk.c b/gnu/libexec/uucp/libunix/walk.c
new file mode 100644
index 000000000000..ab96123127dd
--- /dev/null
+++ b/gnu/libexec/uucp/libunix/walk.c
@@ -0,0 +1,59 @@
+/* walk.c
+ Walk a directory tree. */
+
+#include "uucp.h"
+
+#include "uudefs.h"
+#include "sysdep.h"
+#include "system.h"
+
+#if HAVE_FTW_H
+#include <ftw.h>
+#endif
+
+static int iswalk_dir P((const char *zname, const struct stat *qstat,
+ int iflag));
+
+/* Walk a directory tree. */
+
+static size_t cSlen;
+static void (*puSfn) P((const char *zfull, const char *zrelative,
+ pointer pinfo));
+static pointer pSinfo;
+
+boolean
+usysdep_walk_tree (zdir, pufn, pinfo)
+ const char *zdir;
+ void (*pufn) P((const char *zfull, const char *zrelative,
+ pointer pinfo));
+ pointer pinfo;
+{
+ cSlen = strlen (zdir) + 1;
+ puSfn = pufn;
+ pSinfo = pinfo;
+ return ftw ((char *) zdir, iswalk_dir, 5) == 0;
+}
+
+/* Pass a file found in the directory tree to the system independent
+ function. */
+
+/*ARGSUSED*/
+static int
+iswalk_dir (zname, qstat, iflag)
+ const char *zname;
+ const struct stat *qstat;
+ int iflag;
+{
+ char *zcopy;
+
+ if (iflag != FTW_F)
+ return 0;
+
+ zcopy = zbufcpy (zname + cSlen);
+
+ (*puSfn) (zname, zcopy, pSinfo);
+
+ ubuffree (zcopy);
+
+ return 0;
+}