apply IPv6 diff for xlxd 2.4.x (conflict not resolved)

This commit is contained in:
SASANO Takayoshi 2021-11-03 04:43:07 +09:00
parent 98db06c331
commit 64070407b0
16 changed files with 331 additions and 134 deletions

View file

@ -31,46 +31,66 @@
////////////////////////////////////////////////////////////////////////////////////////
// constructors
CIp::CIp()
CIp::CIp(const int af)
{
::memset(&m_Addr, 0, sizeof(m_Addr));
m_Addr.sin_family = AF_INET;
::memset(&m_Addr, 0, m_AddrLen = sizeof(struct sockaddr_in));
m_Addr.ss_family = af;
}
CIp::CIp(const char *sz)
{
::memset(&m_Addr, 0, sizeof(m_Addr));
m_Addr.sin_family = AF_INET;
// try xxx.xxx.xxx.xxxx first
m_Addr.sin_addr.s_addr = inet_addr(sz);
if ( m_Addr.sin_addr.s_addr == INADDR_NONE )
struct addrinfo hints, *res;
::memset(&m_Addr, 0, m_AddrLen = sizeof(struct sockaddr_in));
m_Addr.ss_family = AF_INET;
::memset(&hints, 0, sizeof(hints));
if ( getaddrinfo(sz, NULL, &hints, &res) == 0 )
{
// otherwise try to resolve via dns
hostent *record = gethostbyname(sz);
if( record != NULL )
{
m_Addr.sin_addr.s_addr = ((in_addr * )record->h_addr)->s_addr;
}
::memcpy(&m_Addr, res->ai_addr, m_AddrLen = res->ai_addrlen);
freeaddrinfo(res);
}
}
CIp::CIp(const struct sockaddr_in *sa)
CIp::CIp(const struct sockaddr_storage *ss, socklen_t len)
{
::memcpy(&m_Addr, sa, sizeof(m_Addr));
len = ( len < sizeof(m_Addr) ) ? len : sizeof(m_Addr);
::memcpy(&m_Addr, ss, m_AddrLen = len);
}
CIp::CIp(const CIp &ip)
{
::memcpy(&m_Addr, &ip.m_Addr, sizeof(m_Addr));
::memcpy(&m_Addr, &ip.m_Addr, m_AddrLen = ip.m_AddrLen);
}
CIp::CIp(const CIp &ip, uint16 port)
{
::memcpy(&m_Addr, &ip.m_Addr, m_AddrLen = ip.m_AddrLen);
switch (m_Addr.ss_family)
{
case AF_INET:
((struct sockaddr_in *)&m_Addr)->sin_port = htons(port);
break;
case AF_INET6:
((struct sockaddr_in6 *)&m_Addr)->sin6_port = htons(port);
break;
}
}
////////////////////////////////////////////////////////////////////////////////////////
// set
// sockaddr
void CIp::SetSockAddr(struct sockaddr_in *sa)
void CIp::SetSockAddr(struct sockaddr_storage *ss, socklen_t len)
{
::memcpy(&m_Addr, sa, sizeof(m_Addr));
len = ( len < sizeof(m_Addr) ) ? len : sizeof(m_Addr);
::memcpy(&m_Addr, ss, m_AddrLen = len);
}
struct sockaddr_storage *CIp::GetSockAddr(socklen_t &len)
{
len = m_AddrLen;
return &m_Addr;
}
////////////////////////////////////////////////////////////////////////////////////////
@ -78,14 +98,45 @@ void CIp::SetSockAddr(struct sockaddr_in *sa)
bool CIp::operator ==(const CIp &ip) const
{
return ( (ip.m_Addr.sin_family == m_Addr.sin_family) &&
(ip.m_Addr.sin_addr.s_addr == m_Addr.sin_addr.s_addr) &&
(ip.m_Addr.sin_port == m_Addr.sin_port)) ;
if ( ip.m_Addr.ss_family != m_Addr.ss_family )
{
return false;
}
switch (m_Addr.ss_family)
{
case AF_INET:
struct sockaddr_in *pi4, *pm4;
pi4 = (struct sockaddr_in *)&ip.m_Addr;
pm4 = (struct sockaddr_in *)&m_Addr;
return ( (pi4->sin_addr.s_addr == pm4->sin_addr.s_addr) &&
(pi4->sin_port == pm4->sin_port) );
case AF_INET6:
struct sockaddr_in6 *pi6, *pm6;
pi6 = (struct sockaddr_in6 *)&ip.m_Addr;
pm6 = (struct sockaddr_in6 *)&m_Addr;
return ( IN6_ARE_ADDR_EQUAL(&pi6->sin6_addr, &pm6->sin6_addr) &&
(pi6->sin6_port == pm6->sin6_port) );
default:
return false;
}
}
CIp::operator const char *() const
{
return ::inet_ntoa(m_Addr.sin_addr);
switch (m_Addr.ss_family)
{
case AF_INET:
return ::inet_ntop(m_Addr.ss_family,
&((struct sockaddr_in *)&m_Addr)->sin_addr.s_addr,
m_AddrStr, sizeof(m_AddrStr));
case AF_INET6:
return ::inet_ntop(m_Addr.ss_family,
((struct sockaddr_in6 *)&m_Addr)->sin6_addr.s6_addr,
m_AddrStr, sizeof(m_AddrStr));
default:
return ::strncpy(m_AddrStr, "unknown", sizeof(m_AddrStr));
}
}