mirror of
https://github.com/reactos/reactos.git
synced 2025-07-31 21:01:54 +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;
|
||||
}
|
||||
|
||||
ret = MultiByteToWideChar(1252,
|
||||
ret = MultiByteToWideChar(CP_ACP,
|
||||
0,
|
||||
aStr,
|
||||
aStrByteLen,
|
||||
|
@ -464,7 +464,7 @@ StrW2AHeapAlloc(_In_opt_ HANDLE hHeap,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
ret = WideCharToMultiByte(1252,
|
||||
ret = WideCharToMultiByte(CP_ACP,
|
||||
0,
|
||||
wStr,
|
||||
charLen,
|
||||
|
@ -553,7 +553,7 @@ StrAryCpyHeapAllocA(_In_opt_ HANDLE hHeap,
|
|||
if (aCount >= MAX_ARRAY_SIZE)
|
||||
return NULL;
|
||||
|
||||
bItmLen = (strlen(*aSrcPtr) + 1) * sizeof(char);
|
||||
bItmLen = strlen(*aSrcPtr) + 1;
|
||||
aStrByteLen[aCount] = bItmLen;
|
||||
|
||||
bLen += sizeof(*aSrcPtr) + bItmLen;
|
||||
|
@ -591,3 +591,93 @@ StrAryCpyHeapAllocA(_In_opt_ HANDLE hHeap,
|
|||
|
||||
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_ char** aStrAry);
|
||||
|
||||
/* strary:
|
||||
ptr1 ... ptrn \0
|
||||
data1 ... datan
|
||||
*/
|
||||
char**
|
||||
StrAryCpyHeapAllocWToA(
|
||||
_In_opt_ HANDLE hHeap,
|
||||
_In_ WCHAR** aStrAry);
|
||||
|
||||
#endif // _MSWHELPER_H
|
||||
|
|
|
@ -469,12 +469,14 @@ NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data,
|
|||
_Out_ PWSHOSTINFOINTERN hostinfo)
|
||||
{
|
||||
HANDLE hHeap = GetProcessHeap();
|
||||
DNS_STATUS dns_status = {0};
|
||||
DNS_STATUS dns_status = { 0 };
|
||||
/* include/WinDNS.h -- look up DNS_RECORD on MSDN */
|
||||
PDNS_RECORD dp;
|
||||
PDNS_RECORD curr;
|
||||
PDNS_RECORDW dp;
|
||||
PDNS_RECORDW curr;
|
||||
INT result = ERROR_SUCCESS;
|
||||
DWORD dwQueryFlags = DNS_QUERY_STANDARD;
|
||||
PWCHAR Aliases[WS2_INTERNAL_MAX_ALIAS] = { 0 };
|
||||
int AliasIndex = 0;
|
||||
|
||||
/* needed to be cleaned up if != NULL */
|
||||
dp = NULL;
|
||||
|
@ -492,13 +494,12 @@ NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data,
|
|||
|
||||
/* DNS_TYPE_A: include/WinDNS.h */
|
||||
/* DnsQuery -- lib/dnsapi/dnsapi/query.c */
|
||||
dns_status = DnsQuery(data->hostnameW,
|
||||
DNS_TYPE_A,
|
||||
dwQueryFlags,
|
||||
/* extra dns servers */ 0,
|
||||
&dp,
|
||||
0);
|
||||
|
||||
dns_status = DnsQuery_W(data->hostnameW,
|
||||
DNS_TYPE_A,
|
||||
dwQueryFlags,
|
||||
NULL /* extra dns servers */,
|
||||
&dp,
|
||||
NULL);
|
||||
if (dns_status == ERROR_INVALID_NAME)
|
||||
{
|
||||
WSASetLastError(WSAEFAULT);
|
||||
|
@ -517,7 +518,10 @@ NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data,
|
|||
curr = dp;
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -526,10 +530,12 @@ NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data,
|
|||
result = WSASERVICE_NOT_FOUND;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
hostinfo->hostnameW = StrCpyHeapAllocW(hHeap, curr->pName);
|
||||
hostinfo->addr4 = curr->Data.A.IpAddress;
|
||||
/* FIXME attach built aliases list */
|
||||
if (AliasIndex)
|
||||
{
|
||||
hostinfo->servaliasesA = StrAryCpyHeapAllocWToA(hHeap, (WCHAR**)&Aliases);
|
||||
}
|
||||
result = ERROR_SUCCESS;
|
||||
|
||||
cleanup:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue