mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Bring win32/Path.cpp up to date with respect to Unix/Path.cpp
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19198 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
139e1663a6
commit
ebcb9b3807
@ -142,13 +142,6 @@ static void getPathList(const char*path, std::vector<sys::Path>& Paths) {
|
|||||||
|
|
||||||
void
|
void
|
||||||
Path::GetSystemLibraryPaths(std::vector<sys::Path>& Paths) {
|
Path::GetSystemLibraryPaths(std::vector<sys::Path>& Paths) {
|
||||||
#ifdef LTDL_SHLIBPATH_VAR
|
|
||||||
char* env_var = getenv(LTDL_SHLIBPATH_VAR);
|
|
||||||
if (env_var != 0) {
|
|
||||||
getPathList(env_var,Paths);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// FIXME: Should this look at LD_LIBRARY_PATH too?
|
|
||||||
Paths.push_back(sys::Path("C:\\WINDOWS\\SYSTEM32\\"));
|
Paths.push_back(sys::Path("C:\\WINDOWS\\SYSTEM32\\"));
|
||||||
Paths.push_back(sys::Path("C:\\WINDOWS\\"));
|
Paths.push_back(sys::Path("C:\\WINDOWS\\"));
|
||||||
}
|
}
|
||||||
@ -172,11 +165,13 @@ Path::GetBytecodeLibraryPaths(std::vector<sys::Path>& Paths) {
|
|||||||
|
|
||||||
Path
|
Path
|
||||||
Path::GetLLVMDefaultConfigDir() {
|
Path::GetLLVMDefaultConfigDir() {
|
||||||
|
// TODO: this isn't going to fly on Windows
|
||||||
return Path("/etc/llvm/");
|
return Path("/etc/llvm/");
|
||||||
}
|
}
|
||||||
|
|
||||||
Path
|
Path
|
||||||
Path::GetUserHomeDirectory() {
|
Path::GetUserHomeDirectory() {
|
||||||
|
// TODO: Typical Windows setup doesn't define HOME.
|
||||||
const char* home = getenv("HOME");
|
const char* home = getenv("HOME");
|
||||||
if (home) {
|
if (home) {
|
||||||
Path result;
|
Path result;
|
||||||
@ -288,7 +283,7 @@ Path::getStatusInfo(StatusInfo& info) const {
|
|||||||
info.fileSize <<= 32;
|
info.fileSize <<= 32;
|
||||||
info.fileSize += fi.nFileSizeLow;
|
info.fileSize += fi.nFileSizeLow;
|
||||||
|
|
||||||
info.mode = 0777; // Not applicable to Windows, so...
|
info.mode = fi.dwFileAttributes & FILE_ATTRIBUTE_READONLY ? 0555 : 0777;
|
||||||
info.user = 9999; // Not applicable to Windows, so...
|
info.user = 9999; // Not applicable to Windows, so...
|
||||||
info.group = 9999; // Not applicable to Windows, so...
|
info.group = 9999; // Not applicable to Windows, so...
|
||||||
|
|
||||||
@ -302,6 +297,22 @@ Path::getStatusInfo(StatusInfo& info) const {
|
|||||||
path.erase(path.length() - 1);
|
path.erase(path.length() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool AddPermissionBits(const std::string& Filename, int bits) {
|
||||||
|
DWORD attr = GetFileAttributes(Filename.c_str());
|
||||||
|
|
||||||
|
// If it doesn't exist, we're done.
|
||||||
|
if (attr == INVALID_FILE_ATTRIBUTES)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// The best we can do to interpret Unix permission bits is to use
|
||||||
|
// the owner writable bit.
|
||||||
|
if ((attr & FILE_ATTRIBUTE_READONLY) && (bits & 0200)) {
|
||||||
|
if (!SetFileAttributes(Filename.c_str(), attr & ~FILE_ATTRIBUTE_READONLY))
|
||||||
|
ThrowError(Filename + ": SetFileAttributes: ");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void Path::makeReadable() {
|
void Path::makeReadable() {
|
||||||
// All files are readable on Windows (ignoring security attributes).
|
// All files are readable on Windows (ignoring security attributes).
|
||||||
}
|
}
|
||||||
@ -323,6 +334,35 @@ void Path::makeExecutable() {
|
|||||||
// All files are executable on Windows (ignoring security attributes).
|
// All files are executable on Windows (ignoring security attributes).
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Path::getDirectoryContents(std::set<Path>& result) const {
|
||||||
|
if (!isDirectory())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result.clear();
|
||||||
|
WIN32_FIND_DATA fd;
|
||||||
|
HANDLE h = FindFirstFile(path.c_str(), &fd);
|
||||||
|
if (h == INVALID_HANDLE_VALUE) {
|
||||||
|
if (GetLastError() == ERROR_NO_MORE_FILES)
|
||||||
|
return true; // not really an error, now is it?
|
||||||
|
ThrowError(path + ": Can't read directory: ");
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (fd.cFileName[0] == '.')
|
||||||
|
continue;
|
||||||
|
Path aPath(path + &fd.cFileName[0]);
|
||||||
|
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
|
aPath.path += "/";
|
||||||
|
result.insert(aPath);
|
||||||
|
} while (FindNextFile(h, &fd));
|
||||||
|
|
||||||
|
CloseHandle(h);
|
||||||
|
if (GetLastError() != ERROR_NO_MORE_FILES)
|
||||||
|
ThrowError(path + ": Can't read directory: ");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Path::setDirectory(const std::string& a_path) {
|
Path::setDirectory(const std::string& a_path) {
|
||||||
if (a_path.size() == 0)
|
if (a_path.size() == 0)
|
||||||
@ -575,13 +615,68 @@ bool Path::getMagicNumber(std::string& Magic, unsigned len) const {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Path::renameFile(const Path& newName) {
|
||||||
|
if (!isFile()) return false;
|
||||||
|
if (!MoveFile(path.c_str(), newName.c_str()))
|
||||||
|
ThrowError("Can't move '" + path +
|
||||||
|
"' to '" + newName.path + "': ");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Path::setStatusInfo(const StatusInfo& si) const {
|
||||||
|
if (!isFile()) return false;
|
||||||
|
|
||||||
|
HANDLE h = CreateFile(path.c_str(),
|
||||||
|
FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
|
||||||
|
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
||||||
|
NULL,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
FILE_ATTRIBUTE_NORMAL,
|
||||||
|
NULL);
|
||||||
|
if (h == INVALID_HANDLE_VALUE)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
BY_HANDLE_FILE_INFORMATION bhfi;
|
||||||
|
if (!GetFileInformationByHandle(h, &bhfi)) {
|
||||||
|
CloseHandle(h);
|
||||||
|
ThrowError(path + ": GetFileInformationByHandle: ");
|
||||||
|
}
|
||||||
|
|
||||||
|
FILETIME ft;
|
||||||
|
(uint64_t&)ft = si.modTime.toWin32Time();
|
||||||
|
BOOL ret = SetFileTime(h, NULL, &ft, &ft);
|
||||||
|
CloseHandle(h);
|
||||||
|
if (!ret)
|
||||||
|
ThrowError(path + ": SetFileTime: ");
|
||||||
|
|
||||||
|
// Best we can do with Unix permission bits is to interpret the owner
|
||||||
|
// writable bit.
|
||||||
|
if (si.mode & 0200) {
|
||||||
|
if (bhfi.dwFileAttributes & FILE_ATTRIBUTE_READONLY) {
|
||||||
|
if (!SetFileAttributes(path.c_str(),
|
||||||
|
bhfi.dwFileAttributes & ~FILE_ATTRIBUTE_READONLY))
|
||||||
|
ThrowError(path + ": SetFileAttributes: ");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!(bhfi.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) {
|
||||||
|
if (!SetFileAttributes(path.c_str(),
|
||||||
|
bhfi.dwFileAttributes | FILE_ATTRIBUTE_READONLY))
|
||||||
|
ThrowError(path + ": SetFileAttributes: ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
sys::CopyFile(const sys::Path &Dest, const sys::Path &Src) {
|
sys::CopyFile(const sys::Path &Dest, const sys::Path &Src) {
|
||||||
// Can't use CopyFile macro defined in Windows.h because it would mess up the
|
// Can't use CopyFile macro defined in Windows.h because it would mess up the
|
||||||
// above line. We use the expansion it would have in a non-UNICODE build.
|
// above line. We use the expansion it would have in a non-UNICODE build.
|
||||||
if (!::CopyFileA(Src.c_str(), Dest.c_str(), false))
|
if (!::CopyFileA(Src.c_str(), Dest.c_str(), false))
|
||||||
ThrowError("Can't copy '" + Src.toString() +
|
ThrowError("Can't copy '" + Src.toString() +
|
||||||
"' to '" + Dest.toString() + "'");
|
"' to '" + Dest.toString() + "': ");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -142,13 +142,6 @@ static void getPathList(const char*path, std::vector<sys::Path>& Paths) {
|
|||||||
|
|
||||||
void
|
void
|
||||||
Path::GetSystemLibraryPaths(std::vector<sys::Path>& Paths) {
|
Path::GetSystemLibraryPaths(std::vector<sys::Path>& Paths) {
|
||||||
#ifdef LTDL_SHLIBPATH_VAR
|
|
||||||
char* env_var = getenv(LTDL_SHLIBPATH_VAR);
|
|
||||||
if (env_var != 0) {
|
|
||||||
getPathList(env_var,Paths);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// FIXME: Should this look at LD_LIBRARY_PATH too?
|
|
||||||
Paths.push_back(sys::Path("C:\\WINDOWS\\SYSTEM32\\"));
|
Paths.push_back(sys::Path("C:\\WINDOWS\\SYSTEM32\\"));
|
||||||
Paths.push_back(sys::Path("C:\\WINDOWS\\"));
|
Paths.push_back(sys::Path("C:\\WINDOWS\\"));
|
||||||
}
|
}
|
||||||
@ -172,11 +165,13 @@ Path::GetBytecodeLibraryPaths(std::vector<sys::Path>& Paths) {
|
|||||||
|
|
||||||
Path
|
Path
|
||||||
Path::GetLLVMDefaultConfigDir() {
|
Path::GetLLVMDefaultConfigDir() {
|
||||||
|
// TODO: this isn't going to fly on Windows
|
||||||
return Path("/etc/llvm/");
|
return Path("/etc/llvm/");
|
||||||
}
|
}
|
||||||
|
|
||||||
Path
|
Path
|
||||||
Path::GetUserHomeDirectory() {
|
Path::GetUserHomeDirectory() {
|
||||||
|
// TODO: Typical Windows setup doesn't define HOME.
|
||||||
const char* home = getenv("HOME");
|
const char* home = getenv("HOME");
|
||||||
if (home) {
|
if (home) {
|
||||||
Path result;
|
Path result;
|
||||||
@ -288,7 +283,7 @@ Path::getStatusInfo(StatusInfo& info) const {
|
|||||||
info.fileSize <<= 32;
|
info.fileSize <<= 32;
|
||||||
info.fileSize += fi.nFileSizeLow;
|
info.fileSize += fi.nFileSizeLow;
|
||||||
|
|
||||||
info.mode = 0777; // Not applicable to Windows, so...
|
info.mode = fi.dwFileAttributes & FILE_ATTRIBUTE_READONLY ? 0555 : 0777;
|
||||||
info.user = 9999; // Not applicable to Windows, so...
|
info.user = 9999; // Not applicable to Windows, so...
|
||||||
info.group = 9999; // Not applicable to Windows, so...
|
info.group = 9999; // Not applicable to Windows, so...
|
||||||
|
|
||||||
@ -302,6 +297,22 @@ Path::getStatusInfo(StatusInfo& info) const {
|
|||||||
path.erase(path.length() - 1);
|
path.erase(path.length() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool AddPermissionBits(const std::string& Filename, int bits) {
|
||||||
|
DWORD attr = GetFileAttributes(Filename.c_str());
|
||||||
|
|
||||||
|
// If it doesn't exist, we're done.
|
||||||
|
if (attr == INVALID_FILE_ATTRIBUTES)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// The best we can do to interpret Unix permission bits is to use
|
||||||
|
// the owner writable bit.
|
||||||
|
if ((attr & FILE_ATTRIBUTE_READONLY) && (bits & 0200)) {
|
||||||
|
if (!SetFileAttributes(Filename.c_str(), attr & ~FILE_ATTRIBUTE_READONLY))
|
||||||
|
ThrowError(Filename + ": SetFileAttributes: ");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void Path::makeReadable() {
|
void Path::makeReadable() {
|
||||||
// All files are readable on Windows (ignoring security attributes).
|
// All files are readable on Windows (ignoring security attributes).
|
||||||
}
|
}
|
||||||
@ -323,6 +334,35 @@ void Path::makeExecutable() {
|
|||||||
// All files are executable on Windows (ignoring security attributes).
|
// All files are executable on Windows (ignoring security attributes).
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Path::getDirectoryContents(std::set<Path>& result) const {
|
||||||
|
if (!isDirectory())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result.clear();
|
||||||
|
WIN32_FIND_DATA fd;
|
||||||
|
HANDLE h = FindFirstFile(path.c_str(), &fd);
|
||||||
|
if (h == INVALID_HANDLE_VALUE) {
|
||||||
|
if (GetLastError() == ERROR_NO_MORE_FILES)
|
||||||
|
return true; // not really an error, now is it?
|
||||||
|
ThrowError(path + ": Can't read directory: ");
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (fd.cFileName[0] == '.')
|
||||||
|
continue;
|
||||||
|
Path aPath(path + &fd.cFileName[0]);
|
||||||
|
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
|
aPath.path += "/";
|
||||||
|
result.insert(aPath);
|
||||||
|
} while (FindNextFile(h, &fd));
|
||||||
|
|
||||||
|
CloseHandle(h);
|
||||||
|
if (GetLastError() != ERROR_NO_MORE_FILES)
|
||||||
|
ThrowError(path + ": Can't read directory: ");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Path::setDirectory(const std::string& a_path) {
|
Path::setDirectory(const std::string& a_path) {
|
||||||
if (a_path.size() == 0)
|
if (a_path.size() == 0)
|
||||||
@ -575,13 +615,68 @@ bool Path::getMagicNumber(std::string& Magic, unsigned len) const {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Path::renameFile(const Path& newName) {
|
||||||
|
if (!isFile()) return false;
|
||||||
|
if (!MoveFile(path.c_str(), newName.c_str()))
|
||||||
|
ThrowError("Can't move '" + path +
|
||||||
|
"' to '" + newName.path + "': ");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Path::setStatusInfo(const StatusInfo& si) const {
|
||||||
|
if (!isFile()) return false;
|
||||||
|
|
||||||
|
HANDLE h = CreateFile(path.c_str(),
|
||||||
|
FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
|
||||||
|
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
||||||
|
NULL,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
FILE_ATTRIBUTE_NORMAL,
|
||||||
|
NULL);
|
||||||
|
if (h == INVALID_HANDLE_VALUE)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
BY_HANDLE_FILE_INFORMATION bhfi;
|
||||||
|
if (!GetFileInformationByHandle(h, &bhfi)) {
|
||||||
|
CloseHandle(h);
|
||||||
|
ThrowError(path + ": GetFileInformationByHandle: ");
|
||||||
|
}
|
||||||
|
|
||||||
|
FILETIME ft;
|
||||||
|
(uint64_t&)ft = si.modTime.toWin32Time();
|
||||||
|
BOOL ret = SetFileTime(h, NULL, &ft, &ft);
|
||||||
|
CloseHandle(h);
|
||||||
|
if (!ret)
|
||||||
|
ThrowError(path + ": SetFileTime: ");
|
||||||
|
|
||||||
|
// Best we can do with Unix permission bits is to interpret the owner
|
||||||
|
// writable bit.
|
||||||
|
if (si.mode & 0200) {
|
||||||
|
if (bhfi.dwFileAttributes & FILE_ATTRIBUTE_READONLY) {
|
||||||
|
if (!SetFileAttributes(path.c_str(),
|
||||||
|
bhfi.dwFileAttributes & ~FILE_ATTRIBUTE_READONLY))
|
||||||
|
ThrowError(path + ": SetFileAttributes: ");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!(bhfi.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) {
|
||||||
|
if (!SetFileAttributes(path.c_str(),
|
||||||
|
bhfi.dwFileAttributes | FILE_ATTRIBUTE_READONLY))
|
||||||
|
ThrowError(path + ": SetFileAttributes: ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
sys::CopyFile(const sys::Path &Dest, const sys::Path &Src) {
|
sys::CopyFile(const sys::Path &Dest, const sys::Path &Src) {
|
||||||
// Can't use CopyFile macro defined in Windows.h because it would mess up the
|
// Can't use CopyFile macro defined in Windows.h because it would mess up the
|
||||||
// above line. We use the expansion it would have in a non-UNICODE build.
|
// above line. We use the expansion it would have in a non-UNICODE build.
|
||||||
if (!::CopyFileA(Src.c_str(), Dest.c_str(), false))
|
if (!::CopyFileA(Src.c_str(), Dest.c_str(), false))
|
||||||
ThrowError("Can't copy '" + Src.toString() +
|
ThrowError("Can't copy '" + Src.toString() +
|
||||||
"' to '" + Dest.toString() + "'");
|
"' to '" + Dest.toString() + "': ");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user