blob: 300d6a12a85905ec99851bea40198a9c7c256793 [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_LIB_ELFLDLTL_INCLUDE_LIB_ELFLDLTL_MAPPED_FD_FILE_H_
#define SRC_LIB_ELFLDLTL_INCLUDE_LIB_ELFLDLTL_MAPPED_FD_FILE_H_
#include <lib/fit/result.h>
#include "memory.h"
namespace elfldltl {
// elfldltl::MappedFdFile provides the File and Memory APIs and most other
// features of elfldltl::DirectMemory (see <lib/elfldltl/memory.h>), but on a
// read-only mmap'd file's entire contents.
//
// The object is default-constructible and move-only. The Init() function uses
// an unowned fd to set up the mapping but does not need the fd thereafter.
// The mapping will be removed on the object's destruction.
class MappedFdFile : public DirectMemory {
public:
MappedFdFile() = default;
MappedFdFile(const MappedFdFile&) = delete;
MappedFdFile(MappedFdFile&& other) noexcept : DirectMemory(other.image(), other.base()) {
other.set_image({});
}
MappedFdFile& operator=(MappedFdFile&& other) noexcept {
auto old_image = image();
set_image(other.image());
other.set_image(old_image);
set_base(other.base());
return *this;
}
// Fails with an errno code if fstat or mmap failed.
fit::result<int> Init(int fd);
~MappedFdFile();
private:
// Make this private so it can't be used.
using DirectMemory::set_image;
};
} // namespace elfldltl
#endif // SRC_LIB_ELFLDLTL_INCLUDE_LIB_ELFLDLTL_MAPPED_FD_FILE_H_