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