< prev index next >

src/java.base/windows/native/libnet/TwoStacksPlainDatagramSocketImpl.c

Print this page
rev 15720 : 8166850: No runtime error expected after calling NET_MapSocketOption


1778                         "no InetAddress instances of requested type");
1779                 return;
1780             }
1781 
1782             if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
1783                                (const char*)&in, sizeof(in)) < 0) {
1784                 JNU_ThrowByNameWithMessageAndLastError
1785                     (env, JNU_JAVANETPKG "SocketException", "Error setting socket option");
1786             }
1787             return;
1788         }
1789     }
1790 }
1791 
1792 /*
1793  * Class:     java_net_TwoStacksPlainDatagramSocketImpl
1794  * Method:    socketNativeSetOption
1795  * Signature: (ILjava/lang/Object;)V
1796  */
1797 JNIEXPORT void JNICALL
1798 Java_java_net_TwoStacksPlainDatagramSocketImpl_socketNativeSetOption(JNIEnv *env,jobject this,
1799                                                       jint opt,jobject value) {
1800 
1801     int fd=-1, fd1=-1;
1802     int levelv4 = 0, levelv6 = 0, optnamev4 = 0, optnamev6 = 0, optlen = 0;
1803     union {
1804         int i;
1805         char c;
1806     } optval = { 0 };
1807     int ipv6_supported = ipv6_available();
1808     fd = getFD(env, this);
1809 
1810     if (ipv6_supported) {
1811         fd1 = getFD1(env, this);
1812     }
1813     if (fd < 0 && fd1 < 0) {
1814         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "socket closed");
1815         return;
1816     }
1817 
1818     if ((opt == java_net_SocketOptions_IP_MULTICAST_IF) ||
1819         (opt == java_net_SocketOptions_IP_MULTICAST_IF2)) {
1820 
1821         setMulticastInterface(env, this, fd, fd1, opt, value);
1822         return;
1823     }
1824 
1825     /*
1826      * Map the Java level socket option to the platform specific
1827      * level(s) and option name(s).
1828      */
1829     if (fd1 != -1) {
1830         if (NET_MapSocketOptionV6(opt, &levelv6, &optnamev6)) {
1831             JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Invalid option");
1832             return;
1833         }
1834     }
1835     if (fd != -1) {
1836         if (NET_MapSocketOption(opt, &levelv4, &optnamev4)) {
1837             JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Invalid option");
1838             return;
1839         }
1840     }
1841 
1842     switch (opt) {
1843         case java_net_SocketOptions_SO_SNDBUF :
1844         case java_net_SocketOptions_SO_RCVBUF :
1845         case java_net_SocketOptions_IP_TOS :
1846             {
1847                 jclass cls;
1848                 jfieldID fid;
1849 
1850                 cls = (*env)->FindClass(env, "java/lang/Integer");
1851                 CHECK_NULL(cls);
1852                 fid =  (*env)->GetFieldID(env, cls, "value", "I");
1853                 CHECK_NULL(fid);
1854 
1855                 optval.i = (*env)->GetIntField(env, value, fid);
1856                 optlen = sizeof(optval.i);
1857             }


2146         CHECK_NULL_RETURN(ni, NULL);
2147         (*env)->SetIntField(env, ni, ni_indexID, -1);
2148         addrArray = (*env)->NewObjectArray(env, 1, ia_class, NULL);
2149         CHECK_NULL_RETURN(addrArray, NULL);
2150         (*env)->SetObjectArrayElement(env, addrArray, 0, addr);
2151         (*env)->SetObjectField(env, ni, ni_addrsID, addrArray);
2152         return ni;
2153     }
2154     return NULL;
2155 }
2156 
2157 
2158 /*
2159  * Returns relevant info as a jint.
2160  *
2161  * Class:     java_net_TwoStacksPlainDatagramSocketImpl
2162  * Method:    socketGetOption
2163  * Signature: (I)Ljava/lang/Object;
2164  */
2165 JNIEXPORT jobject JNICALL
2166 Java_java_net_TwoStacksPlainDatagramSocketImpl_socketGetOption(JNIEnv *env, jobject this,
2167                                                       jint opt) {
2168 
2169     int fd=-1, fd1=-1;
2170     int level, optname, optlen;
2171     union {
2172         int i;
2173     } optval = {0};
2174     int ipv6_supported = ipv6_available();
2175 
2176     fd = getFD(env, this);
2177     if (ipv6_supported) {
2178         fd1 = getFD1(env, this);
2179     }
2180 
2181     if (fd < 0 && fd1 < 0) {
2182         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
2183                         "Socket closed");
2184         return NULL;
2185     }
2186 
2187     /*
2188      * Handle IP_MULTICAST_IF separately
2189      */
2190     if (opt == java_net_SocketOptions_IP_MULTICAST_IF ||
2191         opt == java_net_SocketOptions_IP_MULTICAST_IF2) {
2192         return getMulticastInterface(env, this, fd, fd1, opt);
2193     }
2194 
2195     /*
2196      * Map the Java level socket option to the platform specific
2197      * level and option name.
2198      */
2199     if (NET_MapSocketOption(opt, &level, &optname)) {
2200         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Invalid option");
2201         return NULL;
2202     }
2203 
2204     if (fd == -1) {
2205         if (NET_MapSocketOptionV6(opt, &level, &optname)) {
2206             JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Invalid option");
2207             return NULL;
2208         }
2209         fd = fd1; /* must be IPv6 only */
2210     }
2211 
2212     optlen = sizeof(optval.i);
2213     if (NET_GetSockOpt(fd, level, optname, (void *)&optval, &optlen) < 0) {
2214         char tmpbuf[255];
2215         int size = 0;
2216         char errmsg[255 + 31];
2217         getErrorString(errno, tmpbuf, sizeof(tmpbuf));
2218         sprintf(errmsg, "error getting socket option: %s", tmpbuf);
2219         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", errmsg);
2220         return NULL;
2221     }
2222 
2223     switch (opt) {
2224         case java_net_SocketOptions_SO_BROADCAST:
2225         case java_net_SocketOptions_SO_REUSEADDR:
2226             return createBoolean(env, optval.i);




1778                         "no InetAddress instances of requested type");
1779                 return;
1780             }
1781 
1782             if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
1783                                (const char*)&in, sizeof(in)) < 0) {
1784                 JNU_ThrowByNameWithMessageAndLastError
1785                     (env, JNU_JAVANETPKG "SocketException", "Error setting socket option");
1786             }
1787             return;
1788         }
1789     }
1790 }
1791 
1792 /*
1793  * Class:     java_net_TwoStacksPlainDatagramSocketImpl
1794  * Method:    socketNativeSetOption
1795  * Signature: (ILjava/lang/Object;)V
1796  */
1797 JNIEXPORT void JNICALL
1798 Java_java_net_TwoStacksPlainDatagramSocketImpl_socketNativeSetOption
1799   (JNIEnv *env,jobject this, jint opt,jobject value)
1800 {
1801     int fd=-1, fd1=-1;
1802     int levelv4 = 0, levelv6 = 0, optnamev4 = 0, optnamev6 = 0, optlen = 0;
1803     union {
1804         int i;
1805         char c;
1806     } optval = { 0 };
1807     int ipv6_supported = ipv6_available();
1808     fd = getFD(env, this);
1809 
1810     if (ipv6_supported) {
1811         fd1 = getFD1(env, this);
1812     }
1813     if (fd < 0 && fd1 < 0) {
1814         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "socket closed");
1815         return;
1816     }
1817 
1818     if ((opt == java_net_SocketOptions_IP_MULTICAST_IF) ||
1819         (opt == java_net_SocketOptions_IP_MULTICAST_IF2)) {
1820 
1821         setMulticastInterface(env, this, fd, fd1, opt, value);
1822         return;
1823     }
1824 
1825     /*
1826      * Map the Java level socket option to the platform specific
1827      * level(s) and option name(s).
1828      */
1829     if (fd1 != -1) {
1830         if (NET_MapSocketOptionV6(opt, &levelv6, &optnamev6)) {
1831             JNU_ThrowByName(env, "java/net/SocketException", "Invalid option");
1832             return;
1833         }
1834     }
1835     if (fd != -1) {
1836         if (NET_MapSocketOption(opt, &levelv4, &optnamev4)) {
1837             JNU_ThrowByName(env, "java/net/SocketException", "Invalid option");
1838             return;
1839         }
1840     }
1841 
1842     switch (opt) {
1843         case java_net_SocketOptions_SO_SNDBUF :
1844         case java_net_SocketOptions_SO_RCVBUF :
1845         case java_net_SocketOptions_IP_TOS :
1846             {
1847                 jclass cls;
1848                 jfieldID fid;
1849 
1850                 cls = (*env)->FindClass(env, "java/lang/Integer");
1851                 CHECK_NULL(cls);
1852                 fid =  (*env)->GetFieldID(env, cls, "value", "I");
1853                 CHECK_NULL(fid);
1854 
1855                 optval.i = (*env)->GetIntField(env, value, fid);
1856                 optlen = sizeof(optval.i);
1857             }


2146         CHECK_NULL_RETURN(ni, NULL);
2147         (*env)->SetIntField(env, ni, ni_indexID, -1);
2148         addrArray = (*env)->NewObjectArray(env, 1, ia_class, NULL);
2149         CHECK_NULL_RETURN(addrArray, NULL);
2150         (*env)->SetObjectArrayElement(env, addrArray, 0, addr);
2151         (*env)->SetObjectField(env, ni, ni_addrsID, addrArray);
2152         return ni;
2153     }
2154     return NULL;
2155 }
2156 
2157 
2158 /*
2159  * Returns relevant info as a jint.
2160  *
2161  * Class:     java_net_TwoStacksPlainDatagramSocketImpl
2162  * Method:    socketGetOption
2163  * Signature: (I)Ljava/lang/Object;
2164  */
2165 JNIEXPORT jobject JNICALL
2166 Java_java_net_TwoStacksPlainDatagramSocketImpl_socketGetOption
2167   (JNIEnv *env, jobject this, jint opt)
2168 {
2169     int fd=-1, fd1=-1;
2170     int level, optname, optlen;
2171     union {
2172         int i;
2173     } optval = {0};
2174     int ipv6_supported = ipv6_available();
2175 
2176     fd = getFD(env, this);
2177     if (ipv6_supported) {
2178         fd1 = getFD1(env, this);
2179     }
2180 
2181     if (fd < 0 && fd1 < 0) {
2182         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
2183                         "Socket closed");
2184         return NULL;
2185     }
2186 
2187     /*
2188      * Handle IP_MULTICAST_IF separately
2189      */
2190     if (opt == java_net_SocketOptions_IP_MULTICAST_IF ||
2191         opt == java_net_SocketOptions_IP_MULTICAST_IF2) {
2192         return getMulticastInterface(env, this, fd, fd1, opt);
2193     }
2194 
2195     /*
2196      * Map the Java level socket option to the platform specific
2197      * level and option name.
2198      */
2199     if (NET_MapSocketOption(opt, &level, &optname)) {
2200         JNU_ThrowByName(env, "java/net/SocketException", "Invalid option");
2201         return NULL;
2202     }
2203 
2204     if (fd == -1) {
2205         if (NET_MapSocketOptionV6(opt, &level, &optname)) {
2206             JNU_ThrowByName(env, "java/net/SocketException", "Invalid option");
2207             return NULL;
2208         }
2209         fd = fd1; /* must be IPv6 only */
2210     }
2211 
2212     optlen = sizeof(optval.i);
2213     if (NET_GetSockOpt(fd, level, optname, (void *)&optval, &optlen) < 0) {
2214         char tmpbuf[255];
2215         int size = 0;
2216         char errmsg[255 + 31];
2217         getErrorString(errno, tmpbuf, sizeof(tmpbuf));
2218         sprintf(errmsg, "error getting socket option: %s", tmpbuf);
2219         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", errmsg);
2220         return NULL;
2221     }
2222 
2223     switch (opt) {
2224         case java_net_SocketOptions_SO_BROADCAST:
2225         case java_net_SocketOptions_SO_REUSEADDR:
2226             return createBoolean(env, optval.i);


< prev index next >