src/solaris/native/java/net/PlainDatagramSocketImpl.c
Print this page
*** 184,193 ****
--- 184,194 ----
jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
/* fd is an int field on fdObj */
int fd;
int len = 0;
SOCKADDR him;
+ socklen_t slen = sizeof(him);
if (IS_NULL(fdObj)) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
"Socket closed");
return;
*** 221,231 ****
/* initialize the local port */
if (localport == 0) {
/* Now that we're a connected socket, let's extract the port number
* that the system chose for us and store it in the Socket object.
*/
! if (JVM_GetSockName(fd, (struct sockaddr *)&him, &len) == -1) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error getting socket name");
return;
}
--- 222,232 ----
/* initialize the local port */
if (localport == 0) {
/* Now that we're a connected socket, let's extract the port number
* that the system chose for us and store it in the Socket object.
*/
! if (getsockname(fd, (struct sockaddr *)&him, &slen) == -1) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error getting socket name");
return;
}
*** 269,279 ****
return;
}
setDefaultScopeID(env, (struct sockaddr *)&rmtaddr);
! if (JVM_Connect(fd, (struct sockaddr *)&rmtaddr, len) == -1) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "ConnectException",
"Connect failed");
return;
}
--- 270,280 ----
return;
}
setDefaultScopeID(env, (struct sockaddr *)&rmtaddr);
! if (NET_Connect(fd, (struct sockaddr *)&rmtaddr, len) == -1) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "ConnectException",
"Connect failed");
return;
}
*** 291,301 ****
/* The fdObj'fd */
jint fd;
#if defined(__linux__) || defined(_ALLBSD_SOURCE)
SOCKADDR addr;
! int len;
#endif
if (IS_NULL(fdObj)) {
return;
}
--- 292,302 ----
/* The fdObj'fd */
jint fd;
#if defined(__linux__) || defined(_ALLBSD_SOURCE)
SOCKADDR addr;
! socklen_t len;
#endif
if (IS_NULL(fdObj)) {
return;
}
*** 313,327 ****
{
struct sockaddr_in *him4 = (struct sockaddr_in*)&addr;
him4->sin_family = AF_UNSPEC;
len = sizeof(struct sockaddr_in);
}
! JVM_Connect(fd, (struct sockaddr *)&addr, len);
#ifdef __linux__
int localPort = 0;
! if (JVM_GetSockName(fd, (struct sockaddr *)&addr, &len) == -1)
return;
localPort = NET_GetPortFromSockaddr((struct sockaddr *)&addr);
if (localPort == 0) {
localPort = (*env)->GetIntField(env, this, pdsi_localPortID);
--- 314,328 ----
{
struct sockaddr_in *him4 = (struct sockaddr_in*)&addr;
him4->sin_family = AF_UNSPEC;
len = sizeof(struct sockaddr_in);
}
! NET_Connect(fd, (struct sockaddr *)&addr, len);
#ifdef __linux__
int localPort = 0;
! if (getsockname(fd, (struct sockaddr *)&addr, &len) == -1)
return;
localPort = NET_GetPortFromSockaddr((struct sockaddr *)&addr);
if (localPort == 0) {
localPort = (*env)->GetIntField(env, this, pdsi_localPortID);
*** 337,347 ****
NET_Bind(fd, (struct sockaddr *)&addr, len);
}
#endif
#else
! JVM_Connect(fd, 0, 0);
#endif
}
/*
* Class: java_net_PlainDatagramSocketImpl
--- 338,348 ----
NET_Bind(fd, (struct sockaddr *)&addr, len);
}
#endif
#else
! NET_Connect(fd, 0, 0);
#endif
}
/*
* Class: java_net_PlainDatagramSocketImpl
*** 454,478 ****
*/
ret = NET_SendTo(fd, fullPacket, packetBufferLen, 0,
(struct sockaddr *)rmtaddrP, len);
if (ret < 0) {
- switch (ret) {
- case JVM_IO_ERR :
if (errno == ECONNREFUSED) {
JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException",
"ICMP Port Unreachable");
} else {
NET_ThrowByNameWithLastError(env, "java/io/IOException", "sendto failed");
}
- break;
-
- case JVM_IO_INTR:
- JNU_ThrowByName(env, "java/io/InterruptedIOException",
- "operation interrupted");
- break;
- }
}
if (mallocedPacket) {
free(fullPacket);
}
--- 455,470 ----
*** 491,501 ****
jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
jint timeout = (*env)->GetIntField(env, this, pdsi_timeoutID);
jint fd;
ssize_t n;
SOCKADDR remote_addr;
! int len;
char buf[1];
jint family;
jobject iaObj;
int port;
if (IS_NULL(fdObj)) {
--- 483,493 ----
jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
jint timeout = (*env)->GetIntField(env, this, pdsi_timeoutID);
jint fd;
ssize_t n;
SOCKADDR remote_addr;
! socklen_t slen = SOCKADDR_LEN;
char buf[1];
jint family;
jobject iaObj;
int port;
if (IS_NULL(fdObj)) {
*** 512,540 ****
int ret = NET_Timeout(fd, timeout);
if (ret == 0) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException",
"Peek timed out");
return ret;
! } else if (ret == JVM_IO_ERR) {
if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Peek failed");
}
return ret;
- } else if (ret == JVM_IO_INTR) {
- JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException",
- "operation interrupted");
- return ret; /* WARNING: SHOULD WE REALLY RETURN -2??? */
}
}
! len = SOCKADDR_LEN;
! n = NET_RecvFrom(fd, buf, 1, MSG_PEEK,
! (struct sockaddr *)&remote_addr, &len);
! if (n == JVM_IO_ERR) {
#ifdef __solaris__
if (errno == ECONNREFUSED) {
int orig_errno = errno;
(void) recv(fd, buf, 1, 0);
--- 504,526 ----
int ret = NET_Timeout(fd, timeout);
if (ret == 0) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException",
"Peek timed out");
return ret;
! } else if (ret == -1) {
if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Peek failed");
}
return ret;
}
}
! n = NET_RecvFrom(fd, buf, 1, MSG_PEEK, (struct sockaddr *)&remote_addr, &slen);
! if (n == -1) {
#ifdef __solaris__
if (errno == ECONNREFUSED) {
int orig_errno = errno;
(void) recv(fd, buf, 1, 0);
*** 550,562 ****
} else {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Peek failed");
}
}
return 0;
- } else if (n == JVM_IO_INTR) {
- JNU_ThrowByName(env, "java/io/InterruptedIOException", 0);
- return 0;
}
iaObj = NET_SockaddrToInetAddress(env, (struct sockaddr *)&remote_addr, &port);
#ifdef AF_INET6
family = getInetAddress_family(env, iaObj) == IPv4? AF_INET : AF_INET6;
--- 536,545 ----
*** 585,595 ****
int fd;
int n;
SOCKADDR remote_addr;
! int len;
int port;
if (IS_NULL(fdObj)) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
"Socket closed");
--- 568,578 ----
int fd;
int n;
SOCKADDR remote_addr;
! socklen_t slen = SOCKADDR_LEN;
int port;
if (IS_NULL(fdObj)) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
"Socket closed");
*** 614,638 ****
int ret = NET_Timeout(fd, timeout);
if (ret == 0) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException",
"Receive timed out");
return -1;
! } else if (ret == JVM_IO_ERR) {
#ifdef __linux__
if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed");
}
#else
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
#endif
return -1;
- } else if (ret == JVM_IO_INTR) {
- JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException",
- "operation interrupted");
- return -1;
}
}
if (packetBufferLen > MAX_BUFFER_LEN) {
--- 597,617 ----
int ret = NET_Timeout(fd, timeout);
if (ret == 0) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException",
"Receive timed out");
return -1;
! } else if (ret == -1) {
#ifdef __linux__
if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed");
}
#else
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
#endif
return -1;
}
}
if (packetBufferLen > MAX_BUFFER_LEN) {
*** 663,680 ****
}
} else {
fullPacket = &(BUF[0]);
}
- len = SOCKADDR_LEN;
n = NET_RecvFrom(fd, fullPacket, packetBufferLen, MSG_PEEK,
! (struct sockaddr *)&remote_addr, &len);
/* truncate the data if the packet's length is too small */
if (n > packetBufferLen) {
n = packetBufferLen;
}
! if (n == JVM_IO_ERR) {
#ifdef __solaris__
if (errno == ECONNREFUSED) {
int orig_errno = errno;
(void) recv(fd, fullPacket, 1, 0);
--- 642,658 ----
}
} else {
fullPacket = &(BUF[0]);
}
n = NET_RecvFrom(fd, fullPacket, packetBufferLen, MSG_PEEK,
! (struct sockaddr *)&remote_addr, &slen);
/* truncate the data if the packet's length is too small */
if (n > packetBufferLen) {
n = packetBufferLen;
}
! if (n == -1) {
#ifdef __solaris__
if (errno == ECONNREFUSED) {
int orig_errno = errno;
(void) recv(fd, fullPacket, 1, 0);
*** 691,705 ****
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed");
}
}
- } else if (n == JVM_IO_INTR) {
- (*env)->SetIntField(env, packet, dp_offsetID, 0);
- (*env)->SetIntField(env, packet, dp_lengthID, 0);
- JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException",
- "operation interrupted");
} else {
/*
* success - fill in received address...
*
* REMIND: Fill in an int on the packet, and create inetadd
--- 669,678 ----
*** 762,772 ****
int fd;
int n;
SOCKADDR remote_addr;
! int len;
jboolean retry;
#ifdef __linux__
jboolean connected = JNI_FALSE;
jobject connectedAddress = NULL;
jint connectedPort = 0;
--- 735,745 ----
int fd;
int n;
SOCKADDR remote_addr;
! socklen_t slen = SOCKADDR_LEN;
jboolean retry;
#ifdef __linux__
jboolean connected = JNI_FALSE;
jobject connectedAddress = NULL;
jint connectedPort = 0;
*** 832,872 ****
int ret = NET_Timeout(fd, timeout);
if (ret <= 0) {
if (ret == 0) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException",
"Receive timed out");
! } else if (ret == JVM_IO_ERR) {
#ifdef __linux__
if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed");
}
#else
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
#endif
- } else if (ret == JVM_IO_INTR) {
- JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException",
- "operation interrupted");
}
if (mallocedPacket) {
free(fullPacket);
}
return;
}
}
- len = SOCKADDR_LEN;
n = NET_RecvFrom(fd, fullPacket, packetBufferLen, 0,
! (struct sockaddr *)&remote_addr, &len);
/* truncate the data if the packet's length is too small */
if (n > packetBufferLen) {
n = packetBufferLen;
}
! if (n == JVM_IO_ERR) {
(*env)->SetIntField(env, packet, dp_offsetID, 0);
(*env)->SetIntField(env, packet, dp_lengthID, 0);
if (errno == ECONNREFUSED) {
JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException",
"ICMP Port Unreachable");
--- 805,841 ----
int ret = NET_Timeout(fd, timeout);
if (ret <= 0) {
if (ret == 0) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException",
"Receive timed out");
! } else if (ret == -1) {
#ifdef __linux__
if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed");
}
#else
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
#endif
}
if (mallocedPacket) {
free(fullPacket);
}
return;
}
}
n = NET_RecvFrom(fd, fullPacket, packetBufferLen, 0,
! (struct sockaddr *)&remote_addr, &slen);
/* truncate the data if the packet's length is too small */
if (n > packetBufferLen) {
n = packetBufferLen;
}
! if (n == -1) {
(*env)->SetIntField(env, packet, dp_offsetID, 0);
(*env)->SetIntField(env, packet, dp_lengthID, 0);
if (errno == ECONNREFUSED) {
JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException",
"ICMP Port Unreachable");
*** 875,889 ****
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed");
}
}
- } else if (n == JVM_IO_INTR) {
- (*env)->SetIntField(env, packet, dp_offsetID, 0);
- (*env)->SetIntField(env, packet, dp_lengthID, 0);
- JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException",
- "operation interrupted");
} else {
int port;
jobject packetAddress;
/*
--- 844,853 ----
*** 948,958 ****
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
"Socket closed");
return;
}
! if ((fd = JVM_Socket(domain, SOCK_DGRAM, 0)) == JVM_IO_ERR) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error creating socket");
return;
}
--- 912,922 ----
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
"Socket closed");
return;
}
! if ((fd = socket(domain, SOCK_DGRAM, 0)) == -1) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error creating socket");
return;
}
*** 969,985 ****
}
#endif /* AF_INET6 */
#ifdef __APPLE__
arg = 65507;
! if (JVM_SetSockOpt(fd, SOL_SOCKET, SO_SNDBUF,
(char *)&arg, sizeof(arg)) < 0) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
strerror(errno));
return;
}
! if (JVM_SetSockOpt(fd, SOL_SOCKET, SO_RCVBUF,
(char *)&arg, sizeof(arg)) < 0) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
strerror(errno));
return;
}
--- 933,949 ----
}
#endif /* AF_INET6 */
#ifdef __APPLE__
arg = 65507;
! if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF,
(char *)&arg, sizeof(arg)) < 0) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
strerror(errno));
return;
}
! if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF,
(char *)&arg, sizeof(arg)) < 0) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
strerror(errno));
return;
}
*** 1082,1092 ****
in.s_addr = htonl(getInetAddress_addr(env, addr));
break;
}
}
! if (JVM_SetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_IF,
(const char*)&in, sizeof(in)) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error setting socket option");
}
}
--- 1046,1056 ----
in.s_addr = htonl(getInetAddress_addr(env, addr));
break;
}
}
! if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
(const char*)&in, sizeof(in)) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error setting socket option");
}
}
*** 1106,1116 ****
ni_indexID = (*env)->GetFieldID(env, c, "index", "I");
CHECK_NULL(ni_indexID);
}
index = (*env)->GetIntField(env, value, ni_indexID);
! if (JVM_SetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
(const char*)&index, sizeof(index)) < 0) {
if (errno == EINVAL && index > 0) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
"IPV6_MULTICAST_IF failed (interface has IPv4 "
"address only?)");
--- 1070,1080 ----
ni_indexID = (*env)->GetFieldID(env, c, "index", "I");
CHECK_NULL(ni_indexID);
}
index = (*env)->GetIntField(env, value, ni_indexID);
! if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
(const char*)&index, sizeof(index)) < 0) {
if (errno == EINVAL && index > 0) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
"IPV6_MULTICAST_IF failed (interface has IPv4 "
"address only?)");
*** 1131,1141 ****
static void mcast_set_if_by_addr_v4(JNIEnv *env, jobject this, int fd, jobject value) {
struct in_addr in;
in.s_addr = htonl( getInetAddress_addr(env, value) );
! if (JVM_SetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_IF,
(const char*)&in, sizeof(in)) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error setting socket option");
}
}
--- 1095,1105 ----
static void mcast_set_if_by_addr_v4(JNIEnv *env, jobject this, int fd, jobject value) {
struct in_addr in;
in.s_addr = htonl( getInetAddress_addr(env, value) );
! if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
(const char*)&in, sizeof(in)) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error setting socket option");
}
}
*** 1480,1492 ****
jobject addr;
jobject ni;
struct in_addr in;
struct in_addr *inP = ∈
! int len = sizeof(struct in_addr);
! if (JVM_GetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_IF,
(char *)inP, &len) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error getting socket option");
return NULL;
}
--- 1444,1456 ----
jobject addr;
jobject ni;
struct in_addr in;
struct in_addr *inP = ∈
! socklen_t len = sizeof(struct in_addr);
! if (getsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
(char *)inP, &len) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error getting socket option");
return NULL;
}
*** 1566,1582 ****
static jfieldID ni_addrsID;
static jclass ia_class;
static jmethodID ia_anyLocalAddressID;
int index;
! int len = sizeof(index);
jobjectArray addrArray;
jobject addr;
jobject ni;
! if (JVM_GetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
(char*)&index, &len) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error getting socket option");
return NULL;
}
--- 1530,1546 ----
static jfieldID ni_addrsID;
static jclass ia_class;
static jmethodID ia_anyLocalAddressID;
int index;
! socklen_t len = sizeof(index);
jobjectArray addrArray;
jobject addr;
jobject ni;
! if (getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
(char*)&index, &len) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error getting socket option");
return NULL;
}
*** 1787,1797 ****
/*
* Set TTL for a socket. Throw exception if failed.
*/
static void setTTL(JNIEnv *env, int fd, jint ttl) {
char ittl = (char)ttl;
! if (JVM_SetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ittl,
sizeof(ittl)) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error setting socket option");
}
}
--- 1751,1761 ----
/*
* Set TTL for a socket. Throw exception if failed.
*/
static void setTTL(JNIEnv *env, int fd, jint ttl) {
char ittl = (char)ttl;
! if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ittl,
sizeof(ittl)) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error setting socket option");
}
}
*** 1800,1810 ****
* Set hops limit for a socket. Throw exception if failed.
*/
#ifdef AF_INET6
static void setHopLimit(JNIEnv *env, int fd, jint ttl) {
int ittl = (int)ttl;
! if (JVM_SetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
(char*)&ittl, sizeof(ittl)) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error setting socket option");
}
}
--- 1764,1774 ----
* Set hops limit for a socket. Throw exception if failed.
*/
#ifdef AF_INET6
static void setHopLimit(JNIEnv *env, int fd, jint ttl) {
int ittl = (int)ttl;
! if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
(char*)&ittl, sizeof(ittl)) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error setting socket option");
}
}
*** 1881,1905 ****
}
/* getsockopt of TTL */
#ifdef AF_INET6
if (ipv6_available()) {
int ttl = 0;
! int len = sizeof(ttl);
! if (JVM_GetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
(char*)&ttl, &len) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error getting socket option");
return -1;
}
return (jint)ttl;
} else
#endif /* AF_INET6 */
{
u_char ttl = 0;
! int len = sizeof(ttl);
! if (JVM_GetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_TTL,
(char*)&ttl, &len) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error getting socket option");
return -1;
}
--- 1845,1869 ----
}
/* getsockopt of TTL */
#ifdef AF_INET6
if (ipv6_available()) {
int ttl = 0;
! socklen_t len = sizeof(ttl);
! if (getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
(char*)&ttl, &len) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error getting socket option");
return -1;
}
return (jint)ttl;
} else
#endif /* AF_INET6 */
{
u_char ttl = 0;
! socklen_t len = sizeof(ttl);
! if (getsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL,
(char*)&ttl, &len) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error getting socket option");
return -1;
}
*** 2048,2060 ****
#if defined(__linux__) && defined(AF_INET6)
if (ipv6_available()) {
int index;
! int len = sizeof(index);
! if (JVM_GetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
(char*)&index, &len) < 0) {
NET_ThrowCurrent(env, "getsockopt IPV6_MULTICAST_IF failed");
return;
}
--- 2012,2024 ----
#if defined(__linux__) && defined(AF_INET6)
if (ipv6_available()) {
int index;
! socklen_t len = sizeof(index);
! if (getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
(char*)&index, &len) < 0) {
NET_ThrowCurrent(env, "getsockopt IPV6_MULTICAST_IF failed");
return;
}
*** 2087,2097 ****
/*
* Join the multicast group.
*/
! if (JVM_SetSockOpt(fd, IPPROTO_IP, (join ? IP_ADD_MEMBERSHIP:IP_DROP_MEMBERSHIP),
(char *) &mname, mname_len) < 0) {
/*
* If IP_ADD_MEMBERSHIP returns ENOPROTOOPT on Linux and we've got
* IPv6 enabled then it's possible that the kernel has been fixed
--- 2051,2061 ----
/*
* Join the multicast group.
*/
! if (setsockopt(fd, IPPROTO_IP, (join ? IP_ADD_MEMBERSHIP:IP_DROP_MEMBERSHIP),
(char *) &mname, mname_len) < 0) {
/*
* If IP_ADD_MEMBERSHIP returns ENOPROTOOPT on Linux and we've got
* IPv6 enabled then it's possible that the kernel has been fixed
*** 2163,2175 ****
}
memcpy((void *)&(mname6.ipv6mr_multiaddr), caddr, sizeof(struct in6_addr));
if (IS_NULL(niObj)) {
int index;
! int len = sizeof(index);
! if (JVM_GetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
(char*)&index, &len) < 0) {
NET_ThrowCurrent(env, "getsockopt IPV6_MULTICAST_IF failed");
return;
}
--- 2127,2139 ----
}
memcpy((void *)&(mname6.ipv6mr_multiaddr), caddr, sizeof(struct in6_addr));
if (IS_NULL(niObj)) {
int index;
! socklen_t len = sizeof(index);
! if (getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
(char*)&index, &len) < 0) {
NET_ThrowCurrent(env, "getsockopt IPV6_MULTICAST_IF failed");
return;
}
*** 2209,2219 ****
#define S_ADD_MEMBERSHIP "IPV6_ADD_MEMBERSHIP"
#define S_DRP_MEMBERSHIP "IPV6_DROP_MEMBERSHIP"
#endif
/* Join the multicast group */
! if (JVM_SetSockOpt(fd, IPPROTO_IPV6, (join ? ADD_MEMBERSHIP : DRP_MEMBERSHIP),
(char *) &mname6, sizeof (mname6)) < 0) {
if (join) {
NET_ThrowCurrent(env, "setsockopt " S_ADD_MEMBERSHIP " failed");
} else {
--- 2173,2183 ----
#define S_ADD_MEMBERSHIP "IPV6_ADD_MEMBERSHIP"
#define S_DRP_MEMBERSHIP "IPV6_DROP_MEMBERSHIP"
#endif
/* Join the multicast group */
! if (setsockopt(fd, IPPROTO_IPV6, (join ? ADD_MEMBERSHIP : DRP_MEMBERSHIP),
(char *) &mname6, sizeof (mname6)) < 0) {
if (join) {
NET_ThrowCurrent(env, "setsockopt " S_ADD_MEMBERSHIP " failed");
} else {