Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenrecord.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
1.7.6.1
|