blob: 9eb50cef97a834e8b1385f56f8ec44990f190c9e [file] [log] [blame]
Greg Claytonac304e42011-07-19 16:44:54 +00001//===-- SocketAddress.cpp ---------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Host/SocketAddress.h"
11#include <stddef.h>
12
13// C Includes
14#include <string.h>
15
16// C++ Includes
17// Other libraries and framework includes
18// Project includes
19
20using namespace lldb_private;
21
22//----------------------------------------------------------------------
23// SocketAddress constructor
24//----------------------------------------------------------------------
Greg Claytond5b3e3c2011-07-19 20:03:42 +000025SocketAddress::SocketAddress ()
Greg Claytonac304e42011-07-19 16:44:54 +000026{
27 Clear ();
28}
29
Greg Claytond5b3e3c2011-07-19 20:03:42 +000030SocketAddress::SocketAddress (const struct sockaddr &s)
31{
32 m_socket_addr.sa = s;
33}
34
35
36SocketAddress::SocketAddress (const struct sockaddr_in &s)
37{
38 m_socket_addr.sa_ipv4 = s;
39}
40
41
42SocketAddress::SocketAddress (const struct sockaddr_in6 &s)
43{
44 m_socket_addr.sa_ipv6 = s;
45}
46
47
48SocketAddress::SocketAddress (const struct sockaddr_storage &s)
49{
50 m_socket_addr.sa_storage = s;
51}
52
Greg Claytonac304e42011-07-19 16:44:54 +000053//----------------------------------------------------------------------
54// SocketAddress copy constructor
55//----------------------------------------------------------------------
56SocketAddress::SocketAddress (const SocketAddress& rhs) :
57 m_socket_addr (rhs.m_socket_addr)
58{
59}
60
61//----------------------------------------------------------------------
62// Destructor
63//----------------------------------------------------------------------
64SocketAddress::~SocketAddress()
65{
66}
67
68void
69SocketAddress::Clear ()
70{
71 memset (&m_socket_addr, 0, sizeof(m_socket_addr));
72}
73
74bool
75SocketAddress::IsValid () const
76{
77 return GetLength () != 0;
78}
79
80socklen_t
81SocketAddress::GetLength () const
82{
83 return m_socket_addr.sa.sa_len;
84}
85
86socklen_t
87SocketAddress::GetMaxLength ()
88{
89 return sizeof (sockaddr_t);
90}
91
92void
93SocketAddress::SetLength (socklen_t len)
94{
95 m_socket_addr.sa.sa_len = len;
96}
97
98sa_family_t
99SocketAddress::GetFamily () const
100{
101 return m_socket_addr.sa.sa_family;
102}
103
104void
105SocketAddress::SetFamily (sa_family_t family)
106{
107 m_socket_addr.sa.sa_family = family;
108}
109
110in_port_t
111SocketAddress::GetPort () const
112{
113 switch (GetFamily())
114 {
115 case AF_INET: return m_socket_addr.sa_ipv4.sin_port;
116 case AF_INET6: return m_socket_addr.sa_ipv6.sin6_port;
117 }
118 return 0;
119}
120
Greg Claytond5b3e3c2011-07-19 20:03:42 +0000121bool
122SocketAddress::SetPort (in_port_t port)
123{
124 switch (GetFamily())
125 {
126 case AF_INET:
127 m_socket_addr.sa_ipv4.sin_port = htons(port);
128 return true;
129
130 case AF_INET6:
131 m_socket_addr.sa_ipv6.sin6_port = htons(port);
132 return true;
133 }
134 return false;
135}
136
Greg Claytonac304e42011-07-19 16:44:54 +0000137//----------------------------------------------------------------------
138// SocketAddress assignment operator
139//----------------------------------------------------------------------
140const SocketAddress&
141SocketAddress::operator=(const SocketAddress& rhs)
142{
143 if (this != &rhs)
144 m_socket_addr = rhs.m_socket_addr;
145 return *this;
146}
147
148const SocketAddress&
149SocketAddress::operator=(const struct addrinfo *addr_info)
150{
151 Clear();
152 if (addr_info &&
153 addr_info->ai_addr &&
154 addr_info->ai_addrlen > 0&&
155 addr_info->ai_addrlen <= sizeof m_socket_addr)
156 {
157 ::memcpy (&m_socket_addr,
158 addr_info->ai_addr,
159 addr_info->ai_addrlen);
160 }
161 return *this;
162}
163
Greg Claytond5b3e3c2011-07-19 20:03:42 +0000164const SocketAddress&
165SocketAddress::operator=(const struct sockaddr &s)
166{
167 m_socket_addr.sa = s;
168 return *this;
169}
170
171const SocketAddress&
172SocketAddress::operator=(const struct sockaddr_in &s)
173{
174 m_socket_addr.sa_ipv4 = s;
175 return *this;
176}
177
178const SocketAddress&
179SocketAddress::operator=(const struct sockaddr_in6 &s)
180{
181 m_socket_addr.sa_ipv6 = s;
182 return *this;
183}
184
185const SocketAddress&
186SocketAddress::operator=(const struct sockaddr_storage &s)
187{
188 m_socket_addr.sa_storage = s;
189 return *this;
190}
191
192bool
193SocketAddress::SetAddress (const struct addrinfo *hints_ptr,
194 const char *host,
195 const char *service,
196 struct addrinfo *addr_info_ptr)
197{
198 struct addrinfo *service_info_list = NULL;
199 int err = ::getaddrinfo (host, service, hints_ptr, &service_info_list);
200 if (err == 0 && service_info_list)
201 {
202 if (addr_info_ptr)
203 *addr_info_ptr = *service_info_list;
204 *this = service_info_list;
205 }
206 else
207 Clear();
208
209 :: freeaddrinfo (service_info_list);
210
211 const bool is_valid = IsValid();
212 if (!is_valid)
213 {
214 if (addr_info_ptr)
215 ::memset (addr_info_ptr, 0, sizeof(struct addrinfo));
216 }
217 return IsValid();
218}
Greg Claytonac304e42011-07-19 16:44:54 +0000219
220
Greg Claytond5b3e3c2011-07-19 20:03:42 +0000221bool
222SocketAddress::SetToLocalhost (sa_family_t family, in_port_t port)
223{
224 switch (family)
225 {
226 case AF_INET:
227 SetFamily (AF_INET);
228 if (SetPort (port))
229 {
230 m_socket_addr.sa_ipv4.sin_addr.s_addr = htonl (INADDR_ANY);
231 SetLength (sizeof(m_socket_addr.sa_ipv4));
232 return true;
233 }
234 break;
235
236 case AF_INET6:
237 SetFamily (AF_INET6);
238 if (SetPort (port))
239 {
240 m_socket_addr.sa_ipv6.sin6_addr = in6addr_any;
241 SetLength (sizeof(m_socket_addr.sa_ipv6));
242 return true;
243 }
244 break;
245
246 }
247 Clear();
248 return false;
249}