2023-11-19 20:21:56 -05:00
|
|
|
// Copyright 2023 The LightningBolt Authors
|
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
|
2023-11-19 06:19:15 -05:00
|
|
|
#include "MmapFile.hpp"
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include <sys/file.h>
|
|
|
|
#include <sys/mman.h>
|
|
|
|
|
|
|
|
namespace lightningbolt {
|
|
|
|
|
|
|
|
struct MmapFile::Impl {
|
|
|
|
|
|
|
|
~Impl() {
|
|
|
|
Close();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Close() {
|
|
|
|
if(mapping) {
|
|
|
|
munmap(mapping, mappingSize);
|
|
|
|
mapping = nullptr;
|
|
|
|
mappingSize = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ErrorOr<void> Open(const fs::path& path) {
|
|
|
|
int fd = open(path.string().c_str(), O_RDONLY);
|
|
|
|
|
|
|
|
// Error opening file.
|
|
|
|
if(fd == -1)
|
|
|
|
return std::error_code{errno, std::system_category()};
|
|
|
|
|
|
|
|
{
|
|
|
|
auto last = lseek64(fd, 0, SEEK_END);
|
|
|
|
mappingSize = lseek64(fd, 0, SEEK_CUR);
|
|
|
|
lseek64(fd, last, SEEK_SET);
|
|
|
|
}
|
|
|
|
|
|
|
|
mapping = static_cast<u8*>(mmap(nullptr, mappingSize, PROT_READ, MAP_PRIVATE, fd, 0));
|
|
|
|
if(mapping == static_cast<u8*>(MAP_FAILED)) {
|
|
|
|
mappingSize = 0;
|
|
|
|
return std::error_code{errno, std::system_category()};
|
|
|
|
}
|
|
|
|
|
|
|
|
// Once the mapping has successfully been created
|
|
|
|
// we can close the file descriptor instead of needing
|
|
|
|
// to remember it (the kernel will do so for us.)
|
|
|
|
close(fd);
|
|
|
|
|
|
|
|
// No error.
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
|
|
|
|
u8* GetMapping() const {
|
|
|
|
return mapping;
|
|
|
|
}
|
|
|
|
|
|
|
|
usize GetMappingSize() const {
|
|
|
|
return mappingSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
u8* mapping;
|
|
|
|
usize mappingSize;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace lightningbolt
|