/* * Class: java_net_DualStackPlainSocketImpl * Method: setIntOption * Signature: (III)V */ JNIEXPORT void JNICALL Java_java_net_DualStackPlainSocketImpl_setIntOption (JNIEnv *env, jclass clazz, jint fd, jint cmd, jint value) { int level, opt; struct linger linger; char *parg; int arglen; if (NET_MapSocketOption(cmd, &level, &opt) < 0) { JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Invalid option"); return; } if (opt == java_net_SocketOptions_SO_LINGER) { parg = (char *)&linger; arglen = sizeof(linger); if (value >= 0) { linger.l_onoff = 1; linger.l_linger = (unsigned short)value; } else { linger.l_onoff = 0; linger.l_linger = 0; } } else { parg = (char *)&value; arglen = sizeof(value); } if (NET_SetSockOpt(fd, level, opt, parg, arglen) < 0) { NET_ThrowNew(env, WSAGetLastError(), "setsockopt"); } }
/* * Class: java_net_DualStackPlainSocketImpl * Method: getIntOption * Signature: (II)I */ JNIEXPORT jint JNICALL Java_java_net_DualStackPlainSocketImpl_getIntOption (JNIEnv *env, jclass clazz, jint fd, jint cmd) { int level, opt; int result=0; struct linger linger; char *arg; int arglen; if (NET_MapSocketOption(cmd, &level, &opt) < 0) { JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Unsupported socket option"); return -1; } if (opt == java_net_SocketOptions_SO_LINGER) { arg = (char *)&linger; arglen = sizeof(linger); } else { arg = (char *)&result; arglen = sizeof(result); } if (NET_GetSockOpt(fd, level, opt, arg, &arglen) < 0) { NET_ThrowNew(env, WSAGetLastError(), "getsockopt"); return -1; } if (opt == java_net_SocketOptions_SO_LINGER) return linger.l_onoff ? linger.l_linger : -1; else return result; }
/* * Class: java_net_DualStackPlainDatagramSocketImpl * Method: socketSetIntOption * Signature: (III)V */ JNIEXPORT void JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketSetIntOption (JNIEnv *env, jclass clazz, jint fd , jint cmd, jint value) { int level = 0, opt = 0; if (NET_MapSocketOption(cmd, &level, &opt) < 0) { JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Invalid option"); return; } if (NET_SetSockOpt(fd, level, opt, (char *)&value, sizeof(value)) < 0) { NET_ThrowNew(env, WSAGetLastError(), "setsockopt"); } }
/* call NET_MapSocketOptionV6 for the IPv6 fd only * and NET_MapSocketOption for the IPv4 fd */ JNIEXPORT int JNICALL NET_MapSocketOptionV6(jint cmd, int *level, int *optname) { switch (cmd) { case java_net_SocketOptions_IP_MULTICAST_IF: case java_net_SocketOptions_IP_MULTICAST_IF2: *level = IPPROTO_IPV6; *optname = IPV6_MULTICAST_IF; return 0; case java_net_SocketOptions_IP_MULTICAST_LOOP: *level = IPPROTO_IPV6; *optname = IPV6_MULTICAST_LOOP; return 0; } return NET_MapSocketOption (cmd, level, optname); }
/* * Class: java_net_DualStackPlainDatagramSocketImpl * Method: socketGetIntOption * Signature: (II)I */ JNIEXPORT jint JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketGetIntOption (JNIEnv *env, jclass clazz, jint fd, jint cmd) { int level = 0, opt = 0, result=0; int result_len = sizeof(result); if (NET_MapSocketOption(cmd, &level, &opt) < 0) { JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Invalid option"); return -1; } if (NET_GetSockOpt(fd, level, opt, (void *)&result, &result_len) < 0) { NET_ThrowNew(env, WSAGetLastError(), "getsockopt"); return -1; } return result; }
JNIEXPORT void JNICALL Java_sun_nio_ch_Net_setIntOption0(JNIEnv *env, jclass clazz, jobject fdo, jint opt, jint arg) { int klevel, kopt; int result; struct linger linger; void *parg; int arglen; if (NET_MapSocketOption(opt, &klevel, &kopt) < 0) { JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Unsupported socket option"); return; } if (opt == java_net_SocketOptions_SO_LINGER) { parg = (void *)&linger; arglen = sizeof(linger); if (arg >= 0) { linger.l_onoff = 1; linger.l_linger = arg; } else { linger.l_onoff = 0; linger.l_linger = 0; } } else { parg = (void *)&arg; arglen = sizeof(arg); } if (NET_SetSockOpt(fdval(env, fdo), klevel, kopt, parg, arglen) < 0) { JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "sun.nio.ch.Net.setIntOption"); } }
JNIEXPORT jint JNICALL Java_sun_nio_ch_Net_getIntOption0(JNIEnv *env, jclass clazz, jobject fdo, jint opt) { int klevel, kopt; int result; struct linger linger; void *arg; int arglen; if (NET_MapSocketOption(opt, &klevel, &kopt) < 0) { JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Unsupported socket option"); return -1; } if (opt == java_net_SocketOptions_SO_LINGER) { arg = (void *)&linger; arglen = sizeof(linger); } else { arg = (void *)&result; arglen = sizeof(result); } if (NET_GetSockOpt(fdval(env, fdo), klevel, kopt, arg, &arglen) < 0) { JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "sun.nio.ch.Net.getIntOption"); return -1; } if (opt == java_net_SocketOptions_SO_LINGER) return linger.l_onoff ? linger.l_linger : -1; else return result; }