ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

record.c
Go to the documentation of this file.
00001 /*
00002  * DNS support
00003  *
00004  * Copyright (C) 2006 Hans Leidekker
00005  * 
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU Lesser General Public
00008  * License as published by the Free Software Foundation; either
00009  * version 2.1 of the License, or (at your option) any later version.
00010  *
00011  * This library is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014  * Lesser General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU Lesser General Public
00017  * License along with this library; if not, write to the Free Software
00018  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00019  */
00020 #include "precomp.h"
00021 
00022 #define NDEBUG
00023 #include <debug.h>
00024 
00025 const char *dns_type_to_str( unsigned short type )
00026 {
00027     switch (type)
00028     {
00029 #define X(x)    case (x): return #x;
00030     X(DNS_TYPE_ZERO)
00031     X(DNS_TYPE_A)
00032     X(DNS_TYPE_NS)
00033     X(DNS_TYPE_MD)
00034     X(DNS_TYPE_MF)
00035     X(DNS_TYPE_CNAME)
00036     X(DNS_TYPE_SOA)
00037     X(DNS_TYPE_MB)
00038     X(DNS_TYPE_MG)
00039     X(DNS_TYPE_MR)
00040     X(DNS_TYPE_NULL)
00041     X(DNS_TYPE_WKS)
00042     X(DNS_TYPE_PTR)
00043     X(DNS_TYPE_HINFO)
00044     X(DNS_TYPE_MINFO)
00045     X(DNS_TYPE_MX)
00046     X(DNS_TYPE_TEXT)
00047     X(DNS_TYPE_RP)
00048     X(DNS_TYPE_AFSDB)
00049     X(DNS_TYPE_X25)
00050     X(DNS_TYPE_ISDN)
00051     X(DNS_TYPE_RT)
00052     X(DNS_TYPE_NSAP)
00053     X(DNS_TYPE_NSAPPTR)
00054     X(DNS_TYPE_SIG)
00055     X(DNS_TYPE_KEY)
00056     X(DNS_TYPE_PX)
00057     X(DNS_TYPE_GPOS)
00058     X(DNS_TYPE_AAAA)
00059     X(DNS_TYPE_LOC)
00060     X(DNS_TYPE_NXT)
00061     X(DNS_TYPE_EID)
00062     X(DNS_TYPE_NIMLOC)
00063     X(DNS_TYPE_SRV)
00064     X(DNS_TYPE_ATMA)
00065     X(DNS_TYPE_NAPTR)
00066     X(DNS_TYPE_KX)
00067     X(DNS_TYPE_CERT)
00068     X(DNS_TYPE_A6)
00069     X(DNS_TYPE_DNAME)
00070     X(DNS_TYPE_SINK)
00071     X(DNS_TYPE_OPT)
00072     X(DNS_TYPE_UINFO)
00073     X(DNS_TYPE_UID)
00074     X(DNS_TYPE_GID)
00075     X(DNS_TYPE_UNSPEC)
00076     X(DNS_TYPE_ADDRS)
00077     X(DNS_TYPE_TKEY)
00078     X(DNS_TYPE_TSIG)
00079     X(DNS_TYPE_IXFR)
00080     X(DNS_TYPE_AXFR)
00081     X(DNS_TYPE_MAILB)
00082     X(DNS_TYPE_MAILA)
00083     X(DNS_TYPE_ANY)
00084     X(DNS_TYPE_WINS)
00085     X(DNS_TYPE_WINSR)
00086 #undef X
00087     default: { static char tmp[7]; sprintf( tmp, "0x%04x", type ); return tmp; }
00088     }
00089 }
00090 
00091 static int dns_strcmpX( LPCVOID str1, LPCVOID str2, BOOL wide )
00092 {
00093     if (wide)
00094         return lstrcmpiW( str1, str2 );
00095     else
00096         return lstrcmpiA( str1, str2 );
00097 }
00098 
00099 /******************************************************************************
00100  * DnsRecordCompare                        [DNSAPI.@]
00101  *
00102  */
00103 BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
00104 {
00105     BOOL wide;
00106     unsigned int i;
00107 
00108     DPRINT( "(%p,%p)\n", r1, r2 );
00109 
00110     if (r1->wType       != r2->wType       ||
00111         r1->wDataLength != r2->wDataLength ||
00112         r1->Flags.DW    != r2->Flags.DW    ||
00113         r1->dwReserved  != r2->dwReserved) return FALSE;
00114 
00115     wide = (r1->Flags.S.CharSet == DnsCharSetUnicode) ? TRUE : FALSE;
00116     if (dns_strcmpX( r1->pName, r2->pName, wide )) return FALSE;
00117 
00118     switch (r1->wType)
00119     {
00120     case DNS_TYPE_A:
00121     {
00122         if (r1->Data.A.IpAddress != r2->Data.A.IpAddress) return FALSE;
00123         break;
00124     }
00125     case DNS_TYPE_SOA:
00126     {
00127         if (r1->Data.SOA.dwSerialNo   != r2->Data.SOA.dwSerialNo ||
00128             r1->Data.SOA.dwRefresh    != r2->Data.SOA.dwRefresh  ||
00129             r1->Data.SOA.dwRetry      != r2->Data.SOA.dwRetry    ||
00130             r1->Data.SOA.dwExpire     != r2->Data.SOA.dwExpire   ||
00131             r1->Data.SOA.dwDefaultTtl != r2->Data.SOA.dwDefaultTtl)
00132             return FALSE;
00133         if (dns_strcmpX( r1->Data.SOA.pNamePrimaryServer,
00134                          r2->Data.SOA.pNamePrimaryServer, wide ) ||
00135             dns_strcmpX( r1->Data.SOA.pNameAdministrator,
00136                          r2->Data.SOA.pNameAdministrator, wide ))
00137             return FALSE;
00138         break;
00139     }
00140     case DNS_TYPE_PTR:
00141     case DNS_TYPE_NS:
00142     case DNS_TYPE_CNAME:
00143     case DNS_TYPE_MB:
00144     case DNS_TYPE_MD:
00145     case DNS_TYPE_MF:
00146     case DNS_TYPE_MG:
00147     case DNS_TYPE_MR:
00148     {
00149         if (dns_strcmpX( r1->Data.PTR.pNameHost,
00150                          r2->Data.PTR.pNameHost, wide )) return FALSE;
00151         break;
00152     }
00153     case DNS_TYPE_MINFO:
00154     case DNS_TYPE_RP:
00155     {
00156         if (dns_strcmpX( r1->Data.MINFO.pNameMailbox,
00157                          r2->Data.MINFO.pNameMailbox, wide ) ||
00158             dns_strcmpX( r1->Data.MINFO.pNameErrorsMailbox,
00159                          r2->Data.MINFO.pNameErrorsMailbox, wide ))
00160             return FALSE;
00161         break;
00162     }
00163     case DNS_TYPE_MX:
00164     case DNS_TYPE_AFSDB:
00165     case DNS_TYPE_RT:
00166     {
00167         if (r1->Data.MX.wPreference != r2->Data.MX.wPreference)
00168             return FALSE;
00169         if (dns_strcmpX( r1->Data.MX.pNameExchange,
00170                          r2->Data.MX.pNameExchange, wide ))
00171             return FALSE;
00172         break;
00173     }
00174     case DNS_TYPE_HINFO:
00175     case DNS_TYPE_ISDN:
00176     case DNS_TYPE_TEXT:
00177     case DNS_TYPE_X25:
00178     {
00179         if (r1->Data.TXT.dwStringCount != r2->Data.TXT.dwStringCount)
00180             return FALSE;
00181         for (i = 0; i < r1->Data.TXT.dwStringCount; i++)
00182         {
00183             if (dns_strcmpX( r1->Data.TXT.pStringArray[i],
00184                              r2->Data.TXT.pStringArray[i], wide ))
00185                 return FALSE;
00186         }
00187         break;
00188     }
00189     case DNS_TYPE_NULL:
00190     {
00191         if (r1->Data.Null.dwByteCount != r2->Data.Null.dwByteCount)
00192             return FALSE;
00193         if (memcmp( r1->Data.Null.Data,
00194                     r2->Data.Null.Data, r1->Data.Null.dwByteCount ))
00195             return FALSE;
00196         break;
00197     }
00198     case DNS_TYPE_AAAA:
00199     {
00200         for (i = 0; i < sizeof(IP6_ADDRESS)/sizeof(DWORD); i++)
00201         {
00202             if (r1->Data.AAAA.Ip6Address.IP6Dword[i] !=
00203                 r2->Data.AAAA.Ip6Address.IP6Dword[i]) return FALSE;
00204         }
00205         break;
00206     }
00207     case DNS_TYPE_KEY:
00208     {
00209         if (r1->Data.KEY.wFlags      != r2->Data.KEY.wFlags      ||
00210             r1->Data.KEY.chProtocol  != r2->Data.KEY.chProtocol  ||
00211             r1->Data.KEY.chAlgorithm != r2->Data.KEY.chAlgorithm)
00212             return FALSE;
00213         if (memcmp( r1->Data.KEY.Key, r2->Data.KEY.Key,
00214                     r1->wDataLength - sizeof(DNS_KEY_DATA) + 1 ))
00215             return FALSE;
00216         break;
00217     }
00218     case DNS_TYPE_SIG:
00219     {
00220         if (dns_strcmpX( r1->Data.SIG.pNameSigner,
00221                          r2->Data.SIG.pNameSigner, wide ))
00222             return FALSE;
00223         if (r1->Data.SIG.wTypeCovered  != r2->Data.SIG.wTypeCovered  ||
00224             r1->Data.SIG.chAlgorithm   != r2->Data.SIG.chAlgorithm   ||
00225             r1->Data.SIG.chLabelCount  != r2->Data.SIG.chLabelCount  ||
00226             r1->Data.SIG.dwOriginalTtl != r2->Data.SIG.dwOriginalTtl ||
00227             r1->Data.SIG.dwExpiration  != r2->Data.SIG.dwExpiration  ||
00228             r1->Data.SIG.dwTimeSigned  != r2->Data.SIG.dwTimeSigned  ||
00229             r1->Data.SIG.wKeyTag       != r2->Data.SIG.wKeyTag)
00230             return FALSE;
00231         if (memcmp( r1->Data.SIG.Signature, r2->Data.SIG.Signature,
00232                     r1->wDataLength - sizeof(DNS_SIG_DATAA) + 1 ))
00233             return FALSE;
00234         break;
00235     }
00236     case DNS_TYPE_ATMA:
00237     {
00238         if (r1->Data.ATMA.AddressType != r2->Data.ATMA.AddressType)
00239             return FALSE;
00240         for (i = 0; i < DNS_ATMA_MAX_ADDR_LENGTH; i++)
00241         {
00242             if (r1->Data.ATMA.Address[i] != r2->Data.ATMA.Address[i])
00243                 return FALSE;
00244         }
00245         break;
00246     }
00247     case DNS_TYPE_NXT:
00248     {
00249         if (dns_strcmpX( r1->Data.NXT.pNameNext,
00250                          r2->Data.NXT.pNameNext, wide )) return FALSE;
00251         if (r1->Data.NXT.wNumTypes != r2->Data.NXT.wNumTypes) return FALSE;
00252         if (memcmp( r1->Data.NXT.wTypes, r2->Data.NXT.wTypes,
00253                     r1->wDataLength - sizeof(DNS_NXT_DATAA) + sizeof(WORD) ))
00254             return FALSE;
00255         break;
00256     }
00257     case DNS_TYPE_SRV:
00258     {
00259         if (dns_strcmpX( r1->Data.SRV.pNameTarget,
00260                          r2->Data.SRV.pNameTarget, wide )) return FALSE;
00261         if (r1->Data.SRV.wPriority != r2->Data.SRV.wPriority ||
00262             r1->Data.SRV.wWeight   != r2->Data.SRV.wWeight   ||
00263             r1->Data.SRV.wPort     != r2->Data.SRV.wPort)
00264             return FALSE;
00265         break;
00266     }
00267     case DNS_TYPE_TKEY:
00268     {
00269         if (dns_strcmpX( r1->Data.TKEY.pNameAlgorithm,
00270                          r2->Data.TKEY.pNameAlgorithm, wide ))
00271             return FALSE;
00272         if (r1->Data.TKEY.dwCreateTime    != r2->Data.TKEY.dwCreateTime     ||
00273             r1->Data.TKEY.dwExpireTime    != r2->Data.TKEY.dwExpireTime     ||
00274             r1->Data.TKEY.wMode           != r2->Data.TKEY.wMode            ||
00275             r1->Data.TKEY.wError          != r2->Data.TKEY.wError           ||
00276             r1->Data.TKEY.wKeyLength      != r2->Data.TKEY.wKeyLength       ||
00277             r1->Data.TKEY.wOtherLength    != r2->Data.TKEY.wOtherLength     ||
00278             r1->Data.TKEY.cAlgNameLength  != r2->Data.TKEY.cAlgNameLength   ||
00279             r1->Data.TKEY.bPacketPointers != r2->Data.TKEY.bPacketPointers)
00280             return FALSE;
00281 
00282         /* FIXME: ignoring pAlgorithmPacket field */
00283         if (memcmp( r1->Data.TKEY.pKey, r2->Data.TKEY.pKey,
00284                     r1->Data.TKEY.wKeyLength ) ||
00285             memcmp( r1->Data.TKEY.pOtherData, r2->Data.TKEY.pOtherData,
00286                     r1->Data.TKEY.wOtherLength )) return FALSE;
00287         break;
00288     }
00289     case DNS_TYPE_TSIG:
00290     {
00291         if (dns_strcmpX( r1->Data.TSIG.pNameAlgorithm,
00292                          r2->Data.TSIG.pNameAlgorithm, wide ))
00293             return FALSE;
00294         if (r1->Data.TSIG.i64CreateTime   != r2->Data.TSIG.i64CreateTime    ||
00295             r1->Data.TSIG.wFudgeTime      != r2->Data.TSIG.wFudgeTime       ||
00296             r1->Data.TSIG.wOriginalXid    != r2->Data.TSIG.wOriginalXid     ||
00297             r1->Data.TSIG.wError          != r2->Data.TSIG.wError           ||
00298             r1->Data.TSIG.wSigLength      != r2->Data.TSIG.wSigLength       ||
00299             r1->Data.TSIG.wOtherLength    != r2->Data.TSIG.wOtherLength     ||
00300             r1->Data.TSIG.cAlgNameLength  != r2->Data.TSIG.cAlgNameLength   ||
00301             r1->Data.TSIG.bPacketPointers != r2->Data.TSIG.bPacketPointers)
00302             return FALSE;
00303 
00304         /* FIXME: ignoring pAlgorithmPacket field */
00305         if (memcmp( r1->Data.TSIG.pSignature, r2->Data.TSIG.pSignature,
00306                     r1->Data.TSIG.wSigLength ) ||
00307             memcmp( r1->Data.TSIG.pOtherData, r2->Data.TSIG.pOtherData,
00308                     r1->Data.TSIG.wOtherLength )) return FALSE;
00309         break;
00310     }
00311     case DNS_TYPE_WINS:
00312     {
00313         if (r1->Data.WINS.dwMappingFlag    != r2->Data.WINS.dwMappingFlag   ||
00314             r1->Data.WINS.dwLookupTimeout  != r2->Data.WINS.dwLookupTimeout ||
00315             r1->Data.WINS.dwCacheTimeout   != r2->Data.WINS.dwCacheTimeout  ||
00316             r1->Data.WINS.cWinsServerCount != r2->Data.WINS.cWinsServerCount)
00317             return FALSE;
00318         if (memcmp( r1->Data.WINS.WinsServers, r2->Data.WINS.WinsServers,
00319                     r1->wDataLength - sizeof(DNS_WINS_DATA) + sizeof(IP4_ADDRESS) ))
00320             return FALSE;
00321         break;
00322     }
00323     case DNS_TYPE_WINSR:
00324     {
00325         if (r1->Data.WINSR.dwMappingFlag   != r2->Data.WINSR.dwMappingFlag   ||
00326             r1->Data.WINSR.dwLookupTimeout != r2->Data.WINSR.dwLookupTimeout ||
00327             r1->Data.WINSR.dwCacheTimeout  != r2->Data.WINSR.dwCacheTimeout)
00328             return FALSE;
00329         if (dns_strcmpX( r1->Data.WINSR.pNameResultDomain,
00330                          r2->Data.WINSR.pNameResultDomain, wide ))
00331             return FALSE;
00332         break;
00333     }
00334     default:
00335         DPRINT1( "unknown type: %s\n", dns_type_to_str( r1->wType ) );
00336         return FALSE;
00337     }
00338     return TRUE;
00339 }
00340 
00341 static LPVOID dns_strcpyX( LPCVOID src, DNS_CHARSET in, DNS_CHARSET out )
00342 {
00343     switch (in)
00344     {
00345     case DnsCharSetUnicode:
00346     {
00347         switch (out)
00348         {
00349         case DnsCharSetUnicode: return dns_strdup_w( src );
00350         case DnsCharSetUtf8:    return dns_strdup_wu( src );
00351         case DnsCharSetAnsi:    return dns_strdup_wa( src );
00352         default:
00353             DPRINT1( "unhandled target charset: %d\n", out );
00354             break;
00355         }
00356     }
00357     case DnsCharSetUtf8:
00358         switch (out)
00359         {
00360         case DnsCharSetUnicode: return dns_strdup_uw( src );
00361         case DnsCharSetUtf8:    return dns_strdup_u( src );
00362         case DnsCharSetAnsi:    return dns_strdup_ua( src );
00363         default:
00364             DPRINT1( "unhandled target charset: %d\n", out );
00365             break;
00366         }
00367     case DnsCharSetAnsi:
00368         switch (out)
00369         {
00370         case DnsCharSetUnicode: return dns_strdup_aw( src );
00371         case DnsCharSetUtf8:    return dns_strdup_au( src );
00372         case DnsCharSetAnsi:    return dns_strdup_a( src );
00373         default:
00374             DPRINT1( "unhandled target charset: %d\n", out );
00375             break;
00376         }
00377     default:
00378         DPRINT1( "unhandled source charset: %d\n", in );
00379         break;
00380     }
00381     return NULL;
00382 }
00383 
00384 /******************************************************************************
00385  * DnsRecordCopyEx                         [DNSAPI.@]
00386  *
00387  */
00388 PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET out )
00389 {
00390     DNS_RECORD *dst;
00391     unsigned int i, size;
00392 
00393     DPRINT( "(%p,%d,%d)\n", src, in, out );
00394 
00395     size = FIELD_OFFSET(DNS_RECORD, Data) + src->wDataLength;
00396     dst = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size );
00397     if (!dst) return NULL;
00398 
00399     memcpy( dst, src, size );
00400 
00401     if (src->Flags.S.CharSet == DnsCharSetUtf8 ||
00402         src->Flags.S.CharSet == DnsCharSetAnsi ||
00403         src->Flags.S.CharSet == DnsCharSetUnicode) in = src->Flags.S.CharSet;
00404 
00405     dst->Flags.S.CharSet = out;
00406     dst->pName = dns_strcpyX( src->pName, in, out );
00407     if (!dst->pName) goto error;
00408 
00409     switch (src->wType)
00410     {
00411     case DNS_TYPE_HINFO:
00412     case DNS_TYPE_ISDN:
00413     case DNS_TYPE_TEXT:
00414     case DNS_TYPE_X25:
00415     {
00416         for (i = 0; i < src->Data.TXT.dwStringCount; i++)
00417         {
00418             dst->Data.TXT.pStringArray[i] =
00419                 dns_strcpyX( src->Data.TXT.pStringArray[i], in, out );
00420 
00421             if (!dst->Data.TXT.pStringArray[i])
00422             {
00423                 while (i > 0) HeapFree( GetProcessHeap(), 0, dst->Data.TXT.pStringArray[--i] );
00424                 goto error;
00425             }
00426         }
00427         break;
00428     }
00429     case DNS_TYPE_MINFO:
00430     case DNS_TYPE_RP:
00431     {
00432         dst->Data.MINFO.pNameMailbox =
00433             dns_strcpyX( src->Data.MINFO.pNameMailbox, in, out );
00434         if (!dst->Data.MINFO.pNameMailbox) goto error;
00435 
00436         dst->Data.MINFO.pNameErrorsMailbox =
00437             dns_strcpyX( src->Data.MINFO.pNameErrorsMailbox, in, out );
00438         if (!dst->Data.MINFO.pNameErrorsMailbox)
00439         {
00440             HeapFree( GetProcessHeap(), 0, dst->Data.MINFO.pNameMailbox );
00441             goto error;
00442         }
00443         break;
00444     }
00445     case DNS_TYPE_AFSDB:
00446     case DNS_TYPE_RT:
00447     case DNS_TYPE_MX:
00448     {
00449         dst->Data.MX.pNameExchange =
00450             dns_strcpyX( src->Data.MX.pNameExchange, in, out );
00451         if (!dst->Data.MX.pNameExchange) goto error;
00452         break;
00453     }
00454     case DNS_TYPE_NXT:
00455     {
00456         dst->Data.NXT.pNameNext =
00457             dns_strcpyX( src->Data.NXT.pNameNext, in, out );
00458         if (!dst->Data.NXT.pNameNext) goto error;
00459         break;
00460     }
00461     case DNS_TYPE_CNAME:
00462     case DNS_TYPE_MB:
00463     case DNS_TYPE_MD:
00464     case DNS_TYPE_MF:
00465     case DNS_TYPE_MG:
00466     case DNS_TYPE_MR:
00467     case DNS_TYPE_NS:
00468     case DNS_TYPE_PTR:
00469     {
00470         dst->Data.PTR.pNameHost =
00471             dns_strcpyX( src->Data.PTR.pNameHost, in, out );
00472         if (!dst->Data.PTR.pNameHost) goto error;
00473         break;
00474     }
00475     case DNS_TYPE_SIG:
00476     {
00477         dst->Data.SIG.pNameSigner =
00478             dns_strcpyX( src->Data.SIG.pNameSigner, in, out );
00479         if (!dst->Data.SIG.pNameSigner) goto error;
00480         break;
00481     }
00482     case DNS_TYPE_SOA:
00483     {
00484         dst->Data.SOA.pNamePrimaryServer =
00485             dns_strcpyX( src->Data.SOA.pNamePrimaryServer, in, out );
00486         if (!dst->Data.SOA.pNamePrimaryServer) goto error;
00487 
00488         dst->Data.SOA.pNameAdministrator =
00489             dns_strcpyX( src->Data.SOA.pNameAdministrator, in, out );
00490         if (!dst->Data.SOA.pNameAdministrator)
00491         {
00492             HeapFree( GetProcessHeap(), 0, dst->Data.SOA.pNamePrimaryServer );
00493             goto error;
00494         }
00495         break;
00496     }
00497     case DNS_TYPE_SRV:
00498     {
00499         dst->Data.SRV.pNameTarget =
00500             dns_strcpyX( src->Data.SRV.pNameTarget, in, out );
00501         if (!dst->Data.SRV.pNameTarget) goto error;
00502         break;
00503     }
00504     default:
00505         break;
00506     }
00507     return dst;
00508 
00509 error:
00510     HeapFree( GetProcessHeap(), 0, dst->pName );
00511     HeapFree( GetProcessHeap(), 0, dst );
00512     return NULL;
00513 }
00514 
00515 /******************************************************************************
00516  * DnsRecordListFree                       [DNSAPI.@]
00517  *
00518  */
00519 VOID WINAPI DnsRecordListFree( PDNS_RECORD list, DNS_FREE_TYPE type )
00520 {
00521     DNS_RECORD *r, *next;
00522     unsigned int i;
00523 
00524     DPRINT( "(%p,%d)\n", list, type );
00525 
00526     if (!list) return;
00527 
00528     switch (type)
00529     {
00530     case DnsFreeRecordList:
00531     {
00532         for (r = list; (list = r); r = next)
00533         {
00534             HeapFree( GetProcessHeap(), 0, r->pName );
00535 
00536             switch (r->wType)
00537             {
00538             case DNS_TYPE_HINFO:
00539             case DNS_TYPE_ISDN:
00540             case DNS_TYPE_TEXT:
00541             case DNS_TYPE_X25:
00542             {
00543                 for (i = 0; i < r->Data.TXT.dwStringCount; i++)
00544                     HeapFree( GetProcessHeap(), 0, r->Data.TXT.pStringArray[i] );
00545 
00546                 break;
00547             }
00548             case DNS_TYPE_MINFO:
00549             case DNS_TYPE_RP:
00550             {
00551                 HeapFree( GetProcessHeap(), 0, r->Data.MINFO.pNameMailbox );
00552                 HeapFree( GetProcessHeap(), 0, r->Data.MINFO.pNameErrorsMailbox );
00553                 break;
00554             }
00555             case DNS_TYPE_AFSDB:
00556             case DNS_TYPE_RT:
00557             case DNS_TYPE_MX:
00558             {
00559                 HeapFree( GetProcessHeap(), 0, r->Data.MX.pNameExchange );
00560                 break;
00561             }
00562             case DNS_TYPE_NXT:
00563             {
00564                 HeapFree( GetProcessHeap(), 0, r->Data.NXT.pNameNext );
00565                 break;
00566             }
00567             case DNS_TYPE_CNAME:
00568             case DNS_TYPE_MB:
00569             case DNS_TYPE_MD:
00570             case DNS_TYPE_MF:
00571             case DNS_TYPE_MG:
00572             case DNS_TYPE_MR:
00573             case DNS_TYPE_NS:
00574             case DNS_TYPE_PTR:
00575             {
00576                 HeapFree( GetProcessHeap(), 0, r->Data.PTR.pNameHost );
00577                 break;
00578             }
00579             case DNS_TYPE_SIG:
00580             {
00581                 HeapFree( GetProcessHeap(), 0, r->Data.SIG.pNameSigner );
00582                 break;
00583             }
00584             case DNS_TYPE_SOA:
00585             {
00586                 HeapFree( GetProcessHeap(), 0, r->Data.SOA.pNamePrimaryServer );
00587                 HeapFree( GetProcessHeap(), 0, r->Data.SOA.pNameAdministrator );
00588                 break;
00589             }
00590             case DNS_TYPE_SRV:
00591             {
00592                 HeapFree( GetProcessHeap(), 0, r->Data.SRV.pNameTarget );
00593                 break;
00594             }
00595             default:
00596                 break;
00597             }
00598 
00599             next = r->pNext;
00600             HeapFree( GetProcessHeap(), 0, r );
00601         }
00602         break;
00603     }
00604     case DnsFreeFlat:
00605     case DnsFreeParsedMessageFields:
00606     {
00607         DPRINT1( "unhandled free type: %d\n", type );
00608         break;
00609     }
00610     default:
00611         DPRINT1( "unknown free type: %d\n", type );
00612         break;
00613     }
00614 }
00615 
00616 /******************************************************************************
00617  * DnsRecordSetCompare                     [DNSAPI.@]
00618  *
00619  */
00620 BOOL WINAPI DnsRecordSetCompare( PDNS_RECORD set1, PDNS_RECORD set2,
00621                                  PDNS_RECORD *diff1, PDNS_RECORD *diff2 )
00622 {
00623     BOOL ret = TRUE;
00624     DNS_RECORD *r, *t, *u;
00625     DNS_RRSET rr1, rr2;
00626 
00627     DPRINT( "(%p,%p,%p,%p)\n", set1, set2, diff1, diff2 );
00628 
00629     if (!set1 && !set2) return FALSE;
00630 
00631     if (diff1) *diff1 = NULL;
00632     if (diff2) *diff2 = NULL;
00633 
00634     if (set1 && !set2)
00635     {
00636         if (diff1) *diff1 = DnsRecordSetCopyEx( set1, 0, set1->Flags.S.CharSet );
00637         return FALSE;
00638     }
00639     if (!set1 && set2)
00640     {
00641         if (diff2) *diff2 = DnsRecordSetCopyEx( set2, 0, set2->Flags.S.CharSet );
00642         return FALSE;
00643     }
00644 
00645     DNS_RRSET_INIT( rr1 );
00646     DNS_RRSET_INIT( rr2 );
00647 
00648     for (r = set1; r; r = r->pNext)
00649     {
00650         for (t = set2; t; t = t->pNext)
00651         {
00652             u = DnsRecordCopyEx( r, r->Flags.S.CharSet, t->Flags.S.CharSet );
00653             if (!u) goto error;
00654 
00655             if (!DnsRecordCompare( t, u ))
00656             {
00657                 DNS_RRSET_ADD( rr1, u );
00658                 ret = FALSE;
00659             }
00660             else DnsRecordListFree( u, DnsFreeRecordList );
00661         }
00662     }
00663 
00664     for (t = set2; t; t = t->pNext)
00665     {
00666         for (r = set1; r; r = r->pNext)
00667         {
00668             u = DnsRecordCopyEx( t, t->Flags.S.CharSet, r->Flags.S.CharSet );
00669             if (!u) goto error;
00670 
00671             if (!DnsRecordCompare( r, u ))
00672             {
00673                 DNS_RRSET_ADD( rr2, u );
00674                 ret = FALSE;
00675             }
00676             else DnsRecordListFree( u, DnsFreeRecordList );
00677         }
00678     }
00679 
00680     DNS_RRSET_TERMINATE( rr1 );
00681     DNS_RRSET_TERMINATE( rr2 );
00682     
00683     if (diff1) *diff1 = rr1.pFirstRR;
00684     else DnsRecordListFree( rr1.pFirstRR, DnsFreeRecordList );
00685 
00686     if (diff2) *diff2 = rr2.pFirstRR;
00687     else DnsRecordListFree( rr2.pFirstRR, DnsFreeRecordList );
00688 
00689     return ret;
00690 
00691 error:
00692     DNS_RRSET_TERMINATE( rr1 );
00693     DNS_RRSET_TERMINATE( rr2 );
00694 
00695     DnsRecordListFree( rr1.pFirstRR, DnsFreeRecordList );
00696     DnsRecordListFree( rr2.pFirstRR, DnsFreeRecordList );
00697     
00698     return FALSE;
00699 }
00700 
00701 /******************************************************************************
00702  * DnsRecordSetCopyEx                      [DNSAPI.@]
00703  *
00704  */
00705 PDNS_RECORD WINAPI DnsRecordSetCopyEx( PDNS_RECORD src_set, DNS_CHARSET in, DNS_CHARSET out )
00706 {
00707     DNS_RRSET dst_set;
00708     DNS_RECORD *src, *dst;
00709 
00710     DPRINT( "(%p,%d,%d)\n", src_set, in, out );
00711 
00712     DNS_RRSET_INIT( dst_set );
00713 
00714     for (src = src_set; (src_set = src); src = src_set->pNext)
00715     {
00716         dst = DnsRecordCopyEx( src, in, out );
00717         if (!dst)
00718         {
00719             DNS_RRSET_TERMINATE( dst_set );
00720             DnsRecordListFree( dst_set.pFirstRR, DnsFreeRecordList );
00721             return NULL;
00722         }
00723         DNS_RRSET_ADD( dst_set, dst );
00724     }
00725 
00726     DNS_RRSET_TERMINATE( dst_set );
00727     return dst_set.pFirstRR;
00728 }
00729 
00730 /******************************************************************************
00731  * DnsRecordSetDetach                      [DNSAPI.@]
00732  *
00733  */
00734 PDNS_RECORD WINAPI DnsRecordSetDetach( PDNS_RECORD set )
00735 {
00736     DNS_RECORD *r, *s;
00737 
00738     DPRINT( "(%p)\n", set );
00739 
00740     for (r = set; (set = r); r = set->pNext)
00741     {
00742         if (r->pNext && !r->pNext->pNext)
00743         {
00744             s = r->pNext;
00745             r->pNext = NULL;
00746             return s;
00747         }
00748     }
00749     return NULL;
00750 }

Generated on Wed May 23 2012 04:21:25 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.