From 4918ce3b9237cc546afb9b344760c2235073aec1 Mon Sep 17 00:00:00 2001 From: Damian Minkov Date: Tue, 27 Oct 2009 08:35:50 +0000 Subject: [PATCH] Second patch for Issue #704 by Sebastien Vincent. --- lib/native/windows/LocalhostRetriever.dll | Bin 42496 -> 41984 bytes ...tor_impl_netaddr_Win32LocalhostRetriever.c | 695 ++++++++---------- ...tor_impl_netaddr_Win32LocalhostRetriever.h | 42 +- .../NetworkAddressManagerServiceImpl.java | 27 +- .../impl/netaddr/Win32LocalhostRetriever.java | 87 ++- 5 files changed, 399 insertions(+), 452 deletions(-) diff --git a/lib/native/windows/LocalhostRetriever.dll b/lib/native/windows/LocalhostRetriever.dll index 376a981c14a84249dded27b8ef25eb860280a8d1..632e6836ef97d9ac3c4415b8285ed1084170ab62 100644 GIT binary patch delta 7830 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 delta 8408 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 diff --git a/src/native/windows/LocalhostRetriever/net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever.c b/src/native/windows/LocalhostRetriever/net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever.c index 7838cfcef..6465f32ab 100644 --- a/src/native/windows/LocalhostRetriever/net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever.c +++ b/src/native/windows/LocalhostRetriever/net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever.c @@ -1,377 +1,318 @@ -/* - * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. - * - * Distributable under LGPL license. - * See terms of license at gnu.org. - */ - -/** - * \file net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever.c - * \brief Get source address for a destination address. - * \author Sebastien Vincent - * \date 2009 - */ - -/** - * \def WIN32_LEAN_AND_MEAN - * \brief Exclude not commonly used headers from win32 API. - * - * It excludes some unused stuff from windows headers and - * by the way code compiles faster. - */ -#define WIN32_LEAN_AND_MEAN - -/** - * \def ASSUME_COMPLETE_JDK - * \brief Assume the JDK has a correct implementation of:\n - * - byte[] InetAddress.getAddress();\n - * - void InetAddress.getByteAddress(byte[]);\n - * - RuntimeException and OutOfMemoryError classes.\n\n - * - * This will not test if GetObjectClass, GetMethodID, - * GetStaticMethodID fail for these classes. - * - * Typically it is safe to set 1 for OpenJDK and SUN JDK. - */ -#define ASSUME_COMPLETE_JDK 1 - -#include -#include - -#include - -#include -#include - -#include "net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever.h" - -/** - * \define ADAPTERS_DEFAULT_SIZE - * \brief Default size for GetAdapterAddresses's SizePointer parameter. - * - * We set a relatively high value to not called two times - * GetAdapterAddresses() which is slow. - */ -#define ADAPTERS_DEFAULT_SIZE 15000 - -/** - * \brief Get interface for a destination route. - * \param addr destination address - * \param src source address, this parameter will be filled in function succeed - * \return 0 if success, -1 otherwise - */ -static int get_source_for_destination(struct sockaddr* dst, struct sockaddr_storage* src) -{ - DWORD ifindex = 0; - IP_ADAPTER_ADDRESSES* allAdapters = NULL; - IP_ADAPTER_ADDRESSES* adapter = NULL; - ULONG size = ADAPTERS_DEFAULT_SIZE; - ULONG ret = 0; - BOOL found = FALSE; - - /* need a valid pointer */ - if(!src || !dst) - { - return -1; - } - - /* get output interface index for specific destination address */ - if(GetBestInterfaceEx(dst, &ifindex) != NO_ERROR) - { - return -1; - } - - do - { - /* we should loop only if host has more than - * (ADAPTERS_DEFAULT_SIZE / sizeof(IP_ADAPTER_ADDRESSES)) interfaces - */ - allAdapters = malloc(ADAPTERS_DEFAULT_SIZE); - - if(!allAdapters) - { - /* out of memory */ - return -1; - } - - /* get the list of host addresses and try to find - * the index - */ - ret = GetAdaptersAddresses(dst->sa_family, /* return same address family as destination */ - GAA_FLAG_INCLUDE_ALL_INTERFACES | GAA_FLAG_INCLUDE_PREFIX | GAA_FLAG_SKIP_DNS_SERVER | - GAA_FLAG_SKIP_FRIENDLY_NAME | GAA_FLAG_SKIP_MULTICAST, - NULL, /* reserved */ - allAdapters, - &size); - - if(ret == ERROR_BUFFER_OVERFLOW) - { - /* free memory as the loop will allocate again with - * proper size - */ - free(allAdapters); - } - - }while(ret == ERROR_BUFFER_OVERFLOW); - - if(ret != ERROR_SUCCESS) - { - free(allAdapters); - return -1; - } - - adapter = allAdapters; - - while(adapter) - { - /* find the right adapter for interface index return by GetBestInterface */ - if(dst->sa_family == AF_INET && (adapter->IfIndex == ifindex)) - { - IP_ADAPTER_UNICAST_ADDRESS* unicast = adapter->FirstUnicastAddress; - struct sockaddr_in* addr = (struct sockaddr_in*)unicast->Address.lpSockaddr; - - memcpy(src, addr, sizeof(struct sockaddr_in)); - found = TRUE; - - /* found source address, break the loop */ - break; - } - else if(dst->sa_family == AF_INET6 && (adapter->Ipv6IfIndex == ifindex)) - { - /* XXX multihoming on IPv6 interfaces, they can have - * multiple global addresses (+ link-local address), handle this case - */ - IP_ADAPTER_UNICAST_ADDRESS* unicast = adapter->FirstUnicastAddress; - struct sockaddr_in6* addr = (struct sockaddr_in6*)unicast->Address.lpSockaddr; - - memcpy(src, addr, sizeof(struct sockaddr_in6)); - found = TRUE; - - /* found source address, break the loop */ - break; - } - - adapter = adapter->Next; - } - - /* cleanup */ - free(allAdapters); - - return found ? 0 : -1; -} - -/** - * \brief JNI native method to get source address for a destination. - * \param env JVM environment - * \param class class that call method (Win32LocalhostRetriever) - * \param dst destination address (InetAddress) - * \return source address for the destination (InetAddress) - */ -JNIEXPORT jobject JNICALL Java_net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever_getSourceForDestination - (JNIEnv *env, jclass class, jobject dst) -{ - jbyteArray array = NULL; - jclass clazz = NULL; - jmethodID mid = NULL; - jsize len = 0; - jobject ret = NULL; /* InetAddress type */ - struct sockaddr_storage source; - struct sockaddr_in dstv4; - struct sockaddr_in6 dstv6; - struct sockaddr* destination = NULL; - char* buf = NULL; - - /* get class for InetAddress and appropriate method getAddress */ - clazz = (*env)->GetObjectClass(env, dst); - -#ifndef ASSUME_COMPLETE_JDK - if(!clazz) - { - /* printf("!clazz\n"); */ - return NULL; - } -#endif - - mid = (*env)->GetMethodID(env, clazz, "getAddress", "()[B"); - -#ifndef ASSUME_COMPLETE_JDK - if(!mid) - { - /* printf("!mid\n"); */ - return NULL; - } -#endif - - /* get the bytes */ - array = (*env)->CallObjectMethod(env, dst, mid); - len = (*env)->GetArrayLength(env, array); - buf = (char*)(*env)->GetByteArrayElements(env, array, NULL); - - if(len == 4) - { - /* IPv4 processing */ - dstv4.sin_family = AF_INET; - memcpy(&dstv4.sin_addr, buf, 4); - dstv4.sin_port = 0; - destination = (struct sockaddr*)&dstv4; - } - else if(len == 16) - { - /* IPv6 processing */ - dstv6.sin6_family = AF_INET6; - memcpy(&dstv6.sin6_addr, buf, 16); - dstv6.sin6_scope_id = 0; - dstv6.sin6_flowinfo = 0; - dstv6.sin6_port = 0; - destination = (struct sockaddr*)&dstv6; - } - else - { - /* printf("not an IPv4 or IPv6 address\n"); */ - jclass exception = (*env)->FindClass(env, "java/lang/RuntimeException"); - (*env)->ThrowNew(env, exception, "Not an IPv4 or IPv6 address"); - (*env)->ReleaseByteArrayElements(env, array, buf, 0); - return NULL; - } - - /* cleanup */ - (*env)->ReleaseByteArrayElements(env, array, buf, 0); - - /* create jbyteArray that will contains raw address */ - array = (*env)->NewByteArray(env, len); - if(!array) - { - jclass exception = (*env)->FindClass(env, "java/lang/OutOfMemoryError"); - (*env)->ThrowNew(env, exception, "Not enough memory"); - return NULL; - } - - /* get internal buffer */ - buf = (char*)(*env)->GetByteArrayElements(env, array, NULL); - - /* find the source address for a specific destination */ - if(get_source_for_destination(destination, &source) == -1) - { - jclass exception = (*env)->FindClass(env, "java/lang/RuntimeException"); - (*env)->ThrowNew(env, exception, "Native call failed"); - return NULL; - } - - /* copy raw address */ - if(source.ss_family == AF_INET) - { - /* IPv4 */ - memcpy(buf, &((struct sockaddr_in*)&source)->sin_addr, len); - } - else - { - /* IPv6 */ - memcpy(buf, &((struct sockaddr_in6*)&source)->sin6_addr, len); - } - - /* update content of byte array */ - (*env)->SetByteArrayRegion(env, array, 0, len, (const jbyte*)buf); - - /* construct new InetAddress object with - * static InetAddress.getByAddress(byte[]) method - */ - mid = (*env)->GetStaticMethodID(env, clazz, "getByAddress", "([B)Ljava/net/InetAddress;"); - -#ifndef ASSUME_COMPLETE_JDK - if(!mid) - { - /* printf("!mid2\n"); */ - return NULL; - } -#endif - - /* ret class is InetAddress */ - ret = (*env)->CallStaticObjectMethod(env, clazz, mid, array); - - /* cleanup */ - (*env)->ReleaseByteArrayElements(env, array, (jbyte*)buf, 0); - return ret; -} - -/* test */ -#if 0 - -#include - -int main(int argc, char** argv) -{ - struct sockaddr_in addr4; - struct sockaddr_in6 addr6; - struct sockaddr_storage st; - struct sockaddr_storage st2; - struct sockaddr_in* src4 = (struct sockaddr_in*)&st; - struct sockaddr_in6* src6 = (struct sockaddr_in6*)&st2; - char buf[64]; - DWORD len = 0; - WSADATA wsaData; - - /* initialization stuff */ - WSAStartup(MAKEWORD(2, 0), &wsaData); - - /* IPv4 destination */ - - printf("Try to find source address for destination 130.79.200.1\n"); - len = sizeof(addr4); - - if(WSAStringToAddressA("130.79.200.1", AF_INET, NULL, (struct sockaddr*)&addr4, &len) != 0) - { - printf("WSAStringToAddressA failed: %ld\n", WSAGetLastError()); - exit(EXIT_FAILURE); - } - - if(get_source_for_destination((struct sockaddr*)&addr4, &st) == 0) - { - len = sizeof(buf); - if(WSAAddressToStringA((struct sockaddr*)src4, sizeof(*src4), NULL, buf, &len) != 0) - { - printf("WSAAddressToString failed: %ld\n", WSAGetLastError()); - exit(EXIT_FAILURE); - } - - printf("Source address is %s\n", buf); - } - else - { - printf("get_source_for_destination failed for IPv4!\n"); - } - - printf("================================================================\n"); - - /* IPv6 destination */ - - printf("Try to find source address for destination 2001:660:4701:1001::3\n"); - len = sizeof(addr6); - - if(WSAStringToAddressA("2001:660:4701:1001::3", AF_INET6, NULL, (struct sockaddr*)&addr6, &len) != 0) - { - printf("WSAStringToAddressA failed: %ld\n", WSAGetLastError()); - exit(EXIT_FAILURE); - } - - if(get_source_for_destination((struct sockaddr*)&addr6, &st2) == 0) - { - len = sizeof(buf); - if(WSAAddressToStringA((struct sockaddr*)src6, sizeof(*src6), NULL, buf, &len) != 0) - { - printf("WSAAddressToString failed: %ld\n", WSAGetLastError()); - exit(EXIT_FAILURE); - } - - printf("Source address is %s\n", buf); - } - else - { - printf("get_source_for_destination failed for IPv6!\n"); - } - - - return EXIT_SUCCESS; -} - -#endif - +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ + +/** + * \file net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever.c + * \brief Get source address for a destination address. + * \author Sebastien Vincent + * \date 2009 + */ + +/** + * \def WIN32_LEAN_AND_MEAN + * \brief Exclude not commonly used headers from win32 API. + * + * It excludes some unused stuff from windows headers and + * by the way code compiles faster. + */ +#define WIN32_LEAN_AND_MEAN + +#include +#include + +#include + +#include +#include + +#include "net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever.h" + +/** + * \define ADAPTERS_DEFAULT_SIZE + * \brief Default size for GetAdapterAddresses's SizePointer parameter. + * + * We set a relatively high value to not called two times + * GetAdapterAddresses() which is slow. + */ +#define ADAPTERS_DEFAULT_SIZE 15000 + +/** + * \brief Get interface for a destination route. + * \param addr destination address + * \param src source address, this parameter will be filled in function succeed + * \return 0 if success, -1 otherwise + */ +static int get_source_for_destination(struct sockaddr* dst, struct sockaddr_storage* src) +{ + DWORD ifindex = 0; + IP_ADAPTER_ADDRESSES* allAdapters = NULL; + IP_ADAPTER_ADDRESSES* adapter = NULL; + ULONG size = ADAPTERS_DEFAULT_SIZE; + ULONG ret = 0; + BOOL found = FALSE; + + /* need a valid pointer */ + if(!src || !dst) + { + return -1; + } + + /* get output interface index for specific destination address */ + if(GetBestInterfaceEx(dst, &ifindex) != NO_ERROR) + { + return -1; + } + + do + { + /* we should loop only if host has more than + * (ADAPTERS_DEFAULT_SIZE / sizeof(IP_ADAPTER_ADDRESSES)) interfaces + */ + allAdapters = malloc(size); + + if(!allAdapters) + { + /* out of memory */ + return -1; + } + + /* get the list of host addresses and try to find + * the index + */ + ret = GetAdaptersAddresses(dst->sa_family, /* return same address family as destination */ + GAA_FLAG_INCLUDE_ALL_INTERFACES | GAA_FLAG_INCLUDE_PREFIX | GAA_FLAG_SKIP_DNS_SERVER | + GAA_FLAG_SKIP_FRIENDLY_NAME | GAA_FLAG_SKIP_MULTICAST, + NULL, /* reserved */ + allAdapters, + &size); + + if(ret == ERROR_BUFFER_OVERFLOW) + { + /* free memory as the loop will allocate again with + * proper size + */ + free(allAdapters); + } + }while(ret == ERROR_BUFFER_OVERFLOW); + + if(ret != ERROR_SUCCESS) + { + free(allAdapters); + return -1; + } + + adapter = allAdapters; + + while(adapter) + { + /* find the right adapter for interface index return by GetBestInterface */ + if(dst->sa_family == AF_INET && (adapter->IfIndex == ifindex)) + { + IP_ADAPTER_UNICAST_ADDRESS* unicast = adapter->FirstUnicastAddress; + struct sockaddr_in* addr = (struct sockaddr_in*)unicast->Address.lpSockaddr; + + memcpy(src, addr, sizeof(struct sockaddr_in)); + found = TRUE; + + /* found source address, break the loop */ + break; + } + else if(dst->sa_family == AF_INET6 && (adapter->Ipv6IfIndex == ifindex)) + { + /* XXX multihoming on IPv6 interfaces, they can have + * multiple global addresses (+ link-local address), handle this case + */ + IP_ADAPTER_UNICAST_ADDRESS* unicast = adapter->FirstUnicastAddress; + struct sockaddr_in6* addr = (struct sockaddr_in6*)unicast->Address.lpSockaddr; + + memcpy(src, addr, sizeof(struct sockaddr_in6)); + found = TRUE; + + /* found source address, break the loop */ + break; + } + + adapter = adapter->Next; + } + + /* cleanup */ + free(allAdapters); + + return found ? 0 : -1; +} + +/** + * \brief JNI native method to get source address for a destination. + * \param env JVM environment + * \param class class that call method (Win32LocalhostRetriever) + * \param dst destination address + * \return source address for the destination + */ +JNIEXPORT jbyteArray JNICALL Java_net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever_getSourceForDestination + (JNIEnv *env, jclass class, jbyteArray dst) +{ + jbyteArray array = NULL; + jsize len = 0; + struct sockaddr_storage source; + struct sockaddr_in dstv4; + struct sockaddr_in6 dstv6; + struct sockaddr* destination = NULL; + char* buf = NULL; + + /* get the bytes */ + len = (*env)->GetArrayLength(env, dst); + buf = (char*)(*env)->GetByteArrayElements(env, dst, NULL); + + if(len == 4) + { + /* IPv4 processing */ + dstv4.sin_family = AF_INET; + memcpy(&dstv4.sin_addr, buf, 4); + dstv4.sin_port = 0; + destination = (struct sockaddr*)&dstv4; + } + else if(len == 16) + { + /* IPv6 processing */ + dstv6.sin6_family = AF_INET6; + memcpy(&dstv6.sin6_addr, buf, 16); + dstv6.sin6_scope_id = 0; + dstv6.sin6_flowinfo = 0; + dstv6.sin6_port = 0; + destination = (struct sockaddr*)&dstv6; + } + else + { + /* printf("not an IPv4 or IPv6 address\n"); */ + (*env)->ReleaseByteArrayElements(env, dst, (jbyte*)buf, 0); + return NULL; + } + + /* cleanup */ + (*env)->ReleaseByteArrayElements(env, dst, (jbyte*)buf, 0); + + /* find the source address for a specific destination */ + if(get_source_for_destination(destination, &source) == -1) + { + return NULL; + } + + /* create jbyteArray that will contains raw address */ + array = (*env)->NewByteArray(env, len); + if(!array) + { + return NULL; + } + + /* get internal buffer */ + buf = (char*)(*env)->GetByteArrayElements(env, array, NULL); + if(!buf) + { + return NULL; + } + + /* copy raw address */ + if(source.ss_family == AF_INET) + { + /* IPv4 */ + memcpy(buf, &((struct sockaddr_in*)&source)->sin_addr, len); + } + else + { + /* IPv6 */ + memcpy(buf, &((struct sockaddr_in6*)&source)->sin6_addr, len); + } + + /* ReleaseByteArrayElements() updates array with buf's content + * when third parameter is 0 + */ + (*env)->ReleaseByteArrayElements(env, array, (jbyte*)buf, 0); + return array; +} + +/* test */ +#if 0 + +#include + +int main(int argc, char** argv) +{ + struct sockaddr_in addr4; + struct sockaddr_in6 addr6; + struct sockaddr_storage st; + struct sockaddr_storage st2; + struct sockaddr_in* src4 = (struct sockaddr_in*)&st; + struct sockaddr_in6* src6 = (struct sockaddr_in6*)&st2; + char buf[64]; + DWORD len = 0; + WSADATA wsaData; + + /* initialization stuff */ + WSAStartup(MAKEWORD(2, 0), &wsaData); + + /* IPv4 destination */ + + printf("Try to find source address for destination 130.79.200.1\n"); + len = sizeof(addr4); + + if(WSAStringToAddressA("130.79.200.1", AF_INET, NULL, (struct sockaddr*)&addr4, &len) != 0) + { + printf("WSAStringToAddressA failed: %ld\n", WSAGetLastError()); + exit(EXIT_FAILURE); + } + + if(get_source_for_destination((struct sockaddr*)&addr4, &st) == 0) + { + len = sizeof(buf); + if(WSAAddressToStringA((struct sockaddr*)src4, sizeof(*src4), NULL, buf, &len) != 0) + { + printf("WSAAddressToString failed: %ld\n", WSAGetLastError()); + exit(EXIT_FAILURE); + } + + printf("Source address is %s\n", buf); + } + else + { + printf("get_source_for_destination failed for IPv4!\n"); + } + + printf("================================================================\n"); + + /* IPv6 destination */ + + printf("Try to find source address for destination 2001:660:4701:1001::3\n"); + len = sizeof(addr6); + + if(WSAStringToAddressA("2001:660:4701:1001::3", AF_INET6, NULL, (struct sockaddr*)&addr6, &len) != 0) + { + printf("WSAStringToAddressA failed: %ld\n", WSAGetLastError()); + exit(EXIT_FAILURE); + } + + if(get_source_for_destination((struct sockaddr*)&addr6, &st2) == 0) + { + len = sizeof(buf); + + if(WSAAddressToStringA((struct sockaddr*)src6, sizeof(*src6), NULL, buf, &len) != 0) + { + printf("WSAAddressToString failed: %ld\n", WSAGetLastError()); + exit(EXIT_FAILURE); + } + + printf("Source address is %s\n", buf); + } + else + { + printf("get_source_for_destination failed for IPv6!\n"); + } + + return EXIT_SUCCESS; +} + +#endif + diff --git a/src/native/windows/LocalhostRetriever/net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever.h b/src/native/windows/LocalhostRetriever/net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever.h index 66eea084c..76c4f8e8f 100644 --- a/src/native/windows/LocalhostRetriever/net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever.h +++ b/src/native/windows/LocalhostRetriever/net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever.h @@ -1,21 +1,21 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever */ - -#ifndef _Included_net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever -#define _Included_net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever - * Method: getSourceForDestination - * Signature: (Ljava/net/InetAddress;)Ljava/net/InetAddress; - */ -JNIEXPORT jobject JNICALL Java_net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever_getSourceForDestination - (JNIEnv *, jclass, jobject); - -#ifdef __cplusplus -} -#endif -#endif +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever */ + +#ifndef _Included_net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever +#define _Included_net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever + * Method: getSourceForDestination + * Signature: ([B)[B + */ +JNIEXPORT jbyteArray JNICALL Java_net_java_sip_communicator_impl_netaddr_Win32LocalhostRetriever_getSourceForDestination + (JNIEnv *, jclass, jbyteArray); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/net/java/sip/communicator/impl/netaddr/NetworkAddressManagerServiceImpl.java b/src/net/java/sip/communicator/impl/netaddr/NetworkAddressManagerServiceImpl.java index 9a801b32d..8c719df16 100644 --- a/src/net/java/sip/communicator/impl/netaddr/NetworkAddressManagerServiceImpl.java +++ b/src/net/java/sip/communicator/impl/netaddr/NetworkAddressManagerServiceImpl.java @@ -238,6 +238,8 @@ public void stop() public synchronized InetAddress getLocalHost(InetAddress intendedDestination) { InetAddress localHost = null; + String osName = System.getProperty("os.name"); + String osVersion = System.getProperty("os.version"); if(logger.isTraceEnabled()) { @@ -247,21 +249,32 @@ public synchronized InetAddress getLocalHost(InetAddress intendedDestination) } /* use native code (JNI) to find source address for a specific destination - * address on Windows. + * address on Windows XP SP1 and over. * * For other systems, we used method based on DatagramSocket.connect * which will returns us source address. The reason why we cannot use it * on Windows is because its socket implementation returns the any address... */ - if(System.getProperty("os.name").startsWith("Windows")) + if(osName.startsWith("Windows") && + !osVersion.startsWith("4") && /* 95/98/Me/NT */ + !osVersion.startsWith("5.0")) /* 2000 */ { - try + byte[] src = Win32LocalhostRetriever.getSourceForDestination(intendedDestination.getAddress()); + + if(src == null) { - localHost = Win32LocalhostRetriever.getSourceForDestination(intendedDestination); + logger.warn("Failed to get localhost "); } - catch(Exception e) + else { - logger.warn("Failed to get localhost ", e); + try + { + localHost = InetAddress.getByAddress(src); + } + catch(UnknownHostException e) + { + logger.warn("Failed to get localhost ", e); + } } } else @@ -274,7 +287,6 @@ public synchronized InetAddress getLocalHost(InetAddress intendedDestination) localHost = localHostFinderSocket.getLocalAddress(); localHostFinderSocket.disconnect(); } -/* //windows socket implementations return the any address so we need to //find something else here ... InetAddress.getLocalHost seems to work //better on windows so lets hope it'll do the trick. @@ -365,7 +377,6 @@ public synchronized InetAddress getLocalHost(InetAddress intendedDestination) logger.warn("Failed to get localhost ", ex); } } -*/ if(logger.isTraceEnabled()) { logger.trace("Will return the following localhost address: " diff --git a/src/net/java/sip/communicator/impl/netaddr/Win32LocalhostRetriever.java b/src/net/java/sip/communicator/impl/netaddr/Win32LocalhostRetriever.java index 625ee7f9d..bd2812828 100644 --- a/src/net/java/sip/communicator/impl/netaddr/Win32LocalhostRetriever.java +++ b/src/net/java/sip/communicator/impl/netaddr/Win32LocalhostRetriever.java @@ -1,46 +1,41 @@ -/* - * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. - * - * Distributable under LGPL license. - * See terms of license at gnu.org. - */ -package net.java.sip.communicator.impl.netaddr; - -import java.net.*; - -/** - * Class to retrieve local address to use for a - * specific destination. - * - * @author Sebastien Vincent - */ -public class Win32LocalhostRetriever -{ - /* load library */ - static - { - System.loadLibrary("LocalhostRetriever"); - } - - /** - * Constructor. - */ - public Win32LocalhostRetriever() - { - } - - /** - * Native function to retrieve source address to use for a specific destination. - * @param dst destination address - * @return source address or null if error - * @note This function is only implemented for Microsoft Windows (>= XP SP1). - * Do not try to call it from another OS. - * @throws RuntimeException if dst is not an IPv4 or IPv6 address, and if - * native get_source_for_destination function failed - * @throws OutOfMemoryError if run out of memory - */ - public native static InetAddress getSourceForDestination(InetAddress dst) throws - RuntimeException, - OutOfMemoryError; -} - +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.netaddr; + +import java.net.*; + +/** + * Class to retrieve local address to use for a + * specific destination. + * + * @author Sebastien Vincent + */ +public class Win32LocalhostRetriever +{ + /* load library */ + static + { + System.loadLibrary("LocalhostRetriever"); + } + + /** + * Constructor. + */ + public Win32LocalhostRetriever() + { + } + + /** + * Native function to retrieve source address to use for a specific destination. + * @param dst destination address + * @return source address or null if error + * @note This function is only implemented for Microsoft Windows (>= XP SP1). + * Do not try to call it from another OS. + */ + public native static byte[] getSourceForDestination(byte[] dst); +} +