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 = &in; ! 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 = &in; ! 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 {