diff options
author | Alex Brachet <alexbrachetmialot@gmail.com> | 2019-06-28 03:21:00 +0000 |
---|---|---|
committer | Alex Brachet <alexbrachetmialot@gmail.com> | 2019-06-28 03:21:00 +0000 |
commit | 3b715d67ddea3599623090212f9a0880cf164806 (patch) | |
tree | eae1a57a9bd366d59ad7ab96f427931d1d281d19 /llvm/unittests/Support/Path.cpp | |
parent | 588a17097038d5e0e4053116306aca80f766d853 (diff) | |
download | bcm5719-llvm-3b715d67ddea3599623090212f9a0880cf164806.tar.gz bcm5719-llvm-3b715d67ddea3599623090212f9a0880cf164806.zip |
[Support] Add fs::getUmask() function and change fs::setPermissions
Summary: This patch changes fs::setPermissions to optionally set permissions while respecting the umask. It also adds the function fs::getUmask() which returns the current umask.
Reviewers: jhenderson, rupprecht, aprantl, lhames
Reviewed By: jhenderson, rupprecht
Subscribers: sanaanajjar231288, hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D63583
llvm-svn: 364621
Diffstat (limited to 'llvm/unittests/Support/Path.cpp')
-rw-r--r-- | llvm/unittests/Support/Path.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/llvm/unittests/Support/Path.cpp b/llvm/unittests/Support/Path.cpp index f0e11b4e3f6..9cc62a7d164 100644 --- a/llvm/unittests/Support/Path.cpp +++ b/llvm/unittests/Support/Path.cpp @@ -1526,6 +1526,59 @@ TEST_F(FileSystemTest, is_local) { EXPECT_EQ(TestDirectoryIsLocal, TempFileIsLocal); } +TEST_F(FileSystemTest, getUmask) { +#ifdef _WIN32 + EXPECT_EQ(fs::getUmask(), 0U) << "Should always be 0 on Windows."; +#else + unsigned OldMask = ::umask(0022); + unsigned CurrentMask = fs::getUmask(); + EXPECT_EQ(CurrentMask, 0022U) + << "getUmask() didn't return previously set umask()"; + EXPECT_EQ(::umask(OldMask), 0022) << "getUmask() may have changed umask()"; +#endif +} + +TEST_F(FileSystemTest, RespectUmask) { +#ifndef _WIN32 + unsigned OldMask = ::umask(0022); + + int FD; + SmallString<128> TempPath; + ASSERT_NO_ERROR(fs::createTemporaryFile("prefix", "temp", FD, TempPath)); + + fs::perms AllRWE = static_cast<fs::perms>(0777); + + ASSERT_NO_ERROR(fs::setPermissions(TempPath, AllRWE /*RespectUmask=false*/)); + + ErrorOr<fs::perms> Perms = fs::getPermissions(TempPath); + ASSERT_TRUE(!!Perms); + EXPECT_EQ(Perms.get(), AllRWE) << "Should have ignored umask by default"; + + ASSERT_NO_ERROR(fs::setPermissions(TempPath, AllRWE, /*RespectUmask=*/false)); + + ErrorOr<fs::perms> Perms = fs::getPermissions(TempPath); + ASSERT_TRUE(!!Perms); + EXPECT_EQ(Perms.get(), AllRWE) << "Should have ignored umask"; + + ASSERT_NO_ERROR(fs::setPermissions(TempPath, AllRWE, /*RespectUmask=*/true)); + Perms = fs::getPermissions(TempPath); + ASSERT_TRUE(!!Perms); + EXPECT_EQ(Perms.get(), static_cast<fs::perms>(0755)) + << "Did not respect umask"; + + (void)::umask(0057); + + ASSERT_NO_ERROR(fs::setPermissions(TempPath, AllRWE, /*RespectUmask=*/true)); + Perms = fs::getPermissions(TempPath); + ASSERT_TRUE(!!Perms); + EXPECT_EQ(Perms.get(), static_cast<fs::perms>(0720)) + << "Did not respect umask"; + + (void)::umask(OldMask); + (void)::close(FD); +#endif +} + TEST_F(FileSystemTest, set_current_path) { SmallString<128> path; |