diff options
author | AnotherTest <ali.mpfard@gmail.com> | 2020-07-22 19:49:47 +0430 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-08-01 08:39:26 +0200 |
commit | 613141790437fd88811c6249c70427b452c6e249 (patch) | |
tree | 9815390ed5a0d159af80974ad293f81eb53fd916 /AK | |
parent | d04c833002331d868e95a1036426609b219ceb79 (diff) | |
download | serenity-613141790437fd88811c6249c70427b452c6e249.zip |
AK: Make MappedFile store why it is invalid
This makes AK::MappedFile save the errno either open() or mmap() failed
with.
Diffstat (limited to 'AK')
-rw-r--r-- | AK/MappedFile.cpp | 5 | ||||
-rw-r--r-- | AK/MappedFile.h | 9 |
2 files changed, 12 insertions, 2 deletions
diff --git a/AK/MappedFile.cpp b/AK/MappedFile.cpp index 3f3afb8691..7fcc2c5410 100644 --- a/AK/MappedFile.cpp +++ b/AK/MappedFile.cpp @@ -41,6 +41,7 @@ MappedFile::MappedFile(const StringView& file_name) int fd = open_with_path_length(file_name.characters_without_null_termination(), file_name.length(), O_RDONLY | O_CLOEXEC, 0); if (fd == -1) { + m_errno = errno; perror("open"); return; } @@ -50,8 +51,10 @@ MappedFile::MappedFile(const StringView& file_name) m_size = st.st_size; m_map = mmap(nullptr, m_size, PROT_READ, MAP_SHARED, fd, 0); - if (m_map == MAP_FAILED) + if (m_map == MAP_FAILED) { + m_errno = errno; perror("mmap"); + } #ifdef DEBUG_MAPPED_FILE dbgprintf("MappedFile{%s} := { fd=%d, m_size=%u, m_map=%p }\n", file_name.characters(), fd, m_size, m_map); diff --git a/AK/MappedFile.h b/AK/MappedFile.h index bdf3b78406..a7649e78a5 100644 --- a/AK/MappedFile.h +++ b/AK/MappedFile.h @@ -33,8 +33,9 @@ namespace AK { class MappedFile { AK_MAKE_NONCOPYABLE(MappedFile); + public: - MappedFile() {} + MappedFile() { } explicit MappedFile(const StringView& file_name); MappedFile(MappedFile&&); ~MappedFile(); @@ -42,6 +43,11 @@ public: MappedFile& operator=(MappedFile&&); bool is_valid() const { return m_map != (void*)-1; } + int errno_if_invalid() const + { + ASSERT(!is_valid()); + return m_errno; + } void unmap(); void* data() { return m_map; } @@ -51,6 +57,7 @@ public: private: size_t m_size { 0 }; void* m_map { (void*)-1 }; + int m_errno { 0 }; }; } |