diff --git a/AK/MappedFile.cpp b/AK/MappedFile.cpp index 3f3afb86916..7fcc2c54106 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 bdf3b784068..a7649e78a51 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 }; }; }