8302659: Modernize Windows native code for NetworkInterface
Reviewed-by: ihse, djelinski, alanb, michaelm
This commit is contained in:
parent
01e6920581
commit
35a2969057
@ -47,8 +47,6 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBNET, \
|
||||
DISABLED_WARNINGS_gcc_NetworkInterface.c := unused-function, \
|
||||
DISABLED_WARNINGS_clang_net_util_md.c := format-nonliteral, \
|
||||
DISABLED_WARNINGS_microsoft_InetAddress.c := 4244, \
|
||||
DISABLED_WARNINGS_microsoft_NetworkInterface.c := 4133, \
|
||||
DISABLED_WARNINGS_microsoft_NetworkInterface_winXP.c := 4133, \
|
||||
DISABLED_WARNINGS_microsoft_ResolverConfigurationImpl.c := 4996, \
|
||||
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
||||
$(call SET_SHARED_LIBRARY_ORIGIN), \
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -32,54 +32,9 @@
|
||||
* Structures used when enumerating interfaces and addresses
|
||||
*/
|
||||
typedef struct _netaddr {
|
||||
SOCKETADDRESS addr; /* IPv4 or IPv6 address */
|
||||
SOCKETADDRESS brdcast;
|
||||
short mask;
|
||||
struct _netaddr *next;
|
||||
SOCKADDR_INET Address;
|
||||
UINT8 PrefixLength;
|
||||
struct _netaddr *Next;
|
||||
} netaddr;
|
||||
|
||||
typedef struct _netif {
|
||||
char *name;
|
||||
char *displayName;
|
||||
DWORD dwIndex; /* Internal index */
|
||||
DWORD ifType; /* Interface type */
|
||||
int index; /* Friendly index */
|
||||
struct _netif *next;
|
||||
|
||||
/* Following fields used on Windows XP when IPv6 is used only */
|
||||
jboolean hasIpv6Address; /* true when following fields valid */
|
||||
jboolean dNameIsUnicode; /* Display Name is Unicode */
|
||||
int naddrs; /* Number of addrs */
|
||||
DWORD ipv6Index;
|
||||
struct _netaddr *addrs; /* addr list for interfaces */
|
||||
} netif;
|
||||
|
||||
extern void free_netif(netif *netifP);
|
||||
extern void free_netaddr(netaddr *netaddrP);
|
||||
|
||||
/* various JNI ids */
|
||||
extern jclass ni_class; /* NetworkInterface */
|
||||
|
||||
extern jmethodID ni_ctor; /* NetworkInterface() */
|
||||
|
||||
extern jfieldID ni_indexID; /* NetworkInterface.index */
|
||||
extern jfieldID ni_addrsID; /* NetworkInterface.addrs */
|
||||
extern jfieldID ni_bindsID; /* NetworkInterface.bindings */
|
||||
extern jfieldID ni_nameID; /* NetworkInterface.name */
|
||||
extern jfieldID ni_displayNameID; /* NetworkInterface.displayName */
|
||||
extern jfieldID ni_childsID; /* NetworkInterface.childs */
|
||||
|
||||
extern jclass ni_ibcls; /* InterfaceAddress */
|
||||
extern jmethodID ni_ibctrID; /* InterfaceAddress() */
|
||||
extern jfieldID ni_ibaddressID; /* InterfaceAddress.address */
|
||||
extern jfieldID ni_ibbroadcastID; /* InterfaceAddress.broadcast */
|
||||
extern jfieldID ni_ibmaskID; /* InterfaceAddress.maskLength */
|
||||
|
||||
int enumInterfaces(JNIEnv *env, netif **netifPP);
|
||||
|
||||
// Windows Visa (and later) only.....
|
||||
#ifndef IF_TYPE_IEEE80211
|
||||
#define IF_TYPE_IEEE80211 71
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -33,6 +33,8 @@
|
||||
#include "jni_util.h"
|
||||
|
||||
#define MAX_STR_LEN 1024
|
||||
#define BUFF_SIZE 15360
|
||||
#define MAX_TRIES 3
|
||||
|
||||
#define STS_NO_CONFIG 0x0 /* no configuration found */
|
||||
#define STS_SL_FOUND 0x1 /* search list found */
|
||||
@ -46,7 +48,78 @@
|
||||
static jfieldID searchlistID;
|
||||
static jfieldID nameserversID;
|
||||
|
||||
extern int getAdapters(JNIEnv *env, int flags, IP_ADAPTER_ADDRESSES **adapters);
|
||||
/*
|
||||
* return an array of IP_ADAPTER_ADDRESSES containing one element
|
||||
* for each adapter on the system. Returned in *adapters.
|
||||
* Buffer is malloc'd and must be freed (unless error returned)
|
||||
*/
|
||||
static int getAdapters (JNIEnv *env, int flags, IP_ADAPTER_ADDRESSES **adapters) {
|
||||
DWORD ret;
|
||||
IP_ADAPTER_ADDRESSES *adapterInfo;
|
||||
ULONG len;
|
||||
int try;
|
||||
|
||||
*adapters = NULL;
|
||||
|
||||
adapterInfo = (IP_ADAPTER_ADDRESSES *) malloc(BUFF_SIZE);
|
||||
if (adapterInfo == NULL) {
|
||||
JNU_ThrowByName(env, "java/lang/OutOfMemoryError",
|
||||
"Native heap allocation failure");
|
||||
return -1;
|
||||
}
|
||||
|
||||
len = BUFF_SIZE;
|
||||
ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
|
||||
|
||||
for (try = 0; ret == ERROR_BUFFER_OVERFLOW && try < MAX_TRIES; ++try) {
|
||||
IP_ADAPTER_ADDRESSES * newAdapterInfo = NULL;
|
||||
if (len < (ULONG_MAX - BUFF_SIZE)) {
|
||||
len += BUFF_SIZE;
|
||||
}
|
||||
newAdapterInfo =
|
||||
(IP_ADAPTER_ADDRESSES *) realloc (adapterInfo, len);
|
||||
if (newAdapterInfo == NULL) {
|
||||
free(adapterInfo);
|
||||
JNU_ThrowByName(env, "java/lang/OutOfMemoryError",
|
||||
"Native heap allocation failure");
|
||||
return -1;
|
||||
}
|
||||
|
||||
adapterInfo = newAdapterInfo;
|
||||
|
||||
ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
|
||||
}
|
||||
|
||||
if (ret != ERROR_SUCCESS) {
|
||||
free (adapterInfo);
|
||||
switch (ret) {
|
||||
case ERROR_INVALID_PARAMETER:
|
||||
JNU_ThrowInternalError(env,
|
||||
"IP Helper Library GetAdaptersAddresses function failed: "
|
||||
"invalid parameter");
|
||||
break;
|
||||
case ERROR_NOT_ENOUGH_MEMORY:
|
||||
JNU_ThrowOutOfMemoryError(env,
|
||||
"IP Helper Library GetAdaptersAddresses function failed: "
|
||||
"not enough memory");
|
||||
break;
|
||||
case ERROR_NO_DATA:
|
||||
// not an error
|
||||
*adapters = NULL;
|
||||
return ERROR_SUCCESS;
|
||||
default:
|
||||
SetLastError(ret);
|
||||
JNU_ThrowByNameWithMessageAndLastError(env,
|
||||
JNU_JAVANETPKG "SocketException",
|
||||
"IP Helper Library GetAdaptersAddresses function failed");
|
||||
break;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
*adapters = adapterInfo;
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
* Utility routine to append s2 to s1 with a comma delimiter.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -106,7 +106,7 @@ public class OptionsTest {
|
||||
Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces();
|
||||
while (nifs.hasMoreElements()) {
|
||||
NetworkInterface ni = nifs.nextElement();
|
||||
if (ni.supportsMulticast()) {
|
||||
if (ni.supportsMulticast() && !ni.getInterfaceAddresses().isEmpty()) {
|
||||
return ni;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user