mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-03 17:24:24 +00:00
Reverting r297617 because it broke some bots:
http://bb.pgr.jp/builders/cmake-llvm-x86_64-linux/builds/49970 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297618 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
565edc0441
commit
61d9d49df6
@ -178,23 +178,23 @@ public:
|
||||
Perms(Perms) {}
|
||||
#elif defined(LLVM_ON_WIN32)
|
||||
file_status() = default;
|
||||
|
||||
file_status(file_type Type) : Type(Type) {}
|
||||
|
||||
file_status(file_type Type, perms Perms, uint32_t LastAccessTimeHigh,
|
||||
uint32_t LastAccessTimeLow, uint32_t LastWriteTimeHigh,
|
||||
uint32_t LastWriteTimeLow, uint32_t VolumeSerialNumber,
|
||||
uint32_t FileSizeHigh, uint32_t FileSizeLow,
|
||||
|
||||
file_status(file_type Type) : Type(Type) {}
|
||||
|
||||
file_status(file_type Type, uint32_t LastAccessTimeHigh,
|
||||
uint32_t LastAccessTimeLow, uint32_t LastWriteTimeHigh,
|
||||
uint32_t LastWriteTimeLow, uint32_t VolumeSerialNumber,
|
||||
uint32_t FileSizeHigh, uint32_t FileSizeLow,
|
||||
uint32_t FileIndexHigh, uint32_t FileIndexLow)
|
||||
: LastAccessedTimeHigh(LastAccessTimeHigh), LastAccessedTimeLow(LastAccessTimeLow),
|
||||
LastWriteTimeHigh(LastWriteTimeHigh),
|
||||
LastWriteTimeLow(LastWriteTimeLow),
|
||||
VolumeSerialNumber(VolumeSerialNumber), FileSizeHigh(FileSizeHigh),
|
||||
FileSizeLow(FileSizeLow), FileIndexHigh(FileIndexHigh),
|
||||
FileIndexLow(FileIndexLow), Type(Type), Perms(Perms) {}
|
||||
#endif
|
||||
|
||||
// getters
|
||||
LastWriteTimeLow(LastWriteTimeLow),
|
||||
VolumeSerialNumber(VolumeSerialNumber), FileSizeHigh(FileSizeHigh),
|
||||
FileSizeLow(FileSizeLow), FileIndexHigh(FileIndexHigh),
|
||||
FileIndexLow(FileIndexLow), Type(Type) {}
|
||||
#endif
|
||||
|
||||
// getters
|
||||
file_type type() const { return Type; }
|
||||
perms permissions() const { return Perms; }
|
||||
TimePoint<> getLastAccessedTime() const;
|
||||
@ -602,33 +602,12 @@ std::error_code is_other(const Twine &path, bool &result);
|
||||
std::error_code status(const Twine &path, file_status &result,
|
||||
bool follow = true);
|
||||
|
||||
/// @brief A version for when a file descriptor is already available.
|
||||
std::error_code status(int FD, file_status &Result);
|
||||
|
||||
/// @brief Set file permissions.
|
||||
///
|
||||
/// @param Path File to set permissions on.
|
||||
/// @param Permissions New file permissions.
|
||||
/// @returns errc::success if the permissions were successfully set, otherwise
|
||||
/// a platform-specific error_code.
|
||||
/// @note On Windows, all permissions except *_write are ignored. Using any of
|
||||
/// owner_write, group_write, or all_write will make the file writable.
|
||||
/// Otherwise, the file will be marked as read-only.
|
||||
std::error_code setPermissions(const Twine &Path, perms Permissions);
|
||||
|
||||
/// @brief Get file permissions.
|
||||
///
|
||||
/// @param Path File to get permissions from.
|
||||
/// @returns the permissions if they were successfully retrieved, otherwise a
|
||||
/// platform-specific error_code.
|
||||
/// @note On Windows, if the file does not have the FILE_ATTRIBUTE_READONLY
|
||||
/// attribute, all_all will be returned. Otherwise, all_read | all_exe
|
||||
/// will be returned.
|
||||
ErrorOr<perms> getPermissions(const Twine &Path);
|
||||
|
||||
/// @brief Get file size.
|
||||
///
|
||||
/// @param Path Input path.
|
||||
/// @brief A version for when a file descriptor is already available.
|
||||
std::error_code status(int FD, file_status &Result);
|
||||
|
||||
/// @brief Get file size.
|
||||
///
|
||||
/// @param Path Input path.
|
||||
/// @param Result Set to the size of the file in \a Path.
|
||||
/// @returns errc::success if result has been successfully set, otherwise a
|
||||
/// platform-specific error_code.
|
||||
|
@ -1189,20 +1189,12 @@ std::error_code identify_magic(const Twine &Path, file_magic &Result) {
|
||||
}
|
||||
|
||||
std::error_code directory_entry::status(file_status &result) const {
|
||||
return fs::status(Path, result, FollowSymlinks);
|
||||
}
|
||||
|
||||
ErrorOr<perms> getPermissions(const Twine &Path) {
|
||||
file_status Status;
|
||||
if (std::error_code EC = status(Path, Status))
|
||||
return EC;
|
||||
|
||||
return Status.permissions();
|
||||
}
|
||||
|
||||
} // end namespace fs
|
||||
} // end namespace sys
|
||||
} // end namespace llvm
|
||||
return fs::status(Path, result, FollowSymlinks);
|
||||
}
|
||||
|
||||
} // end namespace fs
|
||||
} // end namespace sys
|
||||
} // end namespace llvm
|
||||
|
||||
// Include the truly platform-specific parts.
|
||||
#if defined(LLVM_ON_UNIX)
|
||||
|
@ -568,21 +568,12 @@ std::error_code status(const Twine &Path, file_status &Result, bool Follow) {
|
||||
std::error_code status(int FD, file_status &Result) {
|
||||
struct stat Status;
|
||||
int StatRet = ::fstat(FD, &Status);
|
||||
return fillStatus(StatRet, Status, Result);
|
||||
}
|
||||
|
||||
std::error_code setPermissions(const Twine &Path, perms Permissions) {
|
||||
SmallString<128> PathStorage;
|
||||
StringRef P = Path.toNullTerminatedStringRef(PathStorage);
|
||||
|
||||
if (::chmod(P.begin(), Permissions))
|
||||
return std::error_code(errno, std::generic_category());
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code setLastModificationAndAccessTime(int FD, TimePoint<> Time) {
|
||||
#if defined(HAVE_FUTIMENS)
|
||||
timespec Times[2];
|
||||
return fillStatus(StatRet, Status, Result);
|
||||
}
|
||||
|
||||
std::error_code setLastModificationAndAccessTime(int FD, TimePoint<> Time) {
|
||||
#if defined(HAVE_FUTIMENS)
|
||||
timespec Times[2];
|
||||
Times[0] = Times[1] = sys::toTimeSpec(Time);
|
||||
if (::futimens(FD, Times))
|
||||
return std::error_code(errno, std::generic_category());
|
||||
|
@ -527,21 +527,19 @@ static std::error_code getStatus(HANDLE FileHandle, file_status &Result) {
|
||||
goto handle_status_error;
|
||||
|
||||
{
|
||||
file_type Type = (Info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||
? file_type::directory_file
|
||||
: file_type::regular_file;
|
||||
perms Permissions = (Info.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
|
||||
? (all_read | all_exe)
|
||||
: all_all;
|
||||
Result = file_status(
|
||||
Type, Permissions, Info.ftLastAccessTime.dwHighDateTime,
|
||||
Info.ftLastAccessTime.dwLowDateTime,
|
||||
Info.ftLastWriteTime.dwHighDateTime, Info.ftLastWriteTime.dwLowDateTime,
|
||||
Info.dwVolumeSerialNumber, Info.nFileSizeHigh, Info.nFileSizeLow,
|
||||
Info.nFileIndexHigh, Info.nFileIndexLow);
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
file_type Type = (Info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||
? file_type::directory_file
|
||||
: file_type::regular_file;
|
||||
Result =
|
||||
file_status(Type, Info.ftLastAccessTime.dwHighDateTime,
|
||||
Info.ftLastAccessTime.dwLowDateTime,
|
||||
Info.ftLastWriteTime.dwHighDateTime,
|
||||
Info.ftLastWriteTime.dwLowDateTime,
|
||||
Info.dwVolumeSerialNumber, Info.nFileSizeHigh,
|
||||
Info.nFileSizeLow, Info.nFileIndexHigh, Info.nFileIndexLow);
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
handle_status_error:
|
||||
DWORD LastError = ::GetLastError();
|
||||
if (LastError == ERROR_FILE_NOT_FOUND ||
|
||||
@ -588,43 +586,12 @@ std::error_code status(const Twine &path, file_status &result, bool Follow) {
|
||||
|
||||
std::error_code status(int FD, file_status &Result) {
|
||||
HANDLE FileHandle = reinterpret_cast<HANDLE>(_get_osfhandle(FD));
|
||||
return getStatus(FileHandle, Result);
|
||||
}
|
||||
|
||||
std::error_code setPermissions(const Twine &Path, perms Permissions) {
|
||||
SmallVector<wchar_t, 128> PathUTF16;
|
||||
if (std::error_code EC = widenPath(Path, PathUTF16))
|
||||
return EC;
|
||||
|
||||
DWORD Attributes = ::GetFileAttributesW(PathUTF16.begin());
|
||||
if (Attributes == INVALID_FILE_ATTRIBUTES)
|
||||
return mapWindowsError(GetLastError());
|
||||
|
||||
// There are many Windows file attributes that are not to do with the file
|
||||
// permissions (e.g. FILE_ATTRIBUTE_HIDDEN). We need to be careful to preserve
|
||||
// them.
|
||||
if (Permissions & all_write) {
|
||||
Attributes &= ~FILE_ATTRIBUTE_READONLY;
|
||||
if (Attributes == 0)
|
||||
// FILE_ATTRIBUTE_NORMAL indicates no other attributes are set.
|
||||
Attributes |= FILE_ATTRIBUTE_NORMAL;
|
||||
}
|
||||
else {
|
||||
Attributes |= FILE_ATTRIBUTE_READONLY;
|
||||
// FILE_ATTRIBUTE_NORMAL is not compatible with any other attributes, so
|
||||
// remove it, if it is present.
|
||||
Attributes &= ~FILE_ATTRIBUTE_NORMAL;
|
||||
}
|
||||
|
||||
if (!::SetFileAttributesW(PathUTF16.begin(), Attributes))
|
||||
return mapWindowsError(GetLastError());
|
||||
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code setLastModificationAndAccessTime(int FD, TimePoint<> Time) {
|
||||
FILETIME FT = toFILETIME(Time);
|
||||
HANDLE FileHandle = reinterpret_cast<HANDLE>(_get_osfhandle(FD));
|
||||
return getStatus(FileHandle, Result);
|
||||
}
|
||||
|
||||
std::error_code setLastModificationAndAccessTime(int FD, TimePoint<> Time) {
|
||||
FILETIME FT = toFILETIME(Time);
|
||||
HANDLE FileHandle = reinterpret_cast<HANDLE>(_get_osfhandle(FD));
|
||||
if (!SetFileTime(FileHandle, NULL, &FT, &FT))
|
||||
return mapWindowsError(::GetLastError());
|
||||
return std::error_code();
|
||||
|
@ -1253,185 +1253,7 @@ TEST_F(FileSystemTest, set_current_path) {
|
||||
fs::UniqueID D1, D2;
|
||||
ASSERT_NO_ERROR(fs::getUniqueID(TestDirectory, D1));
|
||||
ASSERT_NO_ERROR(fs::getUniqueID(path, D2));
|
||||
ASSERT_EQ(D1, D2) << "D1: " << TestDirectory << "\nD2: " << path;
|
||||
}
|
||||
|
||||
TEST_F(FileSystemTest, permissions) {
|
||||
int FD;
|
||||
SmallString<64> TempPath;
|
||||
ASSERT_NO_ERROR(fs::createTemporaryFile("prefix", "temp", FD, TempPath));
|
||||
FileRemover Cleanup(TempPath);
|
||||
|
||||
// Make sure it exists.
|
||||
ASSERT_TRUE(fs::exists(Twine(TempPath)));
|
||||
|
||||
auto CheckPermissions = [&](fs::perms Expected) {
|
||||
ErrorOr<fs::perms> Actual = fs::getPermissions(TempPath);
|
||||
return Actual && *Actual == Expected;
|
||||
};
|
||||
|
||||
std::error_code NoError;
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::all_all), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::all_all));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::all_read | fs::all_exe), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::all_read | fs::all_exe));
|
||||
|
||||
#if defined(LLVM_ON_WIN32)
|
||||
fs::perms ReadOnly = fs::all_read | fs::all_exe;
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::no_perms), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(ReadOnly));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::owner_read), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(ReadOnly));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::owner_write), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::all_all));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::owner_exe), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(ReadOnly));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::owner_all), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::all_all));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::group_read), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(ReadOnly));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::group_write), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::all_all));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::group_exe), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(ReadOnly));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::group_all), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::all_all));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::others_read), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(ReadOnly));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::others_write), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::all_all));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::others_exe), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(ReadOnly));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::others_all), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::all_all));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::all_read), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(ReadOnly));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::all_write), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::all_all));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::all_exe), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(ReadOnly));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::set_uid_on_exe), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(ReadOnly));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::set_gid_on_exe), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(ReadOnly));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::sticky_bit), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(ReadOnly));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::set_uid_on_exe |
|
||||
fs::set_gid_on_exe |
|
||||
fs::sticky_bit),
|
||||
NoError);
|
||||
EXPECT_TRUE(CheckPermissions(ReadOnly));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, ReadOnly | fs::set_uid_on_exe |
|
||||
fs::set_gid_on_exe |
|
||||
fs::sticky_bit),
|
||||
NoError);
|
||||
EXPECT_TRUE(CheckPermissions(ReadOnly));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::all_all | fs::set_uid_on_exe |
|
||||
fs::set_gid_on_exe |
|
||||
fs::sticky_bit),
|
||||
NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::all_all));
|
||||
#else
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::no_perms), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::no_perms));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::owner_read), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::owner_read));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::owner_write), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::owner_write));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::owner_exe), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::owner_exe));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::owner_all), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::owner_all));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::group_read), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::group_read));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::group_write), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::group_write));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::group_exe), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::group_exe));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::group_all), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::group_all));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::others_read), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::others_read));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::others_write), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::others_write));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::others_exe), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::others_exe));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::others_all), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::others_all));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::all_read), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::all_read));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::all_write), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::all_write));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::all_exe), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::all_exe));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::set_uid_on_exe), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::set_uid_on_exe));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::set_gid_on_exe), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::set_gid_on_exe));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::sticky_bit), NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::sticky_bit));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::set_uid_on_exe |
|
||||
fs::set_gid_on_exe |
|
||||
fs::sticky_bit),
|
||||
NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::set_uid_on_exe | fs::set_gid_on_exe |
|
||||
fs::sticky_bit));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::all_read | fs::set_uid_on_exe |
|
||||
fs::set_gid_on_exe |
|
||||
fs::sticky_bit),
|
||||
NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::all_read | fs::set_uid_on_exe |
|
||||
fs::set_gid_on_exe | fs::sticky_bit));
|
||||
|
||||
EXPECT_EQ(fs::setPermissions(TempPath, fs::all_all | fs::set_uid_on_exe |
|
||||
fs::set_gid_on_exe |
|
||||
fs::sticky_bit),
|
||||
NoError);
|
||||
EXPECT_TRUE(CheckPermissions(fs::all_all | fs::set_uid_on_exe |
|
||||
fs::set_gid_on_exe | fs::sticky_bit));
|
||||
#endif
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
ASSERT_EQ(D1, D2) << "D1: " << TestDirectory << "\nD2: " << path;
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
Loading…
x
Reference in New Issue
Block a user