350 351 /* 352 * Class: java_net_DualStackPlainSocketImpl 353 * Method: shutdown0 354 * Signature: (II)V 355 */ 356 JNIEXPORT void JNICALL Java_java_net_DualStackPlainSocketImpl_shutdown0 357 (JNIEnv *env, jclass clazz, jint fd, jint howto) { 358 shutdown(fd, howto); 359 } 360 361 362 /* 363 * Class: java_net_DualStackPlainSocketImpl 364 * Method: setIntOption 365 * Signature: (III)V 366 */ 367 JNIEXPORT void JNICALL Java_java_net_DualStackPlainSocketImpl_setIntOption 368 (JNIEnv *env, jclass clazz, jint fd, jint cmd, jint value) { 369 370 int level, opt; 371 struct linger linger; 372 char *parg; 373 int arglen; 374 375 if (NET_MapSocketOption(cmd, &level, &opt) < 0) { 376 JNU_ThrowByNameWithLastError(env, 377 JNU_JAVANETPKG "SocketException", 378 "Invalid option"); 379 return; 380 } 381 382 if (opt == java_net_SocketOptions_SO_LINGER) { 383 parg = (char *)&linger; 384 arglen = sizeof(linger); 385 if (value >= 0) { 386 linger.l_onoff = 1; 387 linger.l_linger = (unsigned short)value; 388 } else { 389 linger.l_onoff = 0; 390 linger.l_linger = 0; 391 } 392 } else { 393 parg = (char *)&value; 394 arglen = sizeof(value); 395 } 396 397 if (NET_SetSockOpt(fd, level, opt, parg, arglen) < 0) { 398 NET_ThrowNew(env, WSAGetLastError(), "setsockopt"); 399 } 400 } 401 402 /* 403 * Class: java_net_DualStackPlainSocketImpl 404 * Method: getIntOption 405 * Signature: (II)I 406 */ 407 JNIEXPORT jint JNICALL Java_java_net_DualStackPlainSocketImpl_getIntOption 408 (JNIEnv *env, jclass clazz, jint fd, jint cmd) { 409 410 int level, opt; 411 int result=0; 412 struct linger linger; 413 char *arg; 414 int arglen; 415 416 if (NET_MapSocketOption(cmd, &level, &opt) < 0) { 417 JNU_ThrowByNameWithLastError(env, 418 JNU_JAVANETPKG "SocketException", 419 "Unsupported socket option"); 420 return -1; 421 } 422 423 if (opt == java_net_SocketOptions_SO_LINGER) { 424 arg = (char *)&linger; 425 arglen = sizeof(linger); 426 } else { 427 arg = (char *)&result; 428 arglen = sizeof(result); 429 } 430 431 if (NET_GetSockOpt(fd, level, opt, arg, &arglen) < 0) { 432 NET_ThrowNew(env, WSAGetLastError(), "getsockopt"); | 350 351 /* 352 * Class: java_net_DualStackPlainSocketImpl 353 * Method: shutdown0 354 * Signature: (II)V 355 */ 356 JNIEXPORT void JNICALL Java_java_net_DualStackPlainSocketImpl_shutdown0 357 (JNIEnv *env, jclass clazz, jint fd, jint howto) { 358 shutdown(fd, howto); 359 } 360 361 362 /* 363 * Class: java_net_DualStackPlainSocketImpl 364 * Method: setIntOption 365 * Signature: (III)V 366 */ 367 JNIEXPORT void JNICALL Java_java_net_DualStackPlainSocketImpl_setIntOption 368 (JNIEnv *env, jclass clazz, jint fd, jint cmd, jint value) { 369 370 int level = 0, opt = 0; 371 struct linger linger = {0, 0}; 372 char *parg; 373 int arglen; 374 375 if (NET_MapSocketOption(cmd, &level, &opt) < 0) { 376 JNU_ThrowByNameWithLastError(env, 377 JNU_JAVANETPKG "SocketException", 378 "Invalid option"); 379 return; 380 } 381 382 if (opt == java_net_SocketOptions_SO_LINGER) { 383 parg = (char *)&linger; 384 arglen = sizeof(linger); 385 if (value >= 0) { 386 linger.l_onoff = 1; 387 linger.l_linger = (unsigned short)value; 388 } else { 389 linger.l_onoff = 0; 390 linger.l_linger = 0; 391 } 392 } else { 393 parg = (char *)&value; 394 arglen = sizeof(value); 395 } 396 397 if (NET_SetSockOpt(fd, level, opt, parg, arglen) < 0) { 398 NET_ThrowNew(env, WSAGetLastError(), "setsockopt"); 399 } 400 } 401 402 /* 403 * Class: java_net_DualStackPlainSocketImpl 404 * Method: getIntOption 405 * Signature: (II)I 406 */ 407 JNIEXPORT jint JNICALL Java_java_net_DualStackPlainSocketImpl_getIntOption 408 (JNIEnv *env, jclass clazz, jint fd, jint cmd) { 409 410 int level = 0, opt = 0; 411 int result=0; 412 struct linger linger = {0, 0}; 413 char *arg; 414 int arglen; 415 416 if (NET_MapSocketOption(cmd, &level, &opt) < 0) { 417 JNU_ThrowByNameWithLastError(env, 418 JNU_JAVANETPKG "SocketException", 419 "Unsupported socket option"); 420 return -1; 421 } 422 423 if (opt == java_net_SocketOptions_SO_LINGER) { 424 arg = (char *)&linger; 425 arglen = sizeof(linger); 426 } else { 427 arg = (char *)&result; 428 arglen = sizeof(result); 429 } 430 431 if (NET_GetSockOpt(fd, level, opt, arg, &arglen) < 0) { 432 NET_ThrowNew(env, WSAGetLastError(), "getsockopt"); |