Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS DNS Shared Library * FILE: lib/dnslib/straddr.c * PURPOSE: Functions for address<->string conversion. */
/* INCLUDES ******************************************************************/#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/
LPWSTRWINAPIDns_Ip6AddressToReverseName_W(OUT LPWSTR Name, IN IN6_ADDR Address){ /* FIXME */ return NULL;}
LPWSTRWINAPIDns_Ip4AddressToReverseName_W(OUT LPWSTR Name, IN IN_ADDR Address){ /* Simply append the ARPA string */ return Name + (wsprintfW(Name, L"%u.%u.%u.%u.in-addr.arpa.", Address.S_un.S_addr >> 24, Address.S_un.S_addr >> 10, Address.S_un.S_addr >> 8, Address.S_un.S_addr) * sizeof(WCHAR));}
BOOLEANWINAPIDns_Ip4ReverseNameToAddress_A(OUT PIN_ADDR Address, IN LPSTR Name){ /* FIXME */ return FALSE;}
BOOLEANWINAPIDns_Ip6ReverseNameToAddress_A(OUT PIN6_ADDR Address, IN LPSTR Name){ /* FIXME */ return FALSE;}
BOOLEANWINAPIDns_Ip6StringToAddress_A(OUT PIN6_ADDR Address, IN LPSTR Name){ PCHAR Terminator; NTSTATUS Status;
/* Let RTL Do it for us */ Status = RtlIpv6StringToAddressA(Name, &Terminator, Address); if (NT_SUCCESS(Status)) return TRUE;
/* We failed */ return FALSE;}
BOOLEANWINAPIDns_Ip6StringToAddress_W(OUT PIN6_ADDR Address, IN LPWSTR Name){ PCHAR Terminator; NTSTATUS Status;
/* Let RTL Do it for us */ Status = RtlIpv6StringToAddressW(Name, &Terminator, Address); if (NT_SUCCESS(Status)) return TRUE;
/* We failed */ return FALSE;}
BOOLEANWINAPIDns_Ip4StringToAddress_A(OUT PIN_ADDR Address, IN LPSTR Name){ ULONG Addr;
/* Use inet_addr to convert it... */ Addr = inet_addr(Name); if (Addr == -1) { /* Check if it's the wildcard (which is ok...) */ if (strcmp("255.255.255.255", Name)) return FALSE; }
/* If we got here, then we suceeded... return the address */ Address->S_un.S_addr = Addr; return TRUE;}
BOOLEANWINAPIDns_Ip4StringToAddress_W(OUT PIN_ADDR Address, IN LPWSTR Name){ CHAR AnsiName[16]; ULONG Size = sizeof(AnsiName); INT ErrorCode;
/* Make a copy of the name in ANSI */ ErrorCode = Dns_StringCopy(&AnsiName, &Size, Name, 0, UnicodeString, AnsiString); if (ErrorCode) { /* Copy made sucesfully, now convert it */ ErrorCode = Dns_Ip4StringToAddress_A(Address, AnsiName); }
/* Return either 0 bytes copied (failure == false) or conversion status */ return ErrorCode;}
BOOLEANWINAPIDns_Ip4ReverseNameToAddress_W(OUT PIN_ADDR Address, IN LPWSTR Name){ CHAR AnsiName[32]; ULONG Size = sizeof(AnsiName); INT ErrorCode;
/* Make a copy of the name in ANSI */ ErrorCode = Dns_StringCopy(&AnsiName, &Size, Name, 0, UnicodeString, AnsiString); if (ErrorCode) { /* Copy made sucesfully, now convert it */ ErrorCode = Dns_Ip4ReverseNameToAddress_A(Address, AnsiName); }
/* Return either 0 bytes copied (failure == false) or conversion status */ return ErrorCode;}
BOOLEANWINAPIDns_StringToAddressEx(OUT PVOID Address, IN OUT PULONG AddressSize, IN PVOID AddressName, IN OUT PDWORD AddressFamily, IN BOOLEAN Unicode, IN BOOLEAN Reverse){ DWORD Af = *AddressFamily; ULONG AddrSize = *AddressSize; IN6_ADDR Addr; BOOLEAN Return; INT ErrorCode = ERROR_SUCCESS; CHAR AnsiName[INET6_ADDRSTRLEN + sizeof("ip6.arpa.")]; ULONG Size = sizeof(AnsiName);
/* First check if this is a reverse address string */ if (Reverse) { /* Convert it right now to ANSI as an optimization */ Dns_StringCopy(AnsiName, &Size, AddressName, 0, UnicodeString, AnsiString);
/* Use the ANSI Name instead */ AddressName = AnsiName; }
/* * If the caller doesn't know what the family is, we'll assume IPv4 and * check if we failed or not. If the caller told us it's IPv4, then just * do IPv4... */ if ((Af == AF_UNSPEC) || (Af == AF_INET)) { /* Now check if the caller gave us the reverse name or not */ if (Reverse) { /* Get the Address */ Return = Dns_Ip4ReverseNameToAddress_A((PIN_ADDR)&Addr, AddressName); } else { /* Check if the caller gave us unicode or not */ if (Unicode) { /* Get the Address */ Return = Dns_Ip4StringToAddress_W((PIN_ADDR)&Addr, AddressName); } else { /* Get the Address */ Return = Dns_Ip4StringToAddress_A((PIN_ADDR)&Addr, AddressName); } }
/* Check if we suceeded */ if (Return) { /* Save address family */ Af = AF_INET;
/* Check if the address size matches */ if (AddrSize < sizeof(IN_ADDR)) { /* Invalid match, set error code */ ErrorCode = ERROR_MORE_DATA; } else { /* It matches, save the address! */ *(PIN_ADDR)Address = *(PIN_ADDR)&Addr; } } }
/* If we are here, either AF_INET6 was specified or IPv4 failed */ if ((Af == AF_UNSPEC) || (Af == AF_INET6)) { /* Now check if the caller gave us the reverse name or not */ if (Reverse) { /* Get the Address */ Return = Dns_Ip6ReverseNameToAddress_A(&Addr, AddressName); } else { /* Check if the caller gave us unicode or not */ if (Unicode) { /* Get the Address */ Return = Dns_Ip6StringToAddress_W(&Addr, AddressName); } else { /* Get the Address */ Return = Dns_Ip6StringToAddress_A(&Addr, AddressName); } }
/* Check if we suceeded */ if (Return) { /* Save address family */ Af = AF_INET6;
/* Check if the address size matches */ if (AddrSize < sizeof(IN6_ADDR)) { /* Invalid match, set error code */ ErrorCode = ERROR_MORE_DATA; } else { /* It matches, save the address! */ *(PIN6_ADDR)Address = Addr; } } } else if (Af != AF_INET) { /* You're like.. ATM or something? Get outta here! */ Af = AF_UNSPEC; ErrorCode = WSA_INVALID_PARAMETER; }
/* Set error if we had one */ if (ErrorCode) SetLastError(ErrorCode);
/* Return the address family and size */ *AddressFamily = Af; *AddressSize = AddrSize;
/* Return success or failure */ return (ErrorCode == ERROR_SUCCESS);}
BOOLEANWINAPIDns_StringToAddressW(OUT PVOID Address, IN OUT PULONG AddressSize, IN LPWSTR AddressName, IN OUT PDWORD AddressFamily){ /* Call the common API */ return Dns_StringToAddressEx(Address, AddressSize, AddressName, AddressFamily, TRUE, FALSE);}
BOOLEANWINAPIDns_StringToDnsAddrEx(OUT PDNS_ADDRESS DnsAddr, IN PVOID AddressName, IN DWORD AddressFamily, IN BOOLEAN Unicode, IN BOOLEAN Reverse){ IN6_ADDR Addr; BOOLEAN Return; INT ErrorCode = ERROR_SUCCESS; CHAR AnsiName[INET6_ADDRSTRLEN + sizeof("ip6.arpa.")]; ULONG Size = sizeof(AnsiName);
/* First check if this is a reverse address string */ if ((Reverse) && (Unicode)) { /* Convert it right now to ANSI as an optimization */ Dns_StringCopy(AnsiName, &Size, AddressName, 0, UnicodeString, AnsiString);
/* Use the ANSI Name instead */ AddressName = AnsiName; }
/* * If the caller doesn't know what the family is, we'll assume IPv4 and * check if we failed or not. If the caller told us it's IPv4, then just * do IPv4... */ if ((AddressFamily == AF_UNSPEC) || (AddressFamily == AF_INET)) { /* Now check if the caller gave us the reverse name or not */ if (Reverse) { /* Get the Address */ Return = Dns_Ip4ReverseNameToAddress_A((PIN_ADDR)&Addr, AddressName); } else { /* Check if the caller gave us unicode or not */ if (Unicode) { /* Get the Address */ Return = Dns_Ip4StringToAddress_W((PIN_ADDR)&Addr, AddressName); } else { /* Get the Address */ Return = Dns_Ip4StringToAddress_A((PIN_ADDR)&Addr, AddressName); } }
/* Check if we suceeded */ if (Return) { /* Build the IPv4 Address */ DnsAddr_BuildFromIp4(DnsAddr, *(PIN_ADDR)&Addr, 0);
/* So we don't go in the code below... */ AddressFamily = AF_INET; } }
/* If we are here, either AF_INET6 was specified or IPv4 failed */ if ((AddressFamily == AF_UNSPEC) || (AddressFamily == AF_INET6)) { /* Now check if the caller gave us the reverse name or not */ if (Reverse) { /* Get the Address */ Return = Dns_Ip6ReverseNameToAddress_A(&Addr, AddressName); if (Return) { /* Build the IPv6 Address */ DnsAddr_BuildFromIp6(DnsAddr, &Addr, 0, 0); } else { goto Quickie; } } else { /* Check if the caller gave us unicode or not */ if (Unicode) { /* Get the Address */ if (NT_SUCCESS(RtlIpv6StringToAddressExW(AddressName, &DnsAddr->Ip6Address.sin6_addr, &DnsAddr->Ip6Address.sin6_scope_id, &DnsAddr->Ip6Address.sin6_port))) Return = TRUE; else Return = FALSE; } else { /* Get the Address */ if (NT_SUCCESS(RtlIpv6StringToAddressExA(AddressName, &DnsAddr->Ip6Address.sin6_addr, &DnsAddr->Ip6Address.sin6_scope_id, &DnsAddr->Ip6Address.sin6_port))) Return = TRUE; else Return = FALSE; } }
/* Check if we suceeded */ if (Return) { /* Finish setting up the structure */ DnsAddr->Ip6Address.sin6_family = AF_INET6; DnsAddr->AddressLength = sizeof(SOCKADDR_IN6); } } else if (AddressFamily != AF_INET) { /* You're like.. ATM or something? Get outta here! */ RtlZeroMemory(DnsAddr, sizeof(DNS_ADDRESS)); SetLastError(WSA_INVALID_PARAMETER); }
Quickie: /* Return success or failure */ return (ErrorCode == ERROR_SUCCESS);}
BOOLEANWINAPIDns_ReverseNameToDnsAddr_W(OUT PDNS_ADDRESS DnsAddr, IN LPWSTR Name){ /* Call the common API */ return Dns_StringToDnsAddrEx(DnsAddr, Name, AF_UNSPEC, TRUE, TRUE);}