1 //===-- GDBRemoteCommunicationServerPlatform.h ------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERPLATFORM_H
10 #define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERPLATFORM_H
11 
12 #include <map>
13 #include <mutex>
14 #include <optional>
15 #include <set>
16 
17 #include "GDBRemoteCommunicationServerCommon.h"
18 #include "lldb/Host/Socket.h"
19 
20 #include "llvm/Support/Error.h"
21 
22 namespace lldb_private {
23 namespace process_gdb_remote {
24 
25 class GDBRemoteCommunicationServerPlatform
26     : public GDBRemoteCommunicationServerCommon {
27 public:
28   GDBRemoteCommunicationServerPlatform(
29       FileSpec debugserver_path, const Socket::SocketProtocol socket_protocol,
30       uint16_t gdbserver_port);
31 
32   ~GDBRemoteCommunicationServerPlatform() override;
33 
34   Status LaunchProcess() override;
35 
36   void SetInferiorArguments(const lldb_private::Args &args);
37 
38   Status LaunchGDBServer(const lldb_private::Args &args, lldb::pid_t &pid,
39                          std::string &socket_name, shared_fd_t fd);
40 
41   void SetPendingGdbServer(const std::string &socket_name);
42 
43 protected:
44   const FileSpec m_debugserver_path;
45   const Socket::SocketProtocol m_socket_protocol;
46   std::recursive_mutex m_spawned_pids_mutex;
47   std::set<lldb::pid_t> m_spawned_pids;
48 
49   uint16_t m_gdbserver_port;
50   std::optional<std::string> m_pending_gdb_server_socket_name;
51 
52   PacketResult Handle_qLaunchGDBServer(StringExtractorGDBRemote &packet);
53 
54   PacketResult Handle_qQueryGDBServer(StringExtractorGDBRemote &packet);
55 
56   PacketResult Handle_qKillSpawnedProcess(StringExtractorGDBRemote &packet);
57 
58   PacketResult Handle_qPathComplete(StringExtractorGDBRemote &packet);
59 
60   PacketResult Handle_qProcessInfo(StringExtractorGDBRemote &packet);
61 
62   PacketResult Handle_qGetWorkingDir(StringExtractorGDBRemote &packet);
63 
64   PacketResult Handle_QSetWorkingDir(StringExtractorGDBRemote &packet);
65 
66   PacketResult Handle_qC(StringExtractorGDBRemote &packet);
67 
68   PacketResult Handle_jSignalsInfo(StringExtractorGDBRemote &packet);
69 
70 private:
71   bool KillSpawnedProcess(lldb::pid_t pid);
72   bool SpawnedProcessIsRunning(lldb::pid_t pid);
73   void AddSpawnedProcess(lldb::pid_t pid);
74 
75   void DebugserverProcessReaped(lldb::pid_t pid);
76 
77   static const FileSpec &GetDomainSocketDir();
78 
79   static FileSpec GetDomainSocketPath(const char *prefix);
80 
81   GDBRemoteCommunicationServerPlatform(
82       const GDBRemoteCommunicationServerPlatform &) = delete;
83   const GDBRemoteCommunicationServerPlatform &
84   operator=(const GDBRemoteCommunicationServerPlatform &) = delete;
85 };
86 
87 } // namespace process_gdb_remote
88 } // namespace lldb_private
89 
90 #endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERPLATFORM_H
91