38 const int descriptor = ::open(path.c_str(), O_RDONLY);
39 if (descriptor == -1) {
40 throw std::system_error(errno, std::generic_category(),
41 "Failed to open mapped file");
44 struct stat status {};
45 if (::fstat(descriptor, &status) == -1) {
46 const int error = errno;
47 close_descriptor(descriptor);
48 throw std::system_error(error, std::generic_category(),
49 "Failed to inspect mapped file");
52 const auto file_size =
static_cast<std::uintmax_t
>(status.st_size);
53 if (status.st_size < 0 ||
54 file_size > std::numeric_limits<std::size_t>::max()) {
55 close_descriptor(descriptor);
56 throw std::length_error(
"Mapped file is too large");
59 const auto size =
static_cast<std::size_t
>(file_size);
61 close_descriptor(descriptor);
66 ::mmap(
nullptr, size, PROT_READ, MAP_SHARED, descriptor, 0);
67 const int error = mapping == MAP_FAILED ? errno : 0;
68 close_descriptor(descriptor);
69 if (mapping == MAP_FAILED) {
70 throw std::system_error(error, std::generic_category(),
71 "Failed to map file");