1 //===-- Socket.h ------------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef liblldb_Host_Socket_h_
11 #define liblldb_Host_Socket_h_
16 #include "lldb/lldb-private.h"
18 #include "lldb/Host/Predicate.h"
19 #include "lldb/Host/SocketAddress.h"
20 #include "lldb/Utility/IOObject.h"
21 #include "lldb/Utility/Status.h"
24 #include "lldb/Host/windows/windows.h"
33 namespace lldb_private {
36 typedef SOCKET NativeSocket;
38 typedef int NativeSocket;
41 class Socket : public IOObject {
50 static const NativeSocket kInvalidSocketValue;
54 static std::unique_ptr<Socket> Create(const SocketProtocol protocol,
55 bool child_processes_inherit,
58 virtual Status Connect(llvm::StringRef name) = 0;
59 virtual Status Listen(llvm::StringRef name, int backlog) = 0;
60 virtual Status Accept(Socket *&socket) = 0;
62 // Initialize a Tcp Socket object in listening mode. listen and accept are
63 // implemented separately because the caller may wish to manipulate or query
64 // the socket after it is initialized, but before entering a blocking accept.
65 static Status TcpListen(llvm::StringRef host_and_port,
66 bool child_processes_inherit, Socket *&socket,
67 Predicate<uint16_t> *predicate, int backlog = 5);
68 static Status TcpConnect(llvm::StringRef host_and_port,
69 bool child_processes_inherit, Socket *&socket);
70 static Status UdpConnect(llvm::StringRef host_and_port,
71 bool child_processes_inherit, Socket *&socket);
72 static Status UnixDomainConnect(llvm::StringRef host_and_port,
73 bool child_processes_inherit,
75 static Status UnixDomainAccept(llvm::StringRef host_and_port,
76 bool child_processes_inherit, Socket *&socket);
77 static Status UnixAbstractConnect(llvm::StringRef host_and_port,
78 bool child_processes_inherit,
80 static Status UnixAbstractAccept(llvm::StringRef host_and_port,
81 bool child_processes_inherit,
84 int GetOption(int level, int option_name, int &option_value);
85 int SetOption(int level, int option_name, int option_value);
87 NativeSocket GetNativeSocket() const { return m_socket; }
88 SocketProtocol GetSocketProtocol() const { return m_protocol; }
90 Status Read(void *buf, size_t &num_bytes) override;
91 Status Write(const void *buf, size_t &num_bytes) override;
93 virtual Status PreDisconnect();
94 Status Close() override;
96 bool IsValid() const override { return m_socket != kInvalidSocketValue; }
97 WaitableHandle GetWaitableHandle() override;
99 static bool DecodeHostAndPort(llvm::StringRef host_and_port,
100 std::string &host_str, std::string &port_str,
101 int32_t &port, Status *error_ptr);
104 Socket(SocketProtocol protocol, bool should_close,
105 bool m_child_process_inherit);
107 virtual size_t Send(const void *buf, const size_t num_bytes);
109 static void SetLastError(Status &error);
110 static NativeSocket CreateSocket(const int domain, const int type,
112 bool child_processes_inherit, Status &error);
113 static NativeSocket AcceptSocket(NativeSocket sockfd, struct sockaddr *addr,
115 bool child_processes_inherit, Status &error);
117 SocketProtocol m_protocol;
118 NativeSocket m_socket;
119 bool m_child_processes_inherit;
122 } // namespace lldb_private
124 #endif // liblldb_Host_Socket_h_