}
bool FdFile::Open(const std::string& path, int flags, mode_t mode) {
+ static_assert(O_RDONLY == 0, "Readonly flag has unexpected value.");
CHECK_EQ(fd_, -1) << path;
- read_only_mode_ = (flags & O_RDONLY) != 0;
+ read_only_mode_ = ((flags & O_ACCMODE) == O_RDONLY);
fd_ = TEMP_FAILURE_RETRY(open(path.c_str(), flags, mode));
if (fd_ == -1) {
return false;
}
file_path_ = path;
- static_assert(O_RDONLY == 0, "Readonly flag has unexpected value.");
if (kCheckSafeUsage && (flags & (O_RDWR | O_CREAT | O_WRONLY)) != 0) {
// Start in the base state (not flushed, not closed).
guard_state_ = GuardState::kBase;
ASSERT_TRUE(file.IsOpened());
EXPECT_GE(file.Fd(), 0);
EXPECT_TRUE(file.IsOpened());
+ EXPECT_FALSE(file.ReadOnlyMode());
EXPECT_EQ(0, file.Flush());
EXPECT_EQ(0, file.Close());
EXPECT_EQ(-1, file.Fd());
EXPECT_FALSE(file.IsOpened());
- FdFile file2(good_path, O_RDONLY, true);
+ FdFile file2(good_path, O_RDONLY, true);
EXPECT_TRUE(file2.IsOpened());
+ EXPECT_TRUE(file2.ReadOnlyMode());
EXPECT_GE(file2.Fd(), 0);
ASSERT_EQ(file2.Close(), 0);
art::ScratchFile tmp;
FdFile file(tmp.GetFilename(), O_RDONLY, false);
ASSERT_TRUE(file.IsOpened());
+ EXPECT_TRUE(file.ReadOnlyMode());
EXPECT_GE(file.Fd(), 0);
uint8_t buffer[16];
EXPECT_FALSE(file.ReadFully(&buffer, 4));
FdFile file(tmp.GetFilename(), O_RDWR, false);
ASSERT_TRUE(file.IsOpened());
EXPECT_GE(file.Fd(), 0);
+ EXPECT_FALSE(file.ReadOnlyMode());
char ignore_prefix[20] = {'a', };
NullTerminateCharArray(ignore_prefix);
FdFile file(tmp.GetFilename(), O_RDWR, false);
ASSERT_GE(file.Fd(), 0);
EXPECT_TRUE(file.IsOpened());
+ EXPECT_FALSE(file.ReadOnlyMode());
const char* test_string = "This is a test string";
size_t length = strlen(test_string) + 1;
File* OS::OpenFileWithFlags(const char* name, int flags) {
CHECK(name != nullptr);
- bool read_only = (flags == O_RDONLY);
+ bool read_only = ((flags & O_ACCMODE) == O_RDONLY);
std::unique_ptr<File> file(new File(name, flags, 0666, !read_only));
if (!file->IsOpened()) {
return nullptr;