diff options
author | jilles <jilles@FreeBSD.org> | 2012-07-25 21:59:10 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2012-07-25 21:59:10 +0000 |
commit | 06d71385564614c8f19a2407e234e9f2ea142750 (patch) | |
tree | 9e7e20bd4ba232a68faf9db468bc5fe8597aae6e /usr.bin/find/find.c | |
parent | 9a57e402a6d1d149388a8af3ffce132e6ea9d0dc (diff) | |
download | FreeBSD-src-06d71385564614c8f19a2407e234e9f2ea142750.zip FreeBSD-src-06d71385564614c8f19a2407e234e9f2ea142750.tar.gz |
find: Implement real -ignore_readdir_race.
If -ignore_readdir_race is present, [ENOENT] errors caused by deleting a
file after find has read its name from a directory are ignored.
Formerly, -ignore_readdir_race did nothing.
PR: bin/169723
Submitted by: Valery Khromov and Andrey Ignatov
Diffstat (limited to 'usr.bin/find/find.c')
-rw-r--r-- | usr.bin/find/find.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/usr.bin/find/find.c b/usr.bin/find/find.c index 3e0921e..8ad76c1 100644 --- a/usr.bin/find/find.c +++ b/usr.bin/find/find.c @@ -197,8 +197,12 @@ find_execute(PLAN *plan, char *paths[]) continue; break; case FTS_DNR: - case FTS_ERR: case FTS_NS: + if (ignore_readdir_race && + entry->fts_errno == ENOENT && entry->fts_level > 0) + continue; + /* FALLTHROUGH */ + case FTS_ERR: (void)fflush(stdout); warnx("%s: %s", entry->fts_path, strerror(entry->fts_errno)); @@ -228,7 +232,7 @@ find_execute(PLAN *plan, char *paths[]) for (p = plan; p && (p->execute)(p, entry); p = p->next); } finish_execplus(); - if (errno) + if (errno && (!ignore_readdir_race || errno != ENOENT)) err(1, "fts_read"); return (rval); } |