1 //===-- ConnectionFileDescriptorPosix.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_HOST_POSIX_CONNECTIONFILEDESCRIPTORPOSIX_H
10 #define LLDB_HOST_POSIX_CONNECTIONFILEDESCRIPTORPOSIX_H
11 
12 #include <atomic>
13 #include <memory>
14 #include <mutex>
15 
16 #include "lldb/lldb-forward.h"
17 
18 #include "lldb/Host/Pipe.h"
19 #include "lldb/Host/Socket.h"
20 #include "lldb/Utility/Connection.h"
21 #include "lldb/Utility/IOObject.h"
22 
23 namespace lldb_private {
24 
25 class Status;
26 class Socket;
27 class SocketAddress;
28 
29 class ConnectionFileDescriptor : public Connection {
30 public:
31   typedef llvm::function_ref<void(llvm::StringRef local_socket_id)>
32       socket_id_callback_type;
33 
34   ConnectionFileDescriptor(bool child_processes_inherit = false);
35 
36   ConnectionFileDescriptor(int fd, bool owns_fd);
37 
38   ConnectionFileDescriptor(Socket *socket);
39 
40   ~ConnectionFileDescriptor() override;
41 
42   bool IsConnected() const override;
43 
44   lldb::ConnectionStatus Connect(llvm::StringRef url,
45                                  Status *error_ptr) override;
46 
47   lldb::ConnectionStatus Connect(llvm::StringRef url,
48                                  socket_id_callback_type socket_id_callback,
49                                  Status *error_ptr);
50 
51   lldb::ConnectionStatus Disconnect(Status *error_ptr) override;
52 
53   size_t Read(void *dst, size_t dst_len, const Timeout<std::micro> &timeout,
54               lldb::ConnectionStatus &status, Status *error_ptr) override;
55 
56   size_t Write(const void *src, size_t src_len, lldb::ConnectionStatus &status,
57                Status *error_ptr) override;
58 
59   std::string GetURI() override;
60 
61   lldb::ConnectionStatus BytesAvailable(const Timeout<std::micro> &timeout,
62                                         Status *error_ptr);
63 
64   bool InterruptRead() override;
65 
66   lldb::IOObjectSP GetReadObject() override { return m_io_sp; }
67 
68   bool GetChildProcessesInherit() const;
69   void SetChildProcessesInherit(bool child_processes_inherit);
70 
71 protected:
72   void OpenCommandPipe();
73 
74   void CloseCommandPipe();
75 
76   lldb::ConnectionStatus
77   AcceptSocket(Socket::SocketProtocol socket_protocol,
78                llvm::StringRef socket_name,
79                llvm::function_ref<void(Socket &)> post_listen_callback,
80                Status *error_ptr);
81 
82   lldb::ConnectionStatus ConnectSocket(Socket::SocketProtocol socket_protocol,
83                                        llvm::StringRef socket_name,
84                                        Status *error_ptr);
85 
86   lldb::ConnectionStatus AcceptTCP(llvm::StringRef host_and_port,
87                                    socket_id_callback_type socket_id_callback,
88                                    Status *error_ptr);
89 
90   lldb::ConnectionStatus ConnectTCP(llvm::StringRef host_and_port,
91                                     socket_id_callback_type socket_id_callback,
92                                     Status *error_ptr);
93 
94   lldb::ConnectionStatus ConnectUDP(llvm::StringRef args,
95                                     socket_id_callback_type socket_id_callback,
96                                     Status *error_ptr);
97 
98   lldb::ConnectionStatus
99   ConnectNamedSocket(llvm::StringRef socket_name,
100                      socket_id_callback_type socket_id_callback,
101                      Status *error_ptr);
102 
103   lldb::ConnectionStatus
104   AcceptNamedSocket(llvm::StringRef socket_name,
105                     socket_id_callback_type socket_id_callback,
106                     Status *error_ptr);
107 
108   lldb::ConnectionStatus
109   AcceptAbstractSocket(llvm::StringRef socket_name,
110                        socket_id_callback_type socket_id_callback,
111                        Status *error_ptr);
112 
113   lldb::ConnectionStatus
114   ConnectAbstractSocket(llvm::StringRef socket_name,
115                         socket_id_callback_type socket_id_callback,
116                         Status *error_ptr);
117 
118   lldb::ConnectionStatus ConnectFD(llvm::StringRef args,
119                                    socket_id_callback_type socket_id_callback,
120                                    Status *error_ptr);
121 
122   lldb::ConnectionStatus ConnectFile(llvm::StringRef args,
123                                      socket_id_callback_type socket_id_callback,
124                                      Status *error_ptr);
125 
126   lldb::ConnectionStatus
127   ConnectSerialPort(llvm::StringRef args,
128                     socket_id_callback_type socket_id_callback,
129                     Status *error_ptr);
130 
131   lldb::IOObjectSP m_io_sp;
132 
133   Pipe m_pipe;
134   std::recursive_mutex m_mutex;
135   std::atomic<bool> m_shutting_down; // This marks that we are shutting down so
136                                      // if we get woken up from
137   // BytesAvailable to disconnect, we won't try to read again.
138   bool m_child_processes_inherit;
139 
140   std::string m_uri;
141 
142 private:
143   void InitializeSocket(Socket *socket);
144 
145   ConnectionFileDescriptor(const ConnectionFileDescriptor &) = delete;
146   const ConnectionFileDescriptor &
147   operator=(const ConnectionFileDescriptor &) = delete;
148 };
149 
150 } // namespace lldb_private
151 
152 #endif // LLDB_HOST_POSIX_CONNECTIONFILEDESCRIPTORPOSIX_H
153