22 #include <sys/types.h>
27 static bool IsFile(
const std::string &Path,
const DWORD &FileAttributes) {
29 if (FileAttributes & FILE_ATTRIBUTE_NORMAL)
32 if (FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
36 CreateFileA(Path.c_str(), 0, FILE_SHARE_READ, NULL, OPEN_EXISTING,
37 FILE_FLAG_BACKUP_SEMANTICS, 0));
39 if (FileHandle == INVALID_HANDLE_VALUE) {
40 Printf(
"CreateFileA() failed for \"%s\" (Error code: %lu).\n", Path.c_str(),
47 if (FileType == FILE_TYPE_UNKNOWN) {
48 Printf(
"GetFileType() failed for \"%s\" (Error code: %lu).\n", Path.c_str(),
50 CloseHandle(FileHandle);
54 if (FileType != FILE_TYPE_DISK) {
55 CloseHandle(FileHandle);
59 CloseHandle(FileHandle);
63 bool IsFile(
const std::string &Path) {
64 DWORD Att = GetFileAttributesA(Path.c_str());
66 if (Att == INVALID_FILE_ATTRIBUTES) {
67 Printf(
"GetFileAttributesA() failed for \"%s\" (Error code: %lu).\n",
68 Path.c_str(), GetLastError());
76 std::vector<std::string> *V,
bool TopDir) {
79 if (
E && *Epoch >=
E)
return;
81 std::string Path(Dir);
83 if (Path.back() !=
'\\')
88 WIN32_FIND_DATAA FindInfo;
89 HANDLE FindHandle(FindFirstFileA(Path.c_str(), &FindInfo));
90 if (FindHandle == INVALID_HANDLE_VALUE)
92 Printf(
"No file found in: %s.\n", Dir.c_str());
97 std::string FileName =
DirPlusFile(Dir, FindInfo.cFileName);
99 if (FindInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
100 size_t FilenameLen = strlen(FindInfo.cFileName);
101 if ((FilenameLen == 1 && FindInfo.cFileName[0] ==
'.') ||
102 (FilenameLen == 2 && FindInfo.cFileName[0] ==
'.' &&
103 FindInfo.cFileName[1] ==
'.'))
108 else if (
IsFile(FileName, FindInfo.dwFileAttributes))
109 V->push_back(FileName);
110 }
while (FindNextFileA(FindHandle, &FindInfo));
112 DWORD LastError = GetLastError();
113 if (LastError != ERROR_NO_MORE_FILES)
114 Printf(
"FindNextFileA failed (Error code: %lu).\n", LastError);
116 FindClose(FindHandle);
127 return _fdopen(Fd, Mode);
139 _unlink(Path.c_str());
142 static bool IsSeparator(
char C) {
143 return C ==
'\\' || C ==
'/';
148 static size_t ParseDrive(
const std::string &FileName,
const size_t Offset,
149 bool Relative =
true) {
150 if (Offset + 1 >= FileName.size() || FileName[Offset + 1] !=
':')
152 if (Offset + 2 >= FileName.size() || !IsSeparator(FileName[Offset + 2])) {
163 static size_t ParseFileName(
const std::string &FileName,
const size_t Offset) {
165 const size_t End = FileName.size();
166 for(; Pos < End && !IsSeparator(FileName[Pos]); ++Pos)
173 static size_t ParseDir(
const std::string &FileName,
const size_t Offset) {
175 const size_t End = FileName.size();
176 if (Pos >= End || IsSeparator(FileName[Pos]))
178 for(; Pos < End && !IsSeparator(FileName[Pos]); ++Pos)
188 static size_t ParseServerAndShare(
const std::string &FileName,
189 const size_t Offset) {
191 if (!(Res = ParseDir(FileName, Pos)))
194 if (!(Res = ParseDir(FileName, Pos)))
203 static size_t ParseCustomString(
const std::string &Ref,
size_t Offset,
205 size_t Len = strlen(Patt);
206 if (Offset + Len > Ref.size())
208 return Ref.compare(Offset, Len, Patt) == 0 ? Len : 0;
214 static size_t ParseLocation(
const std::string &FileName) {
217 if ((Res = ParseCustomString(FileName, Pos, R
"(\\?\)"))) {
219 if ((Res = ParseCustomString(FileName, Pos, R
"(UNC\)"))) {
221 if ((Res = ParseServerAndShare(FileName, Pos)))
225 if ((Res = ParseDrive(FileName, Pos,
false)))
230 if (Pos < FileName.size() && IsSeparator(FileName[Pos])) {
232 if (Pos < FileName.size() && IsSeparator(FileName[Pos])) {
234 if ((Res = ParseServerAndShare(FileName, Pos)))
241 if ((Res = ParseDrive(FileName, Pos)))
247 std::string
DirName(
const std::string &FileName) {
248 size_t LocationLen = ParseLocation(FileName);
249 size_t DirLen = 0, Res;
250 while ((Res = ParseDir(FileName, LocationLen + DirLen)))
252 size_t FileLen = ParseFileName(FileName, LocationLen + DirLen);
254 if (LocationLen + DirLen + FileLen != FileName.size()) {
255 Printf(
"DirName() failed for \"%s\", invalid path.\n", FileName.c_str());
264 while (DirLen && !IsSeparator(FileName[LocationLen + DirLen - 1]))
274 return std::string(
".\\").append(FileName, 0, DirLen);
277 return FileName.substr(0, LocationLen + DirLen);
280 std::string
TmpDir() {
return "TODO: implement TmpDir"; }
284 #endif // LIBFUZZER_WINDOWS
int DuplicateFile(int Fd)
void ListFilesInDirRecursive(const std::string &Dir, long *Epoch, std::vector< std::string > *V, bool TopDir)
bool IsFile(const std::string &Path)
long GetEpoch(const std::string &Path)
static GCRegistry::Add< CoreCLRGC > E("coreclr","CoreCLR-compatible GC")
void Printf(const char *Fmt,...)
FILE * OpenFile(int Fd, const char *Mode)
std::string DirPlusFile(const std::string &DirPath, const std::string &FileName)
static const unsigned End
cl::opt< TargetMachine::CodeGenFileType > FileType("filetype", cl::init(TargetMachine::CGFT_AssemblyFile), cl::desc("Choose a file type (not all types are supported by all targets):"), cl::values(clEnumValN(TargetMachine::CGFT_AssemblyFile,"asm","Emit an assembly ('.s') file"), clEnumValN(TargetMachine::CGFT_ObjectFile,"obj","Emit a native object ('.o') file"), clEnumValN(TargetMachine::CGFT_Null,"null","Emit nothing, for performance testing")))
static GCRegistry::Add< ShadowStackGC > C("shadow-stack","Very portable GC for uncooperative code generators")
void RemoveFile(const std::string &Path)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
std::string DirName(const std::string &FileName)