mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 15:36:04 +00:00
[MSWSOCK] Call explicitly DnsQuery_W. Copy host aliases if available as answer from the query
svn path=/trunk/; revision=74750
This commit is contained in:
parent
0f80ead8ec
commit
1611dc4086
3 changed files with 121 additions and 16 deletions
|
@ -423,7 +423,7 @@ StrA2WHeapAlloc(_In_opt_ HANDLE hHeap,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = MultiByteToWideChar(1252,
|
ret = MultiByteToWideChar(CP_ACP,
|
||||||
0,
|
0,
|
||||||
aStr,
|
aStr,
|
||||||
aStrByteLen,
|
aStrByteLen,
|
||||||
|
@ -464,7 +464,7 @@ StrW2AHeapAlloc(_In_opt_ HANDLE hHeap,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = WideCharToMultiByte(1252,
|
ret = WideCharToMultiByte(CP_ACP,
|
||||||
0,
|
0,
|
||||||
wStr,
|
wStr,
|
||||||
charLen,
|
charLen,
|
||||||
|
@ -553,7 +553,7 @@ StrAryCpyHeapAllocA(_In_opt_ HANDLE hHeap,
|
||||||
if (aCount >= MAX_ARRAY_SIZE)
|
if (aCount >= MAX_ARRAY_SIZE)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
bItmLen = (strlen(*aSrcPtr) + 1) * sizeof(char);
|
bItmLen = strlen(*aSrcPtr) + 1;
|
||||||
aStrByteLen[aCount] = bItmLen;
|
aStrByteLen[aCount] = bItmLen;
|
||||||
|
|
||||||
bLen += sizeof(*aSrcPtr) + bItmLen;
|
bLen += sizeof(*aSrcPtr) + bItmLen;
|
||||||
|
@ -591,3 +591,93 @@ StrAryCpyHeapAllocA(_In_opt_ HANDLE hHeap,
|
||||||
|
|
||||||
return resA;
|
return resA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char**
|
||||||
|
StrAryCpyHeapAllocWToA(_In_opt_ HANDLE hHeap,
|
||||||
|
_In_ WCHAR** wStrAry)
|
||||||
|
{
|
||||||
|
WCHAR** wSrcPtr;
|
||||||
|
char** aDstPtr;
|
||||||
|
char* aDstNextStr;
|
||||||
|
DWORD aStrByteLen[MAX_ARRAY_SIZE];
|
||||||
|
int bLen;
|
||||||
|
int bItmLen;
|
||||||
|
int aCount;
|
||||||
|
int i1;
|
||||||
|
char** resA;
|
||||||
|
int ret;
|
||||||
|
char* aStr;
|
||||||
|
|
||||||
|
if (hHeap == 0)
|
||||||
|
hHeap = GetProcessHeap();
|
||||||
|
|
||||||
|
/* Calculating size of array ... */
|
||||||
|
wSrcPtr = wStrAry;
|
||||||
|
bLen = 0;
|
||||||
|
aCount = 0;
|
||||||
|
|
||||||
|
while (*wSrcPtr != NULL)
|
||||||
|
{
|
||||||
|
if (aCount >= MAX_ARRAY_SIZE)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
bItmLen = wcslen(*wSrcPtr) + 1;
|
||||||
|
aStrByteLen[aCount] = bItmLen;
|
||||||
|
|
||||||
|
bLen += sizeof(*wSrcPtr) + bItmLen;
|
||||||
|
|
||||||
|
wSrcPtr++;
|
||||||
|
aCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* size for NULL-terminator */
|
||||||
|
bLen += sizeof(*wSrcPtr);
|
||||||
|
|
||||||
|
/* get memory */
|
||||||
|
resA = HeapAlloc(hHeap, 0, bLen);
|
||||||
|
|
||||||
|
/* copy data */
|
||||||
|
wSrcPtr = wStrAry;
|
||||||
|
aDstPtr = resA;
|
||||||
|
|
||||||
|
/* pos for the first string */
|
||||||
|
aDstNextStr = (char*)(resA + aCount + 1);
|
||||||
|
for (i1 = 0; i1 < aCount; i1++)
|
||||||
|
{
|
||||||
|
bItmLen = aStrByteLen[i1];
|
||||||
|
|
||||||
|
*aDstPtr = aDstNextStr;
|
||||||
|
|
||||||
|
aStr = HeapAlloc(hHeap, 0, bItmLen);
|
||||||
|
if (aStr == NULL)
|
||||||
|
{
|
||||||
|
HeapFree(hHeap, 0, aStr);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = WideCharToMultiByte(CP_ACP,
|
||||||
|
0,
|
||||||
|
*wSrcPtr,
|
||||||
|
bItmLen,
|
||||||
|
aStr,
|
||||||
|
bItmLen,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
if (ret != bItmLen)
|
||||||
|
{
|
||||||
|
HeapFree(hHeap, 0, aStr);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
RtlCopyMemory(*aDstPtr, aStr, bItmLen);
|
||||||
|
HeapFree(hHeap, 0, aStr);
|
||||||
|
|
||||||
|
aDstNextStr = (char*)((DWORD)aDstNextStr + (DWORD)bItmLen);
|
||||||
|
aDstPtr++;
|
||||||
|
wSrcPtr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* terminate with NULL */
|
||||||
|
*aDstPtr = NULL;
|
||||||
|
|
||||||
|
return resA;
|
||||||
|
}
|
||||||
|
|
|
@ -117,4 +117,13 @@ StrAryCpyHeapAllocA(
|
||||||
_In_opt_ HANDLE hHeap,
|
_In_opt_ HANDLE hHeap,
|
||||||
_In_ char** aStrAry);
|
_In_ char** aStrAry);
|
||||||
|
|
||||||
|
/* strary:
|
||||||
|
ptr1 ... ptrn \0
|
||||||
|
data1 ... datan
|
||||||
|
*/
|
||||||
|
char**
|
||||||
|
StrAryCpyHeapAllocWToA(
|
||||||
|
_In_opt_ HANDLE hHeap,
|
||||||
|
_In_ WCHAR** aStrAry);
|
||||||
|
|
||||||
#endif // _MSWHELPER_H
|
#endif // _MSWHELPER_H
|
||||||
|
|
|
@ -469,12 +469,14 @@ NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data,
|
||||||
_Out_ PWSHOSTINFOINTERN hostinfo)
|
_Out_ PWSHOSTINFOINTERN hostinfo)
|
||||||
{
|
{
|
||||||
HANDLE hHeap = GetProcessHeap();
|
HANDLE hHeap = GetProcessHeap();
|
||||||
DNS_STATUS dns_status = {0};
|
DNS_STATUS dns_status = { 0 };
|
||||||
/* include/WinDNS.h -- look up DNS_RECORD on MSDN */
|
/* include/WinDNS.h -- look up DNS_RECORD on MSDN */
|
||||||
PDNS_RECORD dp;
|
PDNS_RECORDW dp;
|
||||||
PDNS_RECORD curr;
|
PDNS_RECORDW curr;
|
||||||
INT result = ERROR_SUCCESS;
|
INT result = ERROR_SUCCESS;
|
||||||
DWORD dwQueryFlags = DNS_QUERY_STANDARD;
|
DWORD dwQueryFlags = DNS_QUERY_STANDARD;
|
||||||
|
PWCHAR Aliases[WS2_INTERNAL_MAX_ALIAS] = { 0 };
|
||||||
|
int AliasIndex = 0;
|
||||||
|
|
||||||
/* needed to be cleaned up if != NULL */
|
/* needed to be cleaned up if != NULL */
|
||||||
dp = NULL;
|
dp = NULL;
|
||||||
|
@ -492,13 +494,12 @@ NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data,
|
||||||
|
|
||||||
/* DNS_TYPE_A: include/WinDNS.h */
|
/* DNS_TYPE_A: include/WinDNS.h */
|
||||||
/* DnsQuery -- lib/dnsapi/dnsapi/query.c */
|
/* DnsQuery -- lib/dnsapi/dnsapi/query.c */
|
||||||
dns_status = DnsQuery(data->hostnameW,
|
dns_status = DnsQuery_W(data->hostnameW,
|
||||||
DNS_TYPE_A,
|
DNS_TYPE_A,
|
||||||
dwQueryFlags,
|
dwQueryFlags,
|
||||||
/* extra dns servers */ 0,
|
NULL /* extra dns servers */,
|
||||||
&dp,
|
&dp,
|
||||||
0);
|
NULL);
|
||||||
|
|
||||||
if (dns_status == ERROR_INVALID_NAME)
|
if (dns_status == ERROR_INVALID_NAME)
|
||||||
{
|
{
|
||||||
WSASetLastError(WSAEFAULT);
|
WSASetLastError(WSAEFAULT);
|
||||||
|
@ -517,7 +518,10 @@ NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data,
|
||||||
curr = dp;
|
curr = dp;
|
||||||
while ((curr->pNext != NULL) || (curr->wType != DNS_TYPE_A))
|
while ((curr->pNext != NULL) || (curr->wType != DNS_TYPE_A))
|
||||||
{
|
{
|
||||||
/* FIXME build aliases list */
|
if (curr->wType == DNS_TYPE_CNAME)
|
||||||
|
{
|
||||||
|
Aliases[AliasIndex++] = curr->Data.Cname.pNameHost;
|
||||||
|
}
|
||||||
curr = curr->pNext;
|
curr = curr->pNext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -526,10 +530,12 @@ NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data,
|
||||||
result = WSASERVICE_NOT_FOUND;
|
result = WSASERVICE_NOT_FOUND;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
hostinfo->hostnameW = StrCpyHeapAllocW(hHeap, curr->pName);
|
hostinfo->hostnameW = StrCpyHeapAllocW(hHeap, curr->pName);
|
||||||
hostinfo->addr4 = curr->Data.A.IpAddress;
|
hostinfo->addr4 = curr->Data.A.IpAddress;
|
||||||
/* FIXME attach built aliases list */
|
if (AliasIndex)
|
||||||
|
{
|
||||||
|
hostinfo->servaliasesA = StrAryCpyHeapAllocWToA(hHeap, (WCHAR**)&Aliases);
|
||||||
|
}
|
||||||
result = ERROR_SUCCESS;
|
result = ERROR_SUCCESS;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue