// 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_CLIENT_H_
#define CRASHPAD_UTIL_LINUX_EXCEPTION_HANDLER_CLIENT_H_

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

#include "base/macros.h"
#include "util/linux/exception_handler_protocol.h"

#if defined(STARBOARD) || defined(NATIVE_TARGET_BUILD)
#include "starboard/elf_loader/evergreen_info.h"
#endif

namespace crashpad {

//! A client for an ExceptionHandlerServer
class ExceptionHandlerClient {
 public:
  //! \brief Constructs this object.
  //!
  //! \param[in] sock A socket connected to an ExceptionHandlerServer.
  //! \param[in] multiple_clients `true` if this socket may be used by multiple
  //!     clients.
  ExceptionHandlerClient(int sock, bool multiple_clients);

  ~ExceptionHandlerClient();

  //! \brief Communicates with the handler to determine its credentials.
  //!
  //! If using a multi-client socket, this method should be called before
  //! sharing the client socket end, or the handler's response may not be
  //! received.
  //!
  //! \param[out] creds The handler process' credentials, valid if this method
  //!     returns `true`.
  //! \return `true` on success. Otherwise, `false` with a message logged.
  bool GetHandlerCredentials(ucred* creds);

#if defined(STARBOARD) || defined(NATIVE_TARGET_BUILD)
  //! \brief Sends EvergreenInfo to the ExceptionHandlerServer.
  //!
  //! \param[in] info Information to about this client.
  //! \return `true` on success or `false` on failure.
  bool SendEvergreenInfo(
      const ExceptionHandlerProtocol::ClientInformation& info);

  //! \brief Sends CrashpadAnnotations to the ExceptionHandlerServer.
  //!
  //! \param[in] info Information to about this client.
  //! \return `true` on success or `false` on failure.
  bool SendAnnotations(const ExceptionHandlerProtocol::ClientInformation& info);
#endif

  //! \brief Request a crash dump from the ExceptionHandlerServer.
  //!
  //! This method blocks until the crash dump is complete.
  //!
  //! \param[in] info Information about this client.
  //! \return 0 on success or an error code on failure.
  int RequestCrashDump(const ExceptionHandlerProtocol::ClientInformation& info);

  //! \brief Uses `prctl(PR_SET_PTRACER, ...)` to set the process with
  //!     process ID \a pid as the ptracer for this process.
  //!
  //! \param[in] pid The process ID of the process to be set as this process'
  //!     ptracer.
  //! \return 0 on success or an error code on failure.
  int SetPtracer(pid_t pid);

  //! \brief Enables or disables SetPtracer().
  //! \param[in] can_set_ptracer Whether SetPtracer should be enabled.
  void SetCanSetPtracer(bool can_set_ptracer);

 private:
#if defined(STARBOARD) || defined(NATIVE_TARGET_BUILD)
  bool SendEvergreenInfoRequest(
      const ExceptionHandlerProtocol::ClientInformation& info);

  bool SendAddAnnotationsRequest(
      const ExceptionHandlerProtocol::ClientInformation& info);
#endif
  int SendCrashDumpRequest(
      const ExceptionHandlerProtocol::ClientInformation& info,
      VMAddress stack_pointer);
  int SignalCrashDump(const ExceptionHandlerProtocol::ClientInformation& info,
                      VMAddress stack_pointer);
  int WaitForCrashDumpComplete();

  int server_sock_;
  pid_t ptracer_;
  bool can_set_ptracer_;
  bool multiple_clients_;

  DISALLOW_COPY_AND_ASSIGN(ExceptionHandlerClient);
};

}  // namespace crashpad

#endif  // CRASHPAD_UTIL_LINUX_EXCEPTION_HANDLER_CLIENT_H_
