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);
|