mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 16:02:56 +00:00
[MSWSOCK] Change functions to be able to use control flags with DnsQuery.
Add host aliases to hostent if available and requested. Only copy servent aliases if available and requested. svn path=/trunk/; revision=74730
This commit is contained in:
parent
50313aa5c8
commit
cc95312078
3 changed files with 67 additions and 38 deletions
|
@ -226,6 +226,7 @@ mswBufferAppendStrLstA(_Inout_ PMSW_BUFFER mswBuf,
|
||||||
BOOL
|
BOOL
|
||||||
mswBufferAppendBlob_Hostent(_Inout_ PMSW_BUFFER mswBuf,
|
mswBufferAppendBlob_Hostent(_Inout_ PMSW_BUFFER mswBuf,
|
||||||
_Inout_ LPWSAQUERYSETW lpRes,
|
_Inout_ LPWSAQUERYSETW lpRes,
|
||||||
|
_In_ char** hostAliasesA,
|
||||||
_In_ char* hostnameA,
|
_In_ char* hostnameA,
|
||||||
_In_ DWORD ip4addr)
|
_In_ DWORD ip4addr)
|
||||||
{
|
{
|
||||||
|
@ -256,8 +257,18 @@ mswBufferAppendBlob_Hostent(_Inout_ PMSW_BUFFER mswBuf,
|
||||||
/* aliases */
|
/* aliases */
|
||||||
phe->h_aliases = (char**)(mswBufferEndPtr(mswBuf) - bytesOfs);
|
phe->h_aliases = (char**)(mswBufferEndPtr(mswBuf) - bytesOfs);
|
||||||
|
|
||||||
|
if (hostAliasesA)
|
||||||
|
{
|
||||||
|
if (!mswBufferAppendStrLstA(mswBuf,
|
||||||
|
(void**)hostAliasesA,
|
||||||
|
-(DWORD)bytesOfs))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (!mswBufferAppendPtr(mswBuf, NULL))
|
if (!mswBufferAppendPtr(mswBuf, NULL))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* addr_list */
|
/* addr_list */
|
||||||
RtlZeroMemory(lst, sizeof(lst));
|
RtlZeroMemory(lst, sizeof(lst));
|
||||||
|
@ -308,10 +319,18 @@ mswBufferAppendBlob_Servent(_Inout_ PMSW_BUFFER mswBuf,
|
||||||
|
|
||||||
pse->s_aliases = (char**)(mswBufferEndPtr(mswBuf) - bytesOfs);
|
pse->s_aliases = (char**)(mswBufferEndPtr(mswBuf) - bytesOfs);
|
||||||
|
|
||||||
|
if (serviceAliasesA)
|
||||||
|
{
|
||||||
if (!mswBufferAppendStrLstA(mswBuf,
|
if (!mswBufferAppendStrLstA(mswBuf,
|
||||||
(void**)serviceAliasesA,
|
(void**)serviceAliasesA,
|
||||||
-(DWORD)bytesOfs))
|
-(DWORD)bytesOfs))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!mswBufferAppendPtr(mswBuf, NULL))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
pse->s_name = (char*)(mswBufferEndPtr(mswBuf) - bytesOfs);
|
pse->s_name = (char*)(mswBufferEndPtr(mswBuf) - bytesOfs);
|
||||||
|
|
||||||
|
|
|
@ -69,6 +69,7 @@ BOOL
|
||||||
mswBufferAppendBlob_Hostent(
|
mswBufferAppendBlob_Hostent(
|
||||||
_Inout_ PMSW_BUFFER mswBuf,
|
_Inout_ PMSW_BUFFER mswBuf,
|
||||||
_Inout_ LPWSAQUERYSETW lpRes,
|
_Inout_ LPWSAQUERYSETW lpRes,
|
||||||
|
_In_ char** hostAliasesA,
|
||||||
_In_ char* hostnameA,
|
_In_ char* hostnameA,
|
||||||
_In_ DWORD ip4addr);
|
_In_ DWORD ip4addr);
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,7 @@ NSP_LookupServiceBeginW(
|
||||||
INT
|
INT
|
||||||
NSP_LookupServiceNextW(
|
NSP_LookupServiceNextW(
|
||||||
_In_ PWSHANDLEINTERN data,
|
_In_ PWSHANDLEINTERN data,
|
||||||
_In_ DWORD CallID,
|
_In_ DWORD dwControlFlags,
|
||||||
_Inout_ LPWSAQUERYSETW lpRes,
|
_Inout_ LPWSAQUERYSETW lpRes,
|
||||||
_Inout_ LPDWORD lpResLen);
|
_Inout_ LPDWORD lpResLen);
|
||||||
|
|
||||||
|
@ -116,14 +116,14 @@ NSP_GetHostNameHeapAllocW(
|
||||||
|
|
||||||
INT
|
INT
|
||||||
NSP_GetHostByNameHeapAllocW(
|
NSP_GetHostByNameHeapAllocW(
|
||||||
_In_ WCHAR* name,
|
_In_ PWSHANDLEINTERN data,
|
||||||
_In_ GUID* lpProviderId,
|
_In_ DWORD dwControlFlags,
|
||||||
_Out_ PWSHOSTINFOINTERN hostinfo);
|
_Out_ PWSHOSTINFOINTERN hostinfo);
|
||||||
|
|
||||||
INT
|
INT
|
||||||
NSP_GetServiceByNameHeapAllocW(
|
NSP_GetServiceByNameHeapAllocW(
|
||||||
_In_ WCHAR* nameW,
|
_In_ PWSHANDLEINTERN data,
|
||||||
_In_ GUID* lpProviderId,
|
_In_ DWORD dwControlFlags,
|
||||||
_Out_ PWSHOSTINFOINTERN hostinfo);
|
_Out_ PWSHOSTINFOINTERN hostinfo);
|
||||||
|
|
||||||
/* Implementations - Internal */
|
/* Implementations - Internal */
|
||||||
|
@ -303,7 +303,7 @@ mwsNSPLookupServiceNext(_In_ HANDLE hLookup,
|
||||||
lpqsResults->dwSize = sizeof(*lpqsResults);
|
lpqsResults->dwSize = sizeof(*lpqsResults);
|
||||||
|
|
||||||
wsaErr = NSP_LookupServiceNextW(pLook,
|
wsaErr = NSP_LookupServiceNextW(pLook,
|
||||||
pLook->CallID,
|
dwControlFlags,
|
||||||
lpqsResults,
|
lpqsResults,
|
||||||
lpdwBufferLength);
|
lpdwBufferLength);
|
||||||
|
|
||||||
|
@ -464,8 +464,8 @@ NSP_GetHostNameHeapAllocW(_Out_ WCHAR** hostname)
|
||||||
}
|
}
|
||||||
|
|
||||||
INT
|
INT
|
||||||
NSP_GetHostByNameHeapAllocW(_In_ WCHAR* name,
|
NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data,
|
||||||
_In_ GUID* lpProviderId,
|
_In_ DWORD dwControlFlags,
|
||||||
_Out_ PWSHOSTINFOINTERN hostinfo)
|
_Out_ PWSHOSTINFOINTERN hostinfo)
|
||||||
{
|
{
|
||||||
HANDLE hHeap = GetProcessHeap();
|
HANDLE hHeap = GetProcessHeap();
|
||||||
|
@ -474,21 +474,27 @@ NSP_GetHostByNameHeapAllocW(_In_ WCHAR* name,
|
||||||
PDNS_RECORD dp;
|
PDNS_RECORD dp;
|
||||||
PDNS_RECORD curr;
|
PDNS_RECORD curr;
|
||||||
INT result = ERROR_SUCCESS;
|
INT result = ERROR_SUCCESS;
|
||||||
|
DWORD dwQueryFlags = DNS_QUERY_STANDARD;
|
||||||
|
|
||||||
/* needed to be cleaned up if != NULL */
|
/* needed to be cleaned up if != NULL */
|
||||||
dp = NULL;
|
dp = NULL;
|
||||||
|
|
||||||
if (name == NULL)
|
if (data->hostnameW == NULL)
|
||||||
{
|
{
|
||||||
result = ERROR_INVALID_PARAMETER;
|
result = ERROR_INVALID_PARAMETER;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((data->dwControlFlags & LUP_DEEP) == 0)
|
||||||
|
{
|
||||||
|
dwQueryFlags |= DNS_QUERY_NO_RECURSION;
|
||||||
|
}
|
||||||
|
|
||||||
/* 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(name,
|
dns_status = DnsQuery(data->hostnameW,
|
||||||
DNS_TYPE_A,
|
DNS_TYPE_A,
|
||||||
DNS_QUERY_STANDARD,
|
dwQueryFlags,
|
||||||
/* extra dns servers */ 0,
|
/* extra dns servers */ 0,
|
||||||
&dp,
|
&dp,
|
||||||
0);
|
0);
|
||||||
|
@ -511,6 +517,7 @@ NSP_GetHostByNameHeapAllocW(_In_ WCHAR* name,
|
||||||
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 */
|
||||||
curr = curr->pNext;
|
curr = curr->pNext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -522,6 +529,7 @@ NSP_GetHostByNameHeapAllocW(_In_ WCHAR* name,
|
||||||
|
|
||||||
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 */
|
||||||
result = ERROR_SUCCESS;
|
result = ERROR_SUCCESS;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
@ -684,8 +692,8 @@ OpenNetworkDatabase(_In_ LPCWSTR Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
INT
|
INT
|
||||||
NSP_GetServiceByNameHeapAllocW(_In_ WCHAR* nameW,
|
NSP_GetServiceByNameHeapAllocW(_In_ PWSHANDLEINTERN data,
|
||||||
_In_ GUID* lpProviderId,
|
_In_ DWORD dwControlFlags,
|
||||||
_Out_ PWSHOSTINFOINTERN hostinfo)
|
_Out_ PWSHOSTINFOINTERN hostinfo)
|
||||||
{
|
{
|
||||||
BOOL Found = FALSE;
|
BOOL Found = FALSE;
|
||||||
|
@ -703,14 +711,14 @@ NSP_GetServiceByNameHeapAllocW(_In_ WCHAR* nameW,
|
||||||
PCHAR nameProtoA = NULL;
|
PCHAR nameProtoA = NULL;
|
||||||
INT res = WSANO_RECOVERY;
|
INT res = WSANO_RECOVERY;
|
||||||
|
|
||||||
if (!nameW)
|
if (!data->hostnameW)
|
||||||
{
|
{
|
||||||
res = WSANO_RECOVERY;
|
res = WSANO_RECOVERY;
|
||||||
goto End;
|
goto End;
|
||||||
}
|
}
|
||||||
|
|
||||||
hHeap = GetProcessHeap();
|
hHeap = GetProcessHeap();
|
||||||
nameA = StrW2AHeapAlloc(hHeap, nameW);
|
nameA = StrW2AHeapAlloc(hHeap, data->hostnameW);
|
||||||
|
|
||||||
/* nameA has the form <service-name>/<protocol>
|
/* nameA has the form <service-name>/<protocol>
|
||||||
we split these now */
|
we split these now */
|
||||||
|
@ -837,7 +845,7 @@ End:
|
||||||
|
|
||||||
INT
|
INT
|
||||||
NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data,
|
NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data,
|
||||||
_In_ DWORD CallID,
|
_In_ DWORD dwControlFlags,
|
||||||
_Inout_ LPWSAQUERYSETW lpRes,
|
_Inout_ LPWSAQUERYSETW lpRes,
|
||||||
_Inout_ LPDWORD lpResLen)
|
_Inout_ LPDWORD lpResLen)
|
||||||
{
|
{
|
||||||
|
@ -860,9 +868,9 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data,
|
||||||
lpRes->dwSize = sizeof(*lpRes);
|
lpRes->dwSize = sizeof(*lpRes);
|
||||||
lpRes->dwNameSpace = NS_DNS;
|
lpRes->dwNameSpace = NS_DNS;
|
||||||
|
|
||||||
if ((CallID == NSP_CALLID_HOSTNAME) ||
|
if ((data->CallID == NSP_CALLID_HOSTNAME) ||
|
||||||
(CallID == NSP_CALLID_HOSTBYNAME) ||
|
(data->CallID == NSP_CALLID_HOSTBYNAME) ||
|
||||||
(CallID == NSP_CALLID_SERVICEBYNAME))
|
(data->CallID == NSP_CALLID_SERVICEBYNAME))
|
||||||
{
|
{
|
||||||
if (data->CallIDCounter >= 1)
|
if (data->CallIDCounter >= 1)
|
||||||
{
|
{
|
||||||
|
@ -877,7 +885,7 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data,
|
||||||
}
|
}
|
||||||
data->CallIDCounter++;
|
data->CallIDCounter++;
|
||||||
|
|
||||||
if (CallID == NSP_CALLID_HOSTNAME)
|
if (data->CallID == NSP_CALLID_HOSTNAME)
|
||||||
{
|
{
|
||||||
result = NSP_GetHostNameHeapAllocW(&hostinfo.hostnameW);
|
result = NSP_GetHostNameHeapAllocW(&hostinfo.hostnameW);
|
||||||
|
|
||||||
|
@ -886,19 +894,19 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data,
|
||||||
|
|
||||||
hostinfo.addr4 = 0;
|
hostinfo.addr4 = 0;
|
||||||
}
|
}
|
||||||
else if (CallID == NSP_CALLID_HOSTBYNAME)
|
else if (data->CallID == NSP_CALLID_HOSTBYNAME)
|
||||||
{
|
{
|
||||||
result = NSP_GetHostByNameHeapAllocW(data->hostnameW,
|
result = NSP_GetHostByNameHeapAllocW(data,
|
||||||
&data->providerId,
|
dwControlFlags,
|
||||||
&hostinfo);
|
&hostinfo);
|
||||||
if (result != ERROR_SUCCESS)
|
if (result != ERROR_SUCCESS)
|
||||||
goto End;
|
goto End;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ASSERT(CallID == NSP_CALLID_SERVICEBYNAME);
|
ASSERT(data->CallID == NSP_CALLID_SERVICEBYNAME);
|
||||||
result = NSP_GetServiceByNameHeapAllocW(data->hostnameW,
|
result = NSP_GetServiceByNameHeapAllocW(data,
|
||||||
&data->providerId,
|
dwControlFlags,
|
||||||
&hostinfo);
|
&hostinfo);
|
||||||
if (result != ERROR_SUCCESS)
|
if (result != ERROR_SUCCESS)
|
||||||
goto End;
|
goto End;
|
||||||
|
@ -907,7 +915,7 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data,
|
||||||
if (((LUP_RETURN_BLOB & data->dwControlFlags) != 0) ||
|
if (((LUP_RETURN_BLOB & data->dwControlFlags) != 0) ||
|
||||||
((LUP_RETURN_NAME & data->dwControlFlags) != 0))
|
((LUP_RETURN_NAME & data->dwControlFlags) != 0))
|
||||||
{
|
{
|
||||||
if (CallID == NSP_CALLID_HOSTNAME || CallID == NSP_CALLID_HOSTBYNAME)
|
if (data->CallID == NSP_CALLID_HOSTNAME || data->CallID == NSP_CALLID_HOSTBYNAME)
|
||||||
{
|
{
|
||||||
ServiceInstanceNameW = hostinfo.hostnameW;
|
ServiceInstanceNameW = hostinfo.hostnameW;
|
||||||
ServiceInstanceNameA = StrW2AHeapAlloc(hHeap, ServiceInstanceNameW);
|
ServiceInstanceNameA = StrW2AHeapAlloc(hHeap, ServiceInstanceNameW);
|
||||||
|
@ -918,7 +926,7 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data,
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (CallID == NSP_CALLID_SERVICEBYNAME)
|
if (data->CallID == NSP_CALLID_SERVICEBYNAME)
|
||||||
{
|
{
|
||||||
ServiceInstanceNameW = hostinfo.servnameW;
|
ServiceInstanceNameW = hostinfo.servnameW;
|
||||||
ServiceInstanceNameA = StrW2AHeapAlloc(hHeap, ServiceInstanceNameW);
|
ServiceInstanceNameA = StrW2AHeapAlloc(hHeap, ServiceInstanceNameW);
|
||||||
|
@ -950,11 +958,12 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data,
|
||||||
|
|
||||||
if ((LUP_RETURN_BLOB & data->dwControlFlags) != 0)
|
if ((LUP_RETURN_BLOB & data->dwControlFlags) != 0)
|
||||||
{
|
{
|
||||||
if (CallID == NSP_CALLID_HOSTBYNAME)
|
if (data->CallID == NSP_CALLID_HOSTBYNAME)
|
||||||
{
|
{
|
||||||
/* Write data for PBLOB (hostent) */
|
/* Write data for PBLOB (hostent) */
|
||||||
if (!mswBufferAppendBlob_Hostent(&buf,
|
if (!mswBufferAppendBlob_Hostent(&buf,
|
||||||
lpRes,
|
lpRes,
|
||||||
|
(LUP_RETURN_ALIASES & data->dwControlFlags) != 0 ? hostinfo.servaliasesA : NULL,
|
||||||
ServiceInstanceNameA,
|
ServiceInstanceNameA,
|
||||||
hostinfo.addr4))
|
hostinfo.addr4))
|
||||||
{
|
{
|
||||||
|
@ -963,13 +972,13 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data,
|
||||||
goto End;
|
goto End;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (CallID == NSP_CALLID_SERVICEBYNAME)
|
else if (data->CallID == NSP_CALLID_SERVICEBYNAME)
|
||||||
{
|
{
|
||||||
/* Write data for PBLOB (servent) */
|
/* Write data for PBLOB (servent) */
|
||||||
if (!mswBufferAppendBlob_Servent(&buf,
|
if (!mswBufferAppendBlob_Servent(&buf,
|
||||||
lpRes,
|
lpRes,
|
||||||
ServiceInstanceNameA,/* ServiceName */
|
ServiceInstanceNameA,/* ServiceName */
|
||||||
hostinfo.servaliasesA,
|
(LUP_RETURN_ALIASES & data->dwControlFlags) != 0 ? hostinfo.servaliasesA : NULL,
|
||||||
ServiceProtocolNameA,
|
ServiceProtocolNameA,
|
||||||
hostinfo.servport))
|
hostinfo.servport))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue