Open input path once using file descriptor

This commit is contained in:
Matthew Barr 2017-06-19 16:27:17 +10:00
parent 7bcb58dea0
commit 9d5a00bde1

View File

@ -42,6 +42,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#if !defined(_WIN32) #if !defined(_WIN32)
#include <dirent.h> #include <dirent.h>
#include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#else #else
// Windows support is probably very fragile // Windows support is probably very fragile
@ -145,8 +146,9 @@ bool isIgnorable(const std::string &f) {
#ifndef _WIN32 #ifndef _WIN32
void loadExpressions(const string &inPath, ExpressionMap &exprMap) { void loadExpressions(const string &inPath, ExpressionMap &exprMap) {
// Is our input path a file or a directory? // Is our input path a file or a directory?
int fd = open(inPath.c_str(), O_RDONLY);
struct stat st; struct stat st;
if (stat(inPath.c_str(), &st) != 0) { if (fstat(fd, &st) != 0) {
cerr << "Can't stat path: '" << inPath << "'" << endl; cerr << "Can't stat path: '" << inPath << "'" << endl;
exit(1); exit(1);
} }
@ -159,7 +161,7 @@ void loadExpressions(const string &inPath, ExpressionMap &exprMap) {
exit(1); exit(1);
} }
} else if (S_ISDIR(st.st_mode)) { } else if (S_ISDIR(st.st_mode)) {
DIR *d = opendir(inPath.c_str()); DIR *d = fdopendir(fd);
if (d == nullptr) { if (d == nullptr) {
cerr << "Can't open directory: '" << inPath << "'" << endl; cerr << "Can't open directory: '" << inPath << "'" << endl;
exit(1); exit(1);
@ -188,11 +190,12 @@ void loadExpressions(const string &inPath, ExpressionMap &exprMap) {
exit(1); exit(1);
} }
} }
closedir(d); (void)closedir(d);
} else { } else {
cerr << "Can't stat path: '" << inPath << "'" << endl; cerr << "Can't stat path: '" << inPath << "'" << endl;
exit(1); exit(1);
} }
(void)close(fd);
} }
#else // windows TODO: improve #else // windows TODO: improve
void HS_CDECL loadExpressions(const string &inPath, ExpressionMap &exprMap) { void HS_CDECL loadExpressions(const string &inPath, ExpressionMap &exprMap) {