diff options
| -rw-r--r-- | lldb/include/lldb/Core/ConnectionFileDescriptor.h | 12 | ||||
| -rw-r--r-- | lldb/include/lldb/Host/SocketAddress.h | 180 | ||||
| -rw-r--r-- | lldb/lldb.xcodeproj/project.pbxproj | 6 | ||||
| -rw-r--r-- | lldb/source/Core/ConnectionFileDescriptor.cpp | 36 | ||||
| -rw-r--r-- | lldb/source/Host/common/SocketAddress.cpp | 126 |
5 files changed, 327 insertions, 33 deletions
diff --git a/lldb/include/lldb/Core/ConnectionFileDescriptor.h b/lldb/include/lldb/Core/ConnectionFileDescriptor.h index 0ef2d1d4e67..44c98eb11da 100644 --- a/lldb/include/lldb/Core/ConnectionFileDescriptor.h +++ b/lldb/include/lldb/Core/ConnectionFileDescriptor.h @@ -19,6 +19,7 @@ // Other libraries and framework includes // Project includes #include "lldb/Core/Connection.h" +#include "lldb/Host/SocketAddress.h" namespace lldb_private { @@ -96,20 +97,11 @@ protected: eFDTypeSocketUDP // Unconnected UDP socket requiring sendto/recvfrom } FDType; - typedef union sockaddr_tag - { - struct sockaddr sa; - struct sockaddr_in sa_ipv4; - struct sockaddr_in6 sa_ipv6; - struct sockaddr_storage sa_storage; - } sockaddr_t; - - int m_fd_send; int m_fd_recv; FDType m_fd_send_type; FDType m_fd_recv_type; - sockaddr_t m_udp_send_sockaddr; + SocketAddress m_udp_send_sockaddr; bool m_should_close_fd; // True if this class should close the file descriptor when it goes away. uint32_t m_socket_timeout_usec; diff --git a/lldb/include/lldb/Host/SocketAddress.h b/lldb/include/lldb/Host/SocketAddress.h new file mode 100644 index 00000000000..e1fc423a603 --- /dev/null +++ b/lldb/include/lldb/Host/SocketAddress.h @@ -0,0 +1,180 @@ +//===-- SocketAddress.h -----------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_SocketAddress_h_ +#define liblldb_SocketAddress_h_ + +// C Includes +#include <stdint.h> +#include <sys/socket.h> +#include <netdb.h> +#include <netinet/in.h> + +// C++ Includes +// Other libraries and framework includes +// Project includes + +namespace lldb_private { + +class SocketAddress +{ +public: + //------------------------------------------------------------------ + // Constructors and Destructors + //------------------------------------------------------------------ + SocketAddress(); + SocketAddress(const SocketAddress& rhs); + ~SocketAddress(); + + //------------------------------------------------------------------ + // Operators + //------------------------------------------------------------------ + const SocketAddress& + operator=(const SocketAddress& rhs); + + const SocketAddress& + operator=(const struct addrinfo *addr_info); + + void + Clear (); + + socklen_t + GetLength () const; + + static socklen_t + GetMaxLength (); + + void + SetLength (socklen_t len); + + sa_family_t + GetFamily () const; + + void + SetFamily (sa_family_t family); + + in_port_t + GetPort () const; + + bool + IsValid () const; + + struct sockaddr & + sockaddr () + { + return m_socket_addr.sa; + } + + const struct sockaddr & + sockaddr () const + { + return m_socket_addr.sa; + } + + struct sockaddr_in & + sockaddr_in () + { + return m_socket_addr.sa_ipv4; + } + + const struct sockaddr_in & + sockaddr_in () const + { + return m_socket_addr.sa_ipv4; + } + + struct sockaddr_in6 & + sockaddr_in6 () + { + return m_socket_addr.sa_ipv6; + } + + const struct sockaddr_in6 & + sockaddr_in6 () const + { + return m_socket_addr.sa_ipv6; + } + + struct sockaddr_storage & + sockaddr_storage () + { + return m_socket_addr.sa_storage; + } + + + const struct sockaddr_storage & + sockaddr_storage () const + { + return m_socket_addr.sa_storage; + } + //------------------------------------------------------------------ + // Conversion operators to allow getting the contents of this class + // as a subclass + //------------------------------------------------------------------ + + operator struct sockaddr * () + { + return &m_socket_addr.sa; + } + + operator const struct sockaddr * () const + { + return &m_socket_addr.sa; + } + + operator struct sockaddr_in * () + { + return &m_socket_addr.sa_ipv4; + } + + operator const struct sockaddr_in * () const + { + return &m_socket_addr.sa_ipv4; + } + + operator struct sockaddr_in6 * () + { + return &m_socket_addr.sa_ipv6; + } + + operator const struct sockaddr_in6 * () const + { + return &m_socket_addr.sa_ipv6; + } + + operator const struct sockaddr_storage * () const + { + return &m_socket_addr.sa_storage; + } + + operator struct sockaddr_storage * () + { + return &m_socket_addr.sa_storage; + } + +protected: + typedef union sockaddr_tag + { + struct sockaddr sa; + struct sockaddr_in sa_ipv4; + struct sockaddr_in6 sa_ipv6; + struct sockaddr_storage sa_storage; + } sockaddr_t; + + //------------------------------------------------------------------ + // Classes that inherit from SocketAddress can see and modify these + //------------------------------------------------------------------ + sockaddr_t m_socket_addr; +}; + + +} // namespace lldb_private + + +#endif // liblldb_SocketAddress_h_ diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj index e13ef5dc5c5..f8cf9c47b76 100644 --- a/lldb/lldb.xcodeproj/project.pbxproj +++ b/lldb/lldb.xcodeproj/project.pbxproj @@ -367,6 +367,7 @@ 26D265BC136B4269002EEE45 /* lldb-public.h in Headers */ = {isa = PBXBuildFile; fileRef = 26651A14133BEC76005B64B7 /* lldb-public.h */; settings = {ATTRIBUTES = (Public, ); }; }; 26D5E15F135BAEA2006EA0A7 /* OptionGroupArchitecture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26D5E15E135BAEA2006EA0A7 /* OptionGroupArchitecture.cpp */; }; 26D5E163135BB054006EA0A7 /* OptionGroupPlatform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26D5E162135BB054006EA0A7 /* OptionGroupPlatform.cpp */; }; + 26D7E45D13D5E30A007FD12B /* SocketAddress.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26D7E45C13D5E30A007FD12B /* SocketAddress.cpp */; }; 26DB3E161379E7AD0080DC73 /* ABIMacOSX_arm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26DB3E071379E7AD0080DC73 /* ABIMacOSX_arm.cpp */; }; 26DB3E1C1379E7AD0080DC73 /* ABIMacOSX_i386.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26DB3E0F1379E7AD0080DC73 /* ABIMacOSX_i386.cpp */; }; 26DB3E1F1379E7AD0080DC73 /* ABISysV_x86_64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26DB3E131379E7AD0080DC73 /* ABISysV_x86_64.cpp */; }; @@ -1040,6 +1041,8 @@ 26D5E160135BAEB0006EA0A7 /* OptionGroupArchitecture.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OptionGroupArchitecture.h; path = include/lldb/Interpreter/OptionGroupArchitecture.h; sourceTree = "<group>"; }; 26D5E161135BB040006EA0A7 /* OptionGroupPlatform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OptionGroupPlatform.h; path = include/lldb/Interpreter/OptionGroupPlatform.h; sourceTree = "<group>"; }; 26D5E162135BB054006EA0A7 /* OptionGroupPlatform.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OptionGroupPlatform.cpp; path = source/Interpreter/OptionGroupPlatform.cpp; sourceTree = "<group>"; }; + 26D7E45B13D5E2F9007FD12B /* SocketAddress.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SocketAddress.h; path = include/lldb/Host/SocketAddress.h; sourceTree = "<group>"; }; + 26D7E45C13D5E30A007FD12B /* SocketAddress.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SocketAddress.cpp; path = source/Host/common/SocketAddress.cpp; sourceTree = "<group>"; }; 26D9FDC612F784E60003F2EE /* EmulateInstruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulateInstruction.h; path = include/lldb/Core/EmulateInstruction.h; sourceTree = "<group>"; }; 26D9FDC812F784FD0003F2EE /* EmulateInstruction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = EmulateInstruction.cpp; path = source/Core/EmulateInstruction.cpp; sourceTree = "<group>"; }; 26DAFD9711529BC7005A394E /* ExecutionContextScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ExecutionContextScope.h; path = include/lldb/Target/ExecutionContextScope.h; sourceTree = "<group>"; }; @@ -2293,6 +2296,8 @@ 26BC7DD410F1B7D500F91463 /* Host.h */, 26BC7DD510F1B7D500F91463 /* Mutex.h */, 26BC7DD610F1B7D500F91463 /* Predicate.h */, + 26D7E45B13D5E2F9007FD12B /* SocketAddress.h */, + 26D7E45C13D5E30A007FD12B /* SocketAddress.cpp */, 2689B0A4113EE3CD00A4AEDB /* Symbols.h */, 268DA871130095D000C9483A /* Terminal.h */, 26B4E26E112F35F700AB3F64 /* TimeValue.h */, @@ -3349,6 +3354,7 @@ 265205AC13D3E3F700132FE2 /* RegisterContextKDP_x86_64.cpp in Sources */, 2628A4D513D4977900F5487A /* ThreadKDP.cpp in Sources */, 2676045A13D49D2300AB1B6A /* ProcessControl-mig.defs in Sources */, + 26D7E45D13D5E30A007FD12B /* SocketAddress.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/lldb/source/Core/ConnectionFileDescriptor.cpp b/lldb/source/Core/ConnectionFileDescriptor.cpp index 7d221499794..1e749371923 100644 --- a/lldb/source/Core/ConnectionFileDescriptor.cpp +++ b/lldb/source/Core/ConnectionFileDescriptor.cpp @@ -71,11 +71,10 @@ ConnectionFileDescriptor::ConnectionFileDescriptor () : m_fd_recv (-1), m_fd_send_type (eFDTypeFile), m_fd_recv_type (eFDTypeFile), + m_udp_send_sockaddr (), m_should_close_fd (false), m_socket_timeout_usec(0) { - memset (&m_udp_send_sockaddr, 0, sizeof(m_udp_send_sockaddr)); - LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_CONNECTION | LIBLLDB_LOG_OBJECT)); if (log) log->Printf ("%p ConnectionFileDescriptor::ConnectionFileDescriptor ()", this); @@ -87,10 +86,10 @@ ConnectionFileDescriptor::ConnectionFileDescriptor (int fd, bool owns_fd) : m_fd_recv (fd), m_fd_send_type (eFDTypeFile), m_fd_recv_type (eFDTypeFile), + m_udp_send_sockaddr (), m_should_close_fd (owns_fd), m_socket_timeout_usec(0) { - memset (&m_udp_send_sockaddr, 0, sizeof(m_udp_send_sockaddr)); LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_CONNECTION | LIBLLDB_LOG_OBJECT)); if (log) log->Printf ("%p ConnectionFileDescriptor::ConnectionFileDescriptor (fd = %i, owns_fd = %i)", this, fd, owns_fd); @@ -285,8 +284,8 @@ ConnectionFileDescriptor::Read (void *dst, if (SetSocketReceiveTimeout (timeout_usec)) { status = eConnectionStatusSuccess; - sockaddr_t from = m_udp_send_sockaddr; - socklen_t from_len = m_udp_send_sockaddr.sa.sa_len; + SocketAddress from (m_udp_send_sockaddr); + socklen_t from_len = m_udp_send_sockaddr.GetLength(); bytes_read = ::recvfrom (m_fd_recv, dst, dst_len, 0, (struct sockaddr *)&from, &from_len); } break; @@ -401,13 +400,13 @@ ConnectionFileDescriptor::Write (const void *src, size_t src_len, ConnectionStat break; case eFDTypeSocketUDP: // Unconnected UDP socket requiring sendto/recvfrom - assert (m_udp_send_sockaddr.sa_storage.ss_family != 0); + assert (m_udp_send_sockaddr.GetFamily() != 0); bytes_sent = ::sendto (m_fd_send, src, src_len, 0, - &m_udp_send_sockaddr.sa, - m_udp_send_sockaddr.sa.sa_len); + m_udp_send_sockaddr, + m_udp_send_sockaddr.GetLength()); break; } @@ -896,10 +895,7 @@ ConnectionFileDescriptor::ConnectUDP (const char *host_and_port, Error *error_pt if (m_fd_send != -1) { - ::memset (&m_udp_send_sockaddr, 0, sizeof(m_udp_send_sockaddr)); - ::memcpy (&m_udp_send_sockaddr, - service_info_ptr->ai_addr, - service_info_ptr->ai_addrlen); + m_udp_send_sockaddr = service_info_ptr; break; } else @@ -977,18 +973,12 @@ in_port_t ConnectionFileDescriptor::GetSocketPort (int fd) { // We bound to port zero, so we need to figure out which port we actually bound to - sockaddr_t sock_addr; - socklen_t sock_addr_len = sizeof (sock_addr); - if (::getsockname (fd, &sock_addr.sa, &sock_addr_len) == 0) - { - switch (sock_addr.sa.sa_family) - { - case AF_INET: return sock_addr.sa_ipv4.sin_port; - case AF_INET6: return sock_addr.sa_ipv6.sin6_port; - } - } - return 0; + SocketAddress sock_addr; + socklen_t sock_addr_len = sock_addr.GetMaxLength (); + if (::getsockname (fd, sock_addr, &sock_addr_len) == 0) + return sock_addr.GetPort (); + return 0; } // If the read file descriptor is a socket, then return diff --git a/lldb/source/Host/common/SocketAddress.cpp b/lldb/source/Host/common/SocketAddress.cpp new file mode 100644 index 00000000000..b9ad6d03b47 --- /dev/null +++ b/lldb/source/Host/common/SocketAddress.cpp @@ -0,0 +1,126 @@ +//===-- SocketAddress.cpp ---------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Host/SocketAddress.h" +#include <stddef.h> + +// C Includes +#include <string.h> + +// C++ Includes +// Other libraries and framework includes +// Project includes + +using namespace lldb_private; + +//---------------------------------------------------------------------- +// SocketAddress constructor +//---------------------------------------------------------------------- +SocketAddress::SocketAddress() +{ + Clear (); +} + +//---------------------------------------------------------------------- +// SocketAddress copy constructor +//---------------------------------------------------------------------- +SocketAddress::SocketAddress (const SocketAddress& rhs) : + m_socket_addr (rhs.m_socket_addr) +{ +} + +//---------------------------------------------------------------------- +// Destructor +//---------------------------------------------------------------------- +SocketAddress::~SocketAddress() +{ +} + +void +SocketAddress::Clear () +{ + memset (&m_socket_addr, 0, sizeof(m_socket_addr)); +} + +bool +SocketAddress::IsValid () const +{ + return GetLength () != 0; +} + +socklen_t +SocketAddress::GetLength () const +{ + return m_socket_addr.sa.sa_len; +} + +socklen_t +SocketAddress::GetMaxLength () +{ + return sizeof (sockaddr_t); +} + +void +SocketAddress::SetLength (socklen_t len) +{ + m_socket_addr.sa.sa_len = len; +} + +sa_family_t +SocketAddress::GetFamily () const +{ + return m_socket_addr.sa.sa_family; +} + +void +SocketAddress::SetFamily (sa_family_t family) +{ + m_socket_addr.sa.sa_family = family; +} + +in_port_t +SocketAddress::GetPort () const +{ + switch (GetFamily()) + { + case AF_INET: return m_socket_addr.sa_ipv4.sin_port; + case AF_INET6: return m_socket_addr.sa_ipv6.sin6_port; + } + return 0; +} + +//---------------------------------------------------------------------- +// SocketAddress assignment operator +//---------------------------------------------------------------------- +const SocketAddress& +SocketAddress::operator=(const SocketAddress& rhs) +{ + if (this != &rhs) + m_socket_addr = rhs.m_socket_addr; + return *this; +} + +const SocketAddress& +SocketAddress::operator=(const struct addrinfo *addr_info) +{ + Clear(); + if (addr_info && + addr_info->ai_addr && + addr_info->ai_addrlen > 0&& + addr_info->ai_addrlen <= sizeof m_socket_addr) + { + ::memcpy (&m_socket_addr, + addr_info->ai_addr, + addr_info->ai_addrlen); + } + return *this; +} + + + |

