// 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_LINUX_EXCEPTION_HANDLER_PROTOCOL_H_
#define CRASHPAD_UTIL_LINUX_EXCEPTION_HANDLER_PROTOCOL_H_

#include <errno.h>
#include <signal.h>
#include <stdint.h>
#include <sys/types.h>

#include "base/macros.h"
#include "build/build_config.h"
#include "util/file/file_io.h"
#include "util/misc/address_types.h"

namespace crashpad {

class ExceptionHandlerProtocol {
 public:
#pragma pack(push, 1)

  //! \brief The type used for error reporting.
  using Errno = int32_t;
  static_assert(sizeof(Errno) >= sizeof(errno), "Errno type is too small");

  //! \brief A boolean status suitable for communication between processes.
  enum Bool : char { kBoolFalse, kBoolTrue };

#if defined(STARBOARD)
  //! \brief Describes when, in the client process lifecycle, the Crashpad
  //!     handler was or will be started.
  enum HandlerStartType : char { kStartAtCrash, kStartAtLaunch };
#endif

  //! \brief Information about a client registered with an
  //!     ExceptionHandlerServer.
  struct ClientInformation {
    //! \brief Constructs this object.
    ClientInformation();

    //! \brief The address in the client's address space of an
    //!     ExceptionInformation struct.
    VMAddress exception_information_address;

    //! \brief The address in the client's address space of a
    //!     SanitizationInformation struct, or 0 if there is no such struct.
    VMAddress sanitization_information_address;

#if defined(STARBOARD)
    //! \brief The address in the client's address space of an EvergreenInfo
    //!     struct, or 0 if there is no such struct.
    VMAddress evergreen_information_address;

    //! \brief The address in the client's address space of a character array
    //!     containing a serialized CrashpadAnnotations proto, or 0 if there is
    //!     no such address.
    VMAddress serialized_annotations_address;

    //! \brief The byte size of the serialized annotations.
    int serialized_annotations_size;

    HandlerStartType handler_start_type;
#endif

#if defined(OS_LINUX)
    //! \brief Indicates that the client is likely in a crash loop if a crash
    //!     occurs before this timestamp. This value is only used by ChromeOS's
    //!     `/sbin/crash_reporter`.
    uint64_t crash_loop_before_time;
#endif
  };

  //! \brief The signal used to indicate a crash dump is complete.
  //!
  //! When multiple clients share a single socket connection with the handler,
  //! the handler sends this signal to the dump requestor to indicate when the
  //! the dump is either done or has failed and the client may continue.
  static constexpr int kDumpDoneSignal = SIGCONT;

  //! \brief The message passed from client to server.
  struct ClientToServerMessage {
    static constexpr int32_t kVersion = 1;

    //! \brief Constructs this object.
    ClientToServerMessage();

    //! \brief Indicates what message version is being used.
    int32_t version;

    enum Type : uint32_t {
      //! \brief Request that the server respond with its credentials.
      kTypeCheckCredentials,

      //! \brief Used to request a crash dump for the sending client.
      kTypeCrashDumpRequest,

#if defined(STARBOARD)
      //! \brief Used to store Evergreen mapping info in the handler for use at
      //!     time of crash.
      kTypeAddEvergreenInfo,
      kTypeAddAnnotations,
#endif
    };

    Type type;

    //! \brief A stack address of the thread sending the message.
    VMAddress requesting_thread_stack_address;

    union {
      //! \brief Valid for type == kCrashDumpRequest
      ClientInformation client_info;
    };
  };

  //! \brief The message passed from server to client.
  struct ServerToClientMessage {
    enum Type : uint32_t {
      //! \brief Used to pass credentials with `SCM_CREDENTIALS`.
      kTypeCredentials,

      //! \brief Indicates that the client should fork a PtraceBroker process.
      kTypeForkBroker,

      //! \brief Inidicates that the client should set allow the handler to
      //!     trace it using PR_SET_PTRACER.
      kTypeSetPtracer,

      //! \brief Indicates that the handler has completed a requested crash
      //!     dump.
      kTypeCrashDumpComplete,

      //! \brief Indicicates that the handler was unable to produce a crash
      //!     dump.
      kTypeCrashDumpFailed
    };

    Type type;

    //! \brief The handler's process ID. Valid for kTypeSetPtracer.
    pid_t pid;
  };

#pragma pack(pop)

  DISALLOW_IMPLICIT_CONSTRUCTORS(ExceptionHandlerProtocol);
};

}  // namespace crashpad

#endif  // CRASHPAD_UTIL_LINUX_EXCEPTION_HANDLER_PROTOCOL_H_
