[Opalvoip-svn] SF.net SVN: opalvoip:[26611] ptlib/trunk
Brought to you by:
csoutheren,
rjongbloed
From: <wil...@us...> - 2011-10-18 07:42:27
|
Revision: 26611 http://opalvoip.svn.sourceforge.net/opalvoip/?rev=26611&view=rev Author: willamowius Date: 2011-10-18 07:42:21 +0000 (Tue, 18 Oct 2011) Log Message: ----------- IPv6 support for PDNS Modified Paths: -------------- ptlib/trunk/include/ptclib/pdns.h ptlib/trunk/src/ptclib/pdns.cxx Modified: ptlib/trunk/include/ptclib/pdns.h =================================================================== --- ptlib/trunk/include/ptclib/pdns.h 2011-10-18 07:41:28 UTC (rev 26610) +++ ptlib/trunk/include/ptclib/pdns.h 2011-10-18 07:42:21 UTC (rev 26611) @@ -106,6 +106,7 @@ #define DNS_TYPE_SRV T_SRV #define DNS_TYPE_MX T_MX #define DNS_TYPE_A T_A +#define DNS_TYPE_AAAA T_AAAA #define DNS_TYPE_NAPTR T_NAPTR #define DnsFreeRecordList 0 #define DNS_QUERY_STANDARD 0 @@ -115,6 +116,10 @@ DWORD IpAddress; } DNS_A_DATA; +typedef struct _DnsAAAAData { + DWORD Ip6Address[4]; +} DNS_AAAA_DATA; + typedef struct { char pNameExchange[MAXDNAME]; WORD wPreference; @@ -168,6 +173,7 @@ union { DNS_A_DATA A; + DNS_AAAA_DATA AAAA; DNS_MX_DATA MX; DNS_PTR_DATA NS; DNS_SRV_DATA SRV; Modified: ptlib/trunk/src/ptclib/pdns.cxx =================================================================== --- ptlib/trunk/src/ptclib/pdns.cxx 2011-10-18 07:41:28 UTC (rev 26610) +++ ptlib/trunk/src/ptclib/pdns.cxx 2011-10-18 07:42:21 UTC (rev 26611) @@ -186,6 +186,15 @@ GETLONG(newRecord->Data.A.IpAddress, data); break; + case T_AAAA: + newRecord = (PDNS_RECORD)malloc(sizeof(DnsRecord)); + memset(newRecord, 0, sizeof(DnsRecord)); + GETLONG(newRecord->Data.AAAA.Ip6Address[0], data); + GETLONG(newRecord->Data.AAAA.Ip6Address[1], data); + GETLONG(newRecord->Data.AAAA.Ip6Address[2], data); + GETLONG(newRecord->Data.AAAA.Ip6Address[3], data); + break; + case T_NS: newRecord = (PDNS_RECORD)malloc(sizeof(DnsRecord)); memset(newRecord, 0, sizeof(DnsRecord)); @@ -345,17 +354,21 @@ record->priority = dnsRecord->Data.SRV.wPriority; record->weight = dnsRecord->Data.SRV.wWeight; - // see if any A records match this hostname + // see if any A or AAAA records match this hostname PDNS_RECORD aRecord = results; while (aRecord != NULL) { if ((dnsRecord->Flags.S.Section == DnsSectionAdditional) && (dnsRecord->wType == DNS_TYPE_A)) { record->hostAddress = PIPSocket::Address(dnsRecord->Data.A.IpAddress); break; } + if ((dnsRecord->Flags.S.Section == DnsSectionAdditional) && (dnsRecord->wType == DNS_TYPE_AAAA)) { + record->hostAddress = PIPSocket::Address(16, (BYTE *)dnsRecord->Data.AAAA.Ip6Address); + break; + } aRecord = aRecord->pNext; } - // if no A record found, then get address the hard way + // if no A or AAAA record found, then get address the hard way if (aRecord == NULL) PIPSocket::GetHostAddress(record->hostName, record->hostAddress); } @@ -506,8 +519,12 @@ user = user + "@"; PIPSocketAddressAndPortVector::const_iterator r; - for (r = info.begin(); r != info.end(); ++r) - returnList.AppendString(user + r->AsString(':')); + for (r = info.begin(); r != info.end(); ++r) { + if (r->GetAddress().GetVersion() == 6) + returnList.AppendString(user + "[" + r->GetAddress().AsString() + "]:" + PString(r->GetPort())); + else + returnList.AppendString(user + r->AsString(':')); + } return returnList.GetSize() != 0;; } @@ -547,7 +564,8 @@ PTRACE(5,"DNS\tSRV Record found " << srvLookupStr); PDNS::SRVRecord * recPtr = srvRecords.GetFirst(); while (recPtr != NULL) { - PIPSocketAddressAndPort addrAndPort(recPtr->hostAddress, recPtr->port > 0 ? recPtr->port : defaultPort); + PIPSocketAddressAndPort addrAndPort; + addrAndPort.SetAddress(recPtr->hostAddress, recPtr->port > 0 ? recPtr->port : defaultPort); addrList.push_back(addrAndPort); recPtr = srvRecords.GetNext(); @@ -605,6 +623,10 @@ record->hostAddress = PIPSocket::Address(dnsRecord->Data.A.IpAddress); break; } + if ((dnsRecord->Flags.S.Section == DnsSectionAdditional) && (dnsRecord->wType == DNS_TYPE_AAAA)) { + record->hostAddress = PIPSocket::Address(16, (BYTE *)dnsRecord->Data.AAAA.Ip6Address); + break; + } aRecord = aRecord->pNext; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |