Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenstraddr.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS DNS Shared Library 00004 * FILE: lib/dnslib/straddr.c 00005 * PURPOSE: Functions for address<->string conversion. 00006 */ 00007 00008 /* INCLUDES ******************************************************************/ 00009 #include "precomp.h" 00010 00011 /* DATA **********************************************************************/ 00012 00013 /* FUNCTIONS *****************************************************************/ 00014 00015 LPWSTR 00016 WINAPI 00017 Dns_Ip6AddressToReverseName_W(OUT LPWSTR Name, 00018 IN IN6_ADDR Address) 00019 { 00020 /* FIXME */ 00021 return NULL; 00022 } 00023 00024 LPWSTR 00025 WINAPI 00026 Dns_Ip4AddressToReverseName_W(OUT LPWSTR Name, 00027 IN IN_ADDR Address) 00028 { 00029 /* Simply append the ARPA string */ 00030 return Name + (wsprintfW(Name, 00031 L"%u.%u.%u.%u.in-addr.arpa.", 00032 Address.S_un.S_addr >> 24, 00033 Address.S_un.S_addr >> 10, 00034 Address.S_un.S_addr >> 8, 00035 Address.S_un.S_addr) * sizeof(WCHAR)); 00036 } 00037 00038 BOOLEAN 00039 WINAPI 00040 Dns_Ip4ReverseNameToAddress_A(OUT PIN_ADDR Address, 00041 IN LPSTR Name) 00042 { 00043 /* FIXME */ 00044 return FALSE; 00045 } 00046 00047 BOOLEAN 00048 WINAPI 00049 Dns_Ip6ReverseNameToAddress_A(OUT PIN6_ADDR Address, 00050 IN LPSTR Name) 00051 { 00052 /* FIXME */ 00053 return FALSE; 00054 } 00055 00056 BOOLEAN 00057 WINAPI 00058 Dns_Ip6StringToAddress_A(OUT PIN6_ADDR Address, 00059 IN LPSTR Name) 00060 { 00061 PCHAR Terminator; 00062 NTSTATUS Status; 00063 00064 /* Let RTL Do it for us */ 00065 Status = RtlIpv6StringToAddressA(Name, &Terminator, Address); 00066 if (NT_SUCCESS(Status)) return TRUE; 00067 00068 /* We failed */ 00069 return FALSE; 00070 } 00071 00072 BOOLEAN 00073 WINAPI 00074 Dns_Ip6StringToAddress_W(OUT PIN6_ADDR Address, 00075 IN LPWSTR Name) 00076 { 00077 PCHAR Terminator; 00078 NTSTATUS Status; 00079 00080 /* Let RTL Do it for us */ 00081 Status = RtlIpv6StringToAddressW(Name, &Terminator, Address); 00082 if (NT_SUCCESS(Status)) return TRUE; 00083 00084 /* We failed */ 00085 return FALSE; 00086 } 00087 00088 BOOLEAN 00089 WINAPI 00090 Dns_Ip4StringToAddress_A(OUT PIN_ADDR Address, 00091 IN LPSTR Name) 00092 { 00093 ULONG Addr; 00094 00095 /* Use inet_addr to convert it... */ 00096 Addr = inet_addr(Name); 00097 if (Addr == -1) 00098 { 00099 /* Check if it's the wildcard (which is ok...) */ 00100 if (strcmp("255.255.255.255", Name)) return FALSE; 00101 } 00102 00103 /* If we got here, then we suceeded... return the address */ 00104 Address->S_un.S_addr = Addr; 00105 return TRUE; 00106 } 00107 00108 BOOLEAN 00109 WINAPI 00110 Dns_Ip4StringToAddress_W(OUT PIN_ADDR Address, 00111 IN LPWSTR Name) 00112 { 00113 CHAR AnsiName[16]; 00114 ULONG Size = sizeof(AnsiName); 00115 INT ErrorCode; 00116 00117 /* Make a copy of the name in ANSI */ 00118 ErrorCode = Dns_StringCopy(&AnsiName, 00119 &Size, 00120 Name, 00121 0, 00122 UnicodeString, 00123 AnsiString); 00124 if (ErrorCode) 00125 { 00126 /* Copy made sucesfully, now convert it */ 00127 ErrorCode = Dns_Ip4StringToAddress_A(Address, AnsiName); 00128 } 00129 00130 /* Return either 0 bytes copied (failure == false) or conversion status */ 00131 return ErrorCode; 00132 } 00133 00134 BOOLEAN 00135 WINAPI 00136 Dns_Ip4ReverseNameToAddress_W(OUT PIN_ADDR Address, 00137 IN LPWSTR Name) 00138 { 00139 CHAR AnsiName[32]; 00140 ULONG Size = sizeof(AnsiName); 00141 INT ErrorCode; 00142 00143 /* Make a copy of the name in ANSI */ 00144 ErrorCode = Dns_StringCopy(&AnsiName, 00145 &Size, 00146 Name, 00147 0, 00148 UnicodeString, 00149 AnsiString); 00150 if (ErrorCode) 00151 { 00152 /* Copy made sucesfully, now convert it */ 00153 ErrorCode = Dns_Ip4ReverseNameToAddress_A(Address, AnsiName); 00154 } 00155 00156 /* Return either 0 bytes copied (failure == false) or conversion status */ 00157 return ErrorCode; 00158 } 00159 00160 BOOLEAN 00161 WINAPI 00162 Dns_StringToAddressEx(OUT PVOID Address, 00163 IN OUT PULONG AddressSize, 00164 IN PVOID AddressName, 00165 IN OUT PDWORD AddressFamily, 00166 IN BOOLEAN Unicode, 00167 IN BOOLEAN Reverse) 00168 { 00169 DWORD Af = *AddressFamily; 00170 ULONG AddrSize = *AddressSize; 00171 IN6_ADDR Addr; 00172 BOOLEAN Return; 00173 INT ErrorCode; 00174 CHAR AnsiName[INET6_ADDRSTRLEN + sizeof("ip6.arpa.")]; 00175 ULONG Size = sizeof(AnsiName); 00176 00177 /* First check if this is a reverse address string */ 00178 if (Reverse) 00179 { 00180 /* Convert it right now to ANSI as an optimization */ 00181 Dns_StringCopy(AnsiName, 00182 &Size, 00183 AddressName, 00184 0, 00185 UnicodeString, 00186 AnsiString); 00187 00188 /* Use the ANSI Name instead */ 00189 AddressName = AnsiName; 00190 } 00191 00192 /* 00193 * If the caller doesn't know what the family is, we'll assume IPv4 and 00194 * check if we failed or not. If the caller told us it's IPv4, then just 00195 * do IPv4... 00196 */ 00197 if ((Af == AF_UNSPEC) || (Af == AF_INET)) 00198 { 00199 /* Now check if the caller gave us the reverse name or not */ 00200 if (Reverse) 00201 { 00202 /* Get the Address */ 00203 Return = Dns_Ip4ReverseNameToAddress_A((PIN_ADDR)&Addr, AddressName); 00204 } 00205 else 00206 { 00207 /* Check if the caller gave us unicode or not */ 00208 if (Unicode) 00209 { 00210 /* Get the Address */ 00211 Return = Dns_Ip4StringToAddress_W((PIN_ADDR)&Addr, AddressName); 00212 } 00213 else 00214 { 00215 /* Get the Address */ 00216 Return = Dns_Ip4StringToAddress_A((PIN_ADDR)&Addr, AddressName); 00217 } 00218 } 00219 00220 /* Check if we suceeded */ 00221 if (Return) 00222 { 00223 /* Save address family */ 00224 Af = AF_INET; 00225 00226 /* Check if the address size matches */ 00227 if (AddrSize < sizeof(IN_ADDR)) 00228 { 00229 /* Invalid match, set error code */ 00230 ErrorCode = ERROR_MORE_DATA; 00231 } 00232 else 00233 { 00234 /* It matches, save the address! */ 00235 *(PIN_ADDR)Address = *(PIN_ADDR)&Addr; 00236 } 00237 } 00238 } 00239 00240 /* If we are here, either AF_INET6 was specified or IPv4 failed */ 00241 if ((Af == AF_UNSPEC) || (Af == AF_INET6)) 00242 { 00243 /* Now check if the caller gave us the reverse name or not */ 00244 if (Reverse) 00245 { 00246 /* Get the Address */ 00247 Return = Dns_Ip6ReverseNameToAddress_A(&Addr, AddressName); 00248 } 00249 else 00250 { 00251 /* Check if the caller gave us unicode or not */ 00252 if (Unicode) 00253 { 00254 /* Get the Address */ 00255 Return = Dns_Ip6StringToAddress_W(&Addr, AddressName); 00256 } 00257 else 00258 { 00259 /* Get the Address */ 00260 Return = Dns_Ip6StringToAddress_A(&Addr, AddressName); 00261 } 00262 } 00263 00264 /* Check if we suceeded */ 00265 if (Return) 00266 { 00267 /* Save address family */ 00268 Af = AF_INET6; 00269 00270 /* Check if the address size matches */ 00271 if (AddrSize < sizeof(IN6_ADDR)) 00272 { 00273 /* Invalid match, set error code */ 00274 ErrorCode = ERROR_MORE_DATA; 00275 } 00276 else 00277 { 00278 /* It matches, save the address! */ 00279 *(PIN6_ADDR)Address = Addr; 00280 } 00281 } 00282 } 00283 else if (Af != AF_INET) 00284 { 00285 /* You're like.. ATM or something? Get outta here! */ 00286 Af = AF_UNSPEC; 00287 ErrorCode = WSA_INVALID_PARAMETER; 00288 } 00289 00290 /* Set error if we had one */ 00291 if (ErrorCode) SetLastError(ErrorCode); 00292 00293 /* Return the address family and size */ 00294 *AddressFamily = Af; 00295 *AddressSize = AddrSize; 00296 00297 /* Return success or failure */ 00298 return (ErrorCode == ERROR_SUCCESS); 00299 } 00300 00301 BOOLEAN 00302 WINAPI 00303 Dns_StringToAddressW(OUT PVOID Address, 00304 IN OUT PULONG AddressSize, 00305 IN LPWSTR AddressName, 00306 IN OUT PDWORD AddressFamily) 00307 { 00308 /* Call the common API */ 00309 return Dns_StringToAddressEx(Address, 00310 AddressSize, 00311 AddressName, 00312 AddressFamily, 00313 TRUE, 00314 FALSE); 00315 } 00316 00317 BOOLEAN 00318 WINAPI 00319 Dns_StringToDnsAddrEx(OUT PDNS_ADDRESS DnsAddr, 00320 IN PVOID AddressName, 00321 IN DWORD AddressFamily, 00322 IN BOOLEAN Unicode, 00323 IN BOOLEAN Reverse) 00324 { 00325 IN6_ADDR Addr; 00326 BOOLEAN Return; 00327 INT ErrorCode = ERROR_SUCCESS; 00328 CHAR AnsiName[INET6_ADDRSTRLEN + sizeof("ip6.arpa.")]; 00329 ULONG Size = sizeof(AnsiName); 00330 00331 /* First check if this is a reverse address string */ 00332 if ((Reverse) && (Unicode)) 00333 { 00334 /* Convert it right now to ANSI as an optimization */ 00335 Dns_StringCopy(AnsiName, 00336 &Size, 00337 AddressName, 00338 0, 00339 UnicodeString, 00340 AnsiString); 00341 00342 /* Use the ANSI Name instead */ 00343 AddressName = AnsiName; 00344 } 00345 00346 /* 00347 * If the caller doesn't know what the family is, we'll assume IPv4 and 00348 * check if we failed or not. If the caller told us it's IPv4, then just 00349 * do IPv4... 00350 */ 00351 if ((AddressFamily == AF_UNSPEC) || (AddressFamily == AF_INET)) 00352 { 00353 /* Now check if the caller gave us the reverse name or not */ 00354 if (Reverse) 00355 { 00356 /* Get the Address */ 00357 Return = Dns_Ip4ReverseNameToAddress_A((PIN_ADDR)&Addr, AddressName); 00358 } 00359 else 00360 { 00361 /* Check if the caller gave us unicode or not */ 00362 if (Unicode) 00363 { 00364 /* Get the Address */ 00365 Return = Dns_Ip4StringToAddress_W((PIN_ADDR)&Addr, AddressName); 00366 } 00367 else 00368 { 00369 /* Get the Address */ 00370 Return = Dns_Ip4StringToAddress_A((PIN_ADDR)&Addr, AddressName); 00371 } 00372 } 00373 00374 /* Check if we suceeded */ 00375 if (Return) 00376 { 00377 /* Build the IPv4 Address */ 00378 DnsAddr_BuildFromIp4(DnsAddr, *(PIN_ADDR)&Addr, 0); 00379 00380 /* So we don't go in the code below... */ 00381 AddressFamily = AF_INET; 00382 } 00383 } 00384 00385 /* If we are here, either AF_INET6 was specified or IPv4 failed */ 00386 if ((AddressFamily == AF_UNSPEC) || (AddressFamily == AF_INET6)) 00387 { 00388 /* Now check if the caller gave us the reverse name or not */ 00389 if (Reverse) 00390 { 00391 /* Get the Address */ 00392 Return = Dns_Ip6ReverseNameToAddress_A(&Addr, AddressName); 00393 if (Return) 00394 { 00395 /* Build the IPv6 Address */ 00396 DnsAddr_BuildFromIp6(DnsAddr, &Addr, 0, 0); 00397 } 00398 else 00399 { 00400 goto Quickie; 00401 } 00402 } 00403 else 00404 { 00405 /* Check if the caller gave us unicode or not */ 00406 if (Unicode) 00407 { 00408 /* Get the Address */ 00409 if (NT_SUCCESS(RtlIpv6StringToAddressExW(AddressName, 00410 &DnsAddr->Ip6Address.sin6_addr, 00411 &DnsAddr->Ip6Address.sin6_scope_id, 00412 &DnsAddr->Ip6Address.sin6_port))) 00413 Return = TRUE; 00414 else 00415 Return = FALSE; 00416 } 00417 else 00418 { 00419 /* Get the Address */ 00420 if (NT_SUCCESS(RtlIpv6StringToAddressExA(AddressName, 00421 &DnsAddr->Ip6Address.sin6_addr, 00422 &DnsAddr->Ip6Address.sin6_scope_id, 00423 &DnsAddr->Ip6Address.sin6_port))) 00424 Return = TRUE; 00425 else 00426 Return = FALSE; 00427 } 00428 } 00429 00430 /* Check if we suceeded */ 00431 if (Return) 00432 { 00433 /* Finish setting up the structure */ 00434 DnsAddr->Ip6Address.sin6_family = AF_INET6; 00435 DnsAddr->AddressLength = sizeof(SOCKADDR_IN6); 00436 } 00437 } 00438 else if (AddressFamily != AF_INET) 00439 { 00440 /* You're like.. ATM or something? Get outta here! */ 00441 RtlZeroMemory(DnsAddr, sizeof(DNS_ADDRESS)); 00442 SetLastError(WSA_INVALID_PARAMETER); 00443 } 00444 00445 Quickie: 00446 /* Return success or failure */ 00447 return (ErrorCode == ERROR_SUCCESS); 00448 } 00449 00450 BOOLEAN 00451 WINAPI 00452 Dns_ReverseNameToDnsAddr_W(OUT PDNS_ADDRESS DnsAddr, 00453 IN LPWSTR Name) 00454 { 00455 /* Call the common API */ 00456 return Dns_StringToDnsAddrEx(DnsAddr, 00457 Name, 00458 AF_UNSPEC, 00459 TRUE, 00460 TRUE); 00461 } 00462 Generated on Sat May 26 2012 04:34:52 for ReactOS by
1.7.6.1
|