// Copyright 2017 The Crashpad Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef CRASHPAD_UTIL_POSIX_SCOPED_MMAP_H_
#define CRASHPAD_UTIL_POSIX_SCOPED_MMAP_H_

#include "base/macros.h"

#include <sys/mman.h>
#include <sys/types.h>

#include "util/misc/from_pointer_cast.h"

namespace crashpad {

//! \brief Maintains a memory-mapped region created by `mmap()`.
//!
//! On destruction, any memory-mapped region managed by an object of this class
//! will be released by calling `munmap()`.
class ScopedMmap {
 public:
  ScopedMmap();
  ~ScopedMmap();

  //! \brief Releases the memory-mapped region by calling `munmap()`.
  //!
  //! \return `true` on success. `false` on failure, with a message logged.
  bool Reset();

  //! \brief Releases any existing memory-mapped region and sets the object to
  //!     maintain an already-established mapping.
  //!
  //! If \a addr and \a len indicate a region that overlaps with the existing
  //! memory-mapped region, only the portion of the existing memory-mapped
  //! region that does not overlap the new region, if any, will be released.
  //!
  //! \param[in] addr The base address of the existing memory-mapped region to
  //!     maintain.
  //! \param[in] len The size of the existing memory-mapped region to maintain.
  //!
  //! \return `true` on success. `false` on failure, with a message logged.
  bool ResetAddrLen(void* addr, size_t len);

  //! \brief Releases any existing memory-mapped region and establishes a new
  //!     one by calling `mmap()`.
  //!
  //! The parameters to this method are passed directly to `mmap()`.
  //!
  //! \return `true` on success. `false` on failure, with a message logged. A
  //!     message will also be logged on failure to release any existing
  //!     memory-mapped region, but this will not preclude `mmap()` from being
  //!     called or a new mapping from being established, and if such a call to
  //!     `mmap()` is successful, this method will return `true`.
  bool ResetMmap(void* addr,
                 size_t len,
                 int prot,
                 int flags,
                 int fd,
                 off_t offset);

  //! \brief Sets the protection of the memory-mapped region by calling
  //!     `mprotect()`.
  //!
  //! \a prot is passed directly to `mprotect()`.
  //!
  //! \return `true` on success. `false` on failure, with a message logged.
  bool Mprotect(int prot);

  //! \return Whether this object is managing a valid memory-mapped region.
  bool is_valid() const { return addr_ != MAP_FAILED; }

  //! \brief Returns the base address of the memory-mapped region.
  void* addr() const { return addr_; }

  //! \brief Returns the base address of the memory-mapped region, casted to
  //!     a type of the caller’s choosing.
  template <typename T>
  T addr_as() const {
    return FromPointerCast<T>(addr_);
  }

  //! \brief Returns the size of the memory-mapped region.
  //!
  //! This is the value originally passed to ResetAddrLen() or ResetMmap(), or
  //! after Reset(), `0`. It may not be a round number of pages. Providing the
  //! passed-in value is intended to ease tracking the intended lengths of
  //! memory-mapped regions backed by files whose sizes are not whole pages.
  size_t len() const { return len_; }

 private:
  void* addr_ = MAP_FAILED;
  size_t len_ = 0;

  DISALLOW_COPY_AND_ASSIGN(ScopedMmap);
};

}  // namespace crashpad

#endif  // CRASHPAD_UTIL_POSIX_SCOPED_MMAP_H_
