1336809Sdim//===-- ConnectionFileDescriptorPosix.h -------------------------*- C++ -*-===//
2336809Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6336809Sdim//
7336809Sdim//===----------------------------------------------------------------------===//
8336809Sdim
9336809Sdim#ifndef LLDB_HOST_POSIX_CONNECTIONFILEDESCRIPTORPOSIX_H
10336809Sdim#define LLDB_HOST_POSIX_CONNECTIONFILEDESCRIPTORPOSIX_H
11336809Sdim
12336809Sdim#include <atomic>
13336809Sdim#include <memory>
14336809Sdim#include <mutex>
15336809Sdim
16336809Sdim#include "lldb/lldb-forward.h"
17336809Sdim
18360784Sdim#include "lldb/Host/Pipe.h"
19336809Sdim#include "lldb/Host/Socket.h"
20336809Sdim#include "lldb/Utility/Connection.h"
21336809Sdim#include "lldb/Utility/IOObject.h"
22336809Sdim
23336809Sdimnamespace lldb_private {
24360784Sdim
25360784Sdimclass Status;
26360784Sdimclass Socket;
27360784Sdimclass SocketAddress;
28360784Sdim
29336809Sdimclass ConnectionFileDescriptor : public Connection {
30353358Sdimpublic:
31336809Sdim  typedef llvm::function_ref<void(llvm::StringRef local_socket_id)>
32336809Sdim      socket_id_callback_type;
33336809Sdim
34336809Sdim  ConnectionFileDescriptor(bool child_processes_inherit = false);
35336809Sdim
36336809Sdim  ConnectionFileDescriptor(int fd, bool owns_fd);
37336809Sdim
38336809Sdim  ConnectionFileDescriptor(Socket *socket);
39336809Sdim
40336809Sdim  ~ConnectionFileDescriptor() override;
41336809Sdim
42336809Sdim  bool IsConnected() const override;
43336809Sdim
44336809Sdim  lldb::ConnectionStatus Connect(llvm::StringRef url,
45336809Sdim                                 Status *error_ptr) override;
46336809Sdim
47336809Sdim  lldb::ConnectionStatus Connect(llvm::StringRef url,
48336809Sdim                                 socket_id_callback_type socket_id_callback,
49336809Sdim                                 Status *error_ptr);
50336809Sdim
51336809Sdim  lldb::ConnectionStatus Disconnect(Status *error_ptr) override;
52336809Sdim
53336809Sdim  size_t Read(void *dst, size_t dst_len, const Timeout<std::micro> &timeout,
54336809Sdim              lldb::ConnectionStatus &status, Status *error_ptr) override;
55336809Sdim
56336809Sdim  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