From 6d82d83037fa0926da7461f700870a73afcaf7f2 Mon Sep 17 00:00:00 2001 From: Jean-Francois Dockes Date: Fri, 14 Oct 2011 14:05:33 +0200 Subject: [PATCH] make all ENOENT errors non-fatal: files and dirs disappear. Reset error string when it is retrieved to avoid accumulating memory in long-running programs --- src/utils/fstreewalk.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/utils/fstreewalk.cpp b/src/utils/fstreewalk.cpp index 64770ff0..9b916741 100644 --- a/src/utils/fstreewalk.cpp +++ b/src/utils/fstreewalk.cpp @@ -99,7 +99,10 @@ void FsTreeWalker::setOpts(Options opts, int depthswitch) string FsTreeWalker::getReason() { - return data->reason.str(); + string reason = data->reason.str(); + data->reason.str(string()); + data->errors = 0; + return reason; } int FsTreeWalker::getErrCnt() @@ -198,8 +201,10 @@ FsTreeWalker::Status FsTreeWalker::walk(const string& _top, struct stat st; // We always follow symlinks at this point. Makes more sense. if (stat(top.c_str(), &st) == -1) { + // Note that we do not return an error if the stat call + // fails. A temp file may have gone away. data->logsyserr("stat", top); - return FtwError; + return errno == ENOENT ? FtwOk : FtwError; } // Recursive version, using the call stack to store state. iwalk @@ -259,7 +264,7 @@ FsTreeWalker::Status FsTreeWalker::walk(const string& _top, if (!nfather.empty()) { if (stat(nfather.c_str(), &st) == -1) { data->logsyserr("stat", nfather); - return FtwError; + return errno == ENOENT ? FtwOk : FtwError; } if ((status = cb.processone(nfather, &st, FtwDirReturn)) & (FtwStop|FtwError)) { @@ -269,7 +274,7 @@ FsTreeWalker::Status FsTreeWalker::walk(const string& _top, if (stat(dir.c_str(), &st) == -1) { data->logsyserr("stat", dir); - return FtwError; + return errno == ENOENT ? FtwOk : FtwError; } // iwalk will not recurse in this case, just process file entries // and append subdir entries to the list. @@ -326,6 +331,7 @@ FsTreeWalker::Status FsTreeWalker::iwalk(const string &top, switch (errno) { case EPERM: case EACCES: + case ENOENT: goto out; default: status = FtwError;