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

straddr.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 doxygen 1.7.6.1

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