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
23namespace lldb_private {
24
25class Status;
26class Socket;
27class SocketAddress;
28
29class ConnectionFileDescriptor : public Connection {
30public:
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
71protected:
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
142private:
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

source code of lldb/include/lldb/Host/posix/ConnectionFileDescriptorPosix.h