| // 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_ |