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