Changeset 5999


Ignore:
Timestamp:
Apr 28, 2018, 4:35:04 PM (12 months ago)
Author:
cameron
Message:

Handling of file system errors

Location:
icGREP/icgrep-devel/icgrep
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/grep/grep_engine.cpp

    r5998 r5999  
    583583//  differently based on the engine type.
    584584
     585bool canMMap(const std::string & fileName) {
     586    if (fileName == "-") return false;
     587    namespace fs = boost::filesystem;
     588    fs::path p(fileName);
     589    boost::system::error_code errc;
     590    fs::file_status s = fs::status(p, errc);
     591    return !errc && is_regular_file(s);
     592}
     593
     594
    585595uint64_t GrepEngine::doGrep(const std::string & fileName, std::ostringstream & strm) {
    586596    typedef uint64_t (*GrepFunctionType)(bool useMMap, int32_t fileDescriptor, intptr_t callback_addr);
    587     using namespace boost::filesystem;
    588     path p(fileName);
    589     bool useMMap = mPreferMMap;
    590     if (p == "-") useMMap = false;
    591     if (!is_regular_file(p)) useMMap = false;
     597    bool useMMap = mPreferMMap && canMMap(fileName);
    592598
    593599    auto f = reinterpret_cast<GrepFunctionType>(mGrepDriver->getMain());
     
    634640uint64_t EmitMatchesEngine::doGrep(const std::string & fileName, std::ostringstream & strm) {
    635641    typedef uint64_t (*GrepFunctionType)(bool useMMap, int32_t fileDescriptor, intptr_t accum_addr);
    636     using namespace boost::filesystem;
    637     path p(fileName);
    638     bool useMMap = mPreferMMap;
    639     if (p == "-") useMMap = false;
    640     if (!is_regular_file(p)) useMMap = false;
     642    bool useMMap = mPreferMMap && canMMap(fileName);
    641643    auto f = reinterpret_cast<GrepFunctionType>(mGrepDriver->getMain());
    642644    int32_t fileDescriptor = openFile(fileName, strm);
  • icGREP/icgrep-devel/icgrep/grep_interface.cpp

    r5992 r5999  
    124124        clEnumValN(QuietMode, "silent", "Alias for -q")
    125125        CL_ENUM_VAL_SENTINEL), cl::cat(Output_Options), cl::Grouping, cl::location(Mode), cl::init(NormalMode));
    126 
    127 bool NoMessagesFlag;
    128 static cl::opt<bool, true> NoMessagesOption("s", cl::location(NoMessagesFlag), cl::desc("Suppress messages for file errors."), cl::cat(Output_Options), cl::Grouping);
    129 static cl::alias NoMessagesAlias("no-messages", cl::desc("Alias for -s"), cl::aliasopt(NoMessagesOption));
    130126
    131127bool WithFilenameFlag;
     
    262258        llvm::report_fatal_error("Sorry, -color is not yet supported.\n");
    263259    }
    264     if (Mode == QuietMode) {
    265         NoMessagesFlag = true;
    266     }
    267260    if ((Mode == QuietMode) | (Mode == FilesWithMatch) | (Mode == FilesWithoutMatch)) {
    268261        MaxCountFlag = 1;
  • icGREP/icgrep-devel/icgrep/grep_interface.h

    r5992 r5999  
    6868extern ColoringType ColorFlag;
    6969
    70 extern bool NoMessagesFlag; // -s  (also set by QuietMode/-q)
    7170extern bool WithFilenameFlag; // -H
    7271extern bool NoFilenameFlag; // -h
  • icGREP/icgrep-devel/icgrep/util/file_select.cpp

    r5997 r5999  
    3030static cl::OptionCategory Input_Options("File Selection Options", "These options control the input sources.");
    3131
     32bool NoMessagesFlag;
     33static cl::opt<bool, true> NoMessagesOption("s", cl::location(NoMessagesFlag), cl::desc("Suppress messages for file errors."), cl::cat(Input_Options), cl::Grouping);
     34static cl::alias NoMessagesAlias("no-messages", cl::desc("Alias for -s"), cl::aliasopt(NoMessagesOption));
     35
    3236bool RecursiveFlag;
    3337static cl::opt<bool, true> RecursiveOption("r", cl::location(RecursiveFlag), cl::desc("Recursively process files within directories, (but follow only top-level symlinks unless -R)."), cl::cat(Input_Options), cl::Grouping);
     
    192196    }
    193197}
     198
     199
     200
    194201   
    195202std::vector<fs::path> getFullFileList(cl::list<std::string> & inputFiles) {
     
    212219            }
    213220            fs::path p(f);
     221            errs() << "path: " << p.string() << "\n";
     222            fs::file_status s = fs::status(p, errc);
    214223            if (errc) {
    215224                // If there was an error, we leave the file in the fileCandidates
    216225                // list for later error processing.
    217                 collectedPaths.push_back(p);
    218             } else if (fs::is_directory(p)) {
     226                if (!NoMessagesFlag) collectedPaths.push_back(p);
     227            } else if (fs::is_directory(s)) {
    219228                if (DirectoriesFlag == Read) {
    220229                    collectedPaths.push_back(p);
    221230                }
    222             } else if (fs::is_regular_file(p)) {
     231            } else if (fs::is_regular_file(s)) {
    223232                collectedPaths.push_back(p);
    224233            } else {
     
    250259        }
    251260        fs::path p(f);
     261        fs::file_status s = fs::status(p, errc);
    252262        if (errc) {
    253263            // If there was an error, we leave the file in the fileCandidates
    254264            // list for later error processing.
    255             fileCandidates.addSearchCandidate(p.c_str());
    256         } else if (fs::is_directory(p)) {
     265            if (!NoMessagesFlag) fileCandidates.addSearchCandidate(p.c_str());
     266        } else if (fs::is_directory(s)) {
    257267            if (DirectoriesFlag == Recurse) {
    258268                dirCandidates.addSearchCandidate(p.c_str());
     
    260270                fileCandidates.addSearchCandidate(p.c_str());
    261271            }
    262         } else if (fs::is_regular_file(p)) {
     272        } else if (fs::is_regular_file(s)) {
    263273            fileCandidates.addSearchCandidate(p.c_str());
    264274        } else {
     
    309319                    // If we cannot enter the directory, keep it in the list of files,
    310320                    // for possible error reporting.
    311                     fileCandidates.addSearchCandidate(dirpath.filename().c_str());
     321                    if (!NoMessagesFlag) fileCandidates.addSearchCandidate(dirpath.filename().c_str());
    312322                    continue;
    313323                }
    314324                while (di != di_end) {
    315325                    auto & e = di->path();
    316                     if (fs::is_directory(e)) {
    317                         if (fs::is_symlink(e) && !DereferenceRecursiveFlag) {
     326                    fs::file_status s = fs::status(e, errc);
     327                    if (errc) {
     328                        // If there was an error, we leave the file in the fileCandidates
     329                        // list for later error processing.
     330                        if (!NoMessagesFlag) fileCandidates.addSearchCandidate(e.filename().c_str());
     331                    } else if (fs::is_directory(s)) {
     332                        if (fs::is_symlink(s) && !DereferenceRecursiveFlag) {
    318333                            di.increment(errc);
    319334                            continue;
    320335                        }
    321336                        subdirCandidates.addSearchCandidate(e.filename().c_str());
    322                     } else if (fs::is_regular_file(e)) {
     337                    } else if (fs::is_regular_file(s)) {
    323338                        fileCandidates.addSearchCandidate(e.filename().c_str());
    324339                    } else {
  • icGREP/icgrep-devel/icgrep/util/file_select.h

    r5964 r5999  
    2020namespace argv {
    2121
     22extern bool NoMessagesFlag;  // -s
     23   
    2224enum DevDirAction {Read, Skip, Recurse};
    2325extern DevDirAction DevicesFlag;
Note: See TracChangeset for help on using the changeset viewer.