summaryrefslogtreecommitdiffstats
path: root/lib/libc/gen/fts-compat.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1997-03-11 11:52:33 +0000
committerpeter <peter@FreeBSD.org>1997-03-11 11:52:33 +0000
commit0b3e1277b4e3cc3bb2575162ec238cac00b15a18 (patch)
tree30be23b5b8ddeb71e0495f1655cf455ef58c410f /lib/libc/gen/fts-compat.c
parent9234fe208b22e039265244d8a518ff096d630a44 (diff)
downloadFreeBSD-src-0b3e1277b4e3cc3bb2575162ec238cac00b15a18.zip
FreeBSD-src-0b3e1277b4e3cc3bb2575162ec238cac00b15a18.tar.gz
Merge from Lite2:
filesystem include updates, duplicate group suppression, cleanups, filesystem whiteout support (unionfs), bidir popen().
Diffstat (limited to 'lib/libc/gen/fts-compat.c')
-rw-r--r--lib/libc/gen/fts-compat.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/lib/libc/gen/fts-compat.c b/lib/libc/gen/fts-compat.c
index 8de23df..e532707 100644
--- a/lib/libc/gen/fts-compat.c
+++ b/lib/libc/gen/fts-compat.c
@@ -32,7 +32,7 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)fts.c 8.4 (Berkeley) 4/16/94";
+static char sccsid[] = "@(#)fts.c 8.6 (Berkeley) 8/14/94";
#endif /* LIBC_SCCS and not lint */
#include <sys/param.h>
@@ -556,7 +556,7 @@ fts_build(sp, type)
FTSENT *cur, *tail;
DIR *dirp;
void *adjaddr;
- int cderrno, descend, len, level, maxlen, nlinks, saved_errno;
+ int cderrno, descend, len, level, maxlen, nlinks, oflag, saved_errno;
char *cp;
/* Set current node pointer. */
@@ -566,7 +566,15 @@ fts_build(sp, type)
* Open the directory for reading. If this fails, we're done.
* If being called from fts_read, set the fts_info field.
*/
- if ((dirp = opendir(cur->fts_accpath)) == NULL) {
+#ifdef FTS_WHITEOUT
+ if (ISSET(FTS_WHITEOUT))
+ oflag = DTF_NODUP|DTF_REWIND;
+ else
+ oflag = DTF_HIDEW|DTF_NODUP|DTF_REWIND;
+#else
+#define __opendir2(path, flag) opendir(path)
+#endif
+ if ((dirp = __opendir2(cur->fts_accpath, oflag)) == NULL) {
if (type == BREAD) {
cur->fts_info = FTS_DNR;
cur->fts_errno = errno;
@@ -671,6 +679,11 @@ mem1: saved_errno = errno;
p->fts_parent = sp->fts_cur;
p->fts_level = level;
+#ifdef FTS_WHITEOUT
+ if (dp->d_type == DT_WHT)
+ p->fts_flags |= FTS_ISW;
+#endif
+
if (cderrno) {
if (nlinks) {
p->fts_info = FTS_NS;
@@ -775,6 +788,17 @@ fts_stat(sp, p, follow)
/* If user needs stat info, stat buffer already allocated. */
sbp = ISSET(FTS_NOSTAT) ? &sb : p->fts_statp;
+#ifdef FTS_WHITEOUT
+ /* check for whiteout */
+ if (p->fts_flags & FTS_ISW) {
+ if (sbp != &sb) {
+ memset(sbp, '\0', sizeof (*sbp));
+ sbp->st_mode = S_IFWHT;
+ }
+ return (FTS_W);
+ }
+#endif
+
/*
* If doing a logical walk, or application requested FTS_FOLLOW, do
* a stat(2). If that fails, check for a non-existent symlink. If
OpenPOWER on IntegriCloud