--- a/jdk/src/solaris/native/java/net/NetworkInterface.c Mon Aug 13 19:51:48 2012 +0800
+++ b/jdk/src/solaris/native/java/net/NetworkInterface.c Mon Aug 13 13:41:23 2012 +0100
@@ -147,7 +147,7 @@
static short getSubnet(JNIEnv *env, int sock, const char *ifname);
static int getIndex(int sock, const char *ifname);
-static int getFlags(int sock, const char *ifname);
+static int getFlags(int sock, const char *ifname, int *flags);
static int getMacAddress(JNIEnv *env, int sock, const char* ifname, const struct in_addr* addr, unsigned char *buf);
static int getMTU(JNIEnv *env, int sock, const char *ifname);
@@ -561,6 +561,7 @@
jboolean isCopy;
int ret, sock;
const char* name_utf;
+ int flags = 0;
name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
@@ -571,7 +572,7 @@
name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
- ret = getFlags(sock, name_utf);
+ ret = getFlags(sock, name_utf, &flags);
close(sock);
(*env)->ReleaseStringUTFChars(env, name, name_utf);
@@ -581,7 +582,7 @@
return -1;
}
- return ret;
+ return flags;
}
@@ -852,6 +853,7 @@
int mask;
int isVirtual = 0;
int addr_size;
+ int flags = 0;
/*
* If the interface name is a logical interface then we
@@ -906,7 +908,7 @@
* the 'parent' interface with the new records.
*/
*name_colonP = 0;
- if (getFlags(sock, name) < 0) {
+ if (getFlags(sock, name, &flags) < 0 || flags < 0) {
// failed to access parent interface do not create parent.
// We are a virtual interface with no parent.
isVirtual = 1;
@@ -1278,9 +1280,8 @@
return if2.ifr_mtu;
}
-static int getFlags(int sock, const char *ifname) {
+static int getFlags(int sock, const char *ifname, int *flags) {
struct ifreq if2;
- int ret = -1;
memset((char *) &if2, 0, sizeof(if2));
strcpy(if2.ifr_name, ifname);
@@ -1289,7 +1290,12 @@
return -1;
}
- return if2.ifr_flags;
+ if (sizeof(if2.ifr_flags) == sizeof(short)) {
+ *flags = (if2.ifr_flags & 0xffff);
+ } else {
+ *flags = if2.ifr_flags;
+ }
+ return 0;
}
#endif
@@ -1663,7 +1669,7 @@
}
-static int getFlags(int sock, const char *ifname) {
+static int getFlags(int sock, const char *ifname, int *flags) {
struct lifreq lifr;
memset((caddr_t)&lifr, 0, sizeof(lifr));
strcpy((caddr_t)&(lifr.lifr_name), ifname);
@@ -1672,7 +1678,8 @@
return -1;
}
- return lifr.lifr_flags;
+ *flags = lifr.lifr_flags;
+ return 0;
}
@@ -1968,7 +1975,7 @@
return if2.ifr_mtu;
}
-static int getFlags(int sock, const char *ifname) {
+static int getFlags(int sock, const char *ifname, int *flags) {
struct ifreq if2;
int ret = -1;
@@ -1979,7 +1986,12 @@
return -1;
}
- return (((int) if2.ifr_flags) & 0xffff);
+ if (sizeof(if2.ifr_flags) == sizeof(short)) {
+ *flags = (if2.ifr_flags & 0xffff);
+ } else {
+ *flags = if2.ifr_flags;
+ }
+ return 0;
}
#endif