SocketChannelImpl.c revision ac740d8c4dd4c7c17ae9d32d0989c48b93697c88
1/* 2 * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26#include <netdb.h> 27#include <sys/types.h> 28#include <sys/socket.h> 29#include <stdlib.h> 30#include <errno.h> 31#include <string.h> 32#include <poll.h> 33 34#if __linux__ 35#include <netinet/in.h> 36#endif 37 38#include "jni.h" 39#include "jni_util.h" 40#include "net_util.h" 41#include "jvm.h" 42#include "jlong.h" 43#include "sun_nio_ch_SocketChannelImpl.h" 44#include "nio_util.h" 45#include "nio.h" 46 47#include "JNIHelp.h" 48 49#define NATIVE_METHOD(className, functionName, signature) \ 50{ #functionName, signature, (void*)(Java_sun_nio_ch_ ## className ## _ ## functionName) } 51 52JNIEXPORT jint JNICALL 53Java_sun_nio_ch_SocketChannelImpl_checkConnect(JNIEnv *env, jobject this, 54 jobject fdo, jboolean block, 55 jboolean ready) 56{ 57 int error = 0; 58 socklen_t n = sizeof(int); 59 jint fd = fdval(env, fdo); 60 int result = 0; 61 struct pollfd poller; 62 63 poller.revents = 1; 64 if (!ready) { 65 poller.fd = fd; 66 poller.events = POLLOUT; 67 poller.revents = 0; 68 result = poll(&poller, 1, block ? -1 : 0); 69 if (result < 0) { 70 JNU_ThrowIOExceptionWithLastError(env, "Poll failed"); 71 return IOS_THROWN; 72 } 73 if (!block && (result == 0)) 74 return IOS_UNAVAILABLE; 75 } 76 77 if (poller.revents) { 78 errno = 0; 79 result = getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &n); 80 if (result < 0) { 81 handleSocketError(env, errno); 82 return JNI_FALSE; 83 } else if (error) { 84 handleSocketError(env, error); 85 return JNI_FALSE; 86 } 87 return 1; 88 } 89 return 0; 90} 91 92JNIEXPORT jint JNICALL 93Java_sun_nio_ch_SocketChannelImpl_sendOutOfBandData(JNIEnv* env, jclass this, 94 jobject fdo, jbyte b) 95{ 96 int n = send(fdval(env, fdo), (const void*)&b, 1, MSG_OOB); 97 return convertReturnVal(env, n, JNI_FALSE); 98} 99 100static JNINativeMethod gMethods[] = { 101 NATIVE_METHOD(SocketChannelImpl, checkConnect, "(Ljava/io/FileDescriptor;ZZ)I"), 102 NATIVE_METHOD(SocketChannelImpl, sendOutOfBandData, "(Ljava/io/FileDescriptor;B)I"), 103}; 104 105void register_sun_nio_ch_SocketChannelImpl(JNIEnv* env) { 106 jniRegisterNativeMethods(env, SUN_NIO_CH(SocketChannelImpl), gMethods, NELEM(gMethods)); 107} 108