From: thi garlet <galet at gmail>
search local interfaces, or send UDP packed that does not need linux privilege, then search local cache
solve https://bugs.winehq.org/show_bug.cgi?id=9418 files updated
/dlls/iphlpapi/iphlpapi_main.c /dlls/iphlpapi/tests/iphlpapi.c --- dlls/iphlpapi/iphlpapi_main.c | 11 ++++++----- dlls/iphlpapi/tests/iphlpapi.c | 15 ++++++++------- 2 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c index 8f92c488c8a..5e6fbe4bec3 100644 --- a/dlls/iphlpapi/iphlpapi_main.c +++ b/dlls/iphlpapi/iphlpapi_main.c @@ -4014,7 +4014,8 @@ DWORD WINAPI SendARP(IPAddr DestIP, IPAddr SrcIP, PULONG pMacAddr, PULONG PhyAdd pUnicast = pCurrInterface->FirstUnicastAddress; while ( pUnicast ) { - if ( DestIP == ((struct sockaddr_in *) pUnicast->Address.lpSockaddr)->sin_addr.s_addr ) + if ( DestIP == ((struct sockaddr_in *) + pUnicast->Address.lpSockaddr)->sin_addr.s_addr ) { memcpy(pMacAddr, pCurrInterface->PhysicalAddress, 6); heap_free(pInterfaces); @@ -4032,16 +4033,16 @@ DWORD WINAPI SendARP(IPAddr DestIP, IPAddr SrcIP, PULONG pMacAddr, PULONG PhyAdd
// prepare config, to send an UDP packed instead of privileged ARP src.sin_family = AF_INET; - src.sin_addr.s_addr = SrcIP; // del? - src.sin_port = 10123; // del? + src.sin_addr.s_addr = SrcIP; + src.sin_port = 10123; dst.sin_family = AF_INET; dst.sin_addr.s_addr = DestIP; - dst.sin_port = 10123; // del? + dst.sin_port = 10123;
// send UDP if( WSAStartup( MAKEWORD( 2, 2 ), &wd ) != 0 ) return ERROR_NOT_SUPPORTED; - s = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); // SOCK_RAW, IPPROTO_ICMP + s = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); bind( s, (SOCKADDR *) &src, sizeof(src) ); i = sendto( s, (const char *) &time_out, 4, 0, (SOCKADDR *) &dst, sizeof(dst) ); closesocket(s); diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c index 7e14b2ad5d0..73b913c616e 100644 --- a/dlls/iphlpapi/tests/iphlpapi.c +++ b/dlls/iphlpapi/tests/iphlpapi.c @@ -3118,22 +3118,23 @@ static void test_SendARP(void) "SendARP(inet_addr('127.0.0.1'), 0, NULL, NULL) returned %ld, expected ERROR_INVALID_PARAMETER\n", apiReturn);
- apiReturn = SendARP( inet_addr("127.0.0.1"), 0, (PULONG) &MacAddr, NULL); + apiReturn = SendARP( inet_addr("127.0.0.1"), 0, MacAddr, NULL); ok(apiReturn == ERROR_INVALID_USER_BUFFER, - "SendARP(inet_addr('127.0.0.1'), 0, (PULONG) &MacAddr, NULL) returned %ld, expected ERROR_INVALID_USER_BUFFER\n", + "SendARP(inet_addr('127.0.0.1'), 0, MacAddr, NULL) returned %ld, expected ERROR_INVALID_USER_BUFFER\n", apiReturn);
- apiReturn = SendARP( inet_addr("127.0.0.1"), 0, (PULONG) &MacAddr, &dwSize); + apiReturn = SendARP( inet_addr("127.0.0.1"), 0, MacAddr, &dwSize); ok(apiReturn == ERROR_BUFFER_OVERFLOW, - "SendARP(inet_addr('127.0.0.1'), 0, (PULONG) &MacAddr, &dwSize=0) returned %ld, expected ERROR_BUFFER_OVERFLOW\n", + "SendARP(inet_addr('127.0.0.1'), 0, MacAddr, &dwSize=0) returned %ld, expected ERROR_BUFFER_OVERFLOW\n", apiReturn);
dwSize = 6; - apiReturn = SendARP( inet_addr("127.0.0.1"), 0, (PULONG) &MacAddr, &dwSize); + apiReturn = SendARP( inet_addr("127.0.0.1"), 0, MacAddr, &dwSize); if (apiReturn == ERROR_NOT_FOUND) { - trace( "SendARP(inet_addr('127.0.0.1'), 0, (PULONG) &MacAddr, &dwSize) did not found a mac address\n" ); + trace( "SendARP(inet_addr('127.0.0.1'), 0, MacAddr, &dwSize) did not found a mac address\n" ); } else { - trace( "SendARP(inet_addr('127.0.0.1'), 0, (PULONG) &MacAddr, &dwSize) returned %lu mac: %lu - %lu.\n", apiReturn, MacAddr[0], MacAddr[1] ); + trace( "SendARP(inet_addr('127.0.0.1'), 0, MacAddr, &dwSize) returned %lu mac: %lu - %lu.\n", + apiReturn, MacAddr[0], MacAddr[1] ); } }