1396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath/* 2519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. 3396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * 5396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * This code is free software; you can redistribute it and/or modify it 6396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * under the terms of the GNU General Public License version 2 only, as 7396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * published by the Free Software Foundation. Oracle designates this 8396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * particular file as subject to the "Classpath" exception as provided 9396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * by Oracle in the LICENSE file that accompanied this code. 10396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * 11396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * This code is distributed in the hope that it will be useful, but WITHOUT 12396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * version 2 for more details (a copy is included in the LICENSE file that 15396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * accompanied this code). 16396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * 17396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * You should have received a copy of the GNU General Public License version 18396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * 2 along with this work; if not, write to the Free Software Foundation, 19396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * 21396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * or visit www.oracle.com if you need additional information or have any 23396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath * questions. 24396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath */ 25396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath 26396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath/* 27396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath */ 28396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath 29396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath#include "jni.h" 30396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath#include "jni_util.h" 31396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath#include "jvm.h" 32396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath#include "jlong.h" 33396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath// Android removed. 34396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath// 35396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath#include <unistd.h> 36396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath#include <sys/types.h> 37396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath#include <sys/uio.h> 38396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath#include <sys/socket.h> 39396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath#include <string.h> 40396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath 41396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath#include "nio_util.h" 42396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath#include <limits.h> 43396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath 44fade2d5bb6ee8a4d3e13d3341d439bae58e20cfcNarayan Kamath#include "nio.h" 45cab01ac294bb8ded259851673baa4c6ca226f828Steven Moreland#include <nativehelper/JNIHelp.h> 46fade2d5bb6ee8a4d3e13d3341d439bae58e20cfcNarayan Kamath 47fade2d5bb6ee8a4d3e13d3341d439bae58e20cfcNarayan Kamath#define NATIVE_METHOD(className, functionName, signature) \ 48fade2d5bb6ee8a4d3e13d3341d439bae58e20cfcNarayan Kamath{ #functionName, signature, (void*)(Java_sun_nio_ch_ ## className ## _ ## functionName) } 49fade2d5bb6ee8a4d3e13d3341d439bae58e20cfcNarayan Kamath 50396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan KamathJNIEXPORT jint JNICALL 51396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan KamathJava_sun_nio_ch_DatagramDispatcher_read0(JNIEnv *env, jclass clazz, 52396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath jobject fdo, jlong address, jint len) 53396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath{ 54396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath jint fd = fdval(env, fdo); 55396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath void *buf = (void *)jlong_to_ptr(address); 56396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath int result = recv(fd, buf, len, 0); 57396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath if (result < 0 && errno == ECONNREFUSED) { 58396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", 0); 59396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath return -2; 60396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath } 61396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath return convertReturnVal(env, result, JNI_TRUE); 62396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath} 63396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath 64396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath// Android-changed : Use sysconf for IOV_MAX. 65396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamathstatic int iov_max = -1; 66396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath 67396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan KamathJNIEXPORT jlong JNICALL 68396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan KamathJava_sun_nio_ch_DatagramDispatcher_readv0(JNIEnv *env, jclass clazz, 69396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath jobject fdo, jlong address, jint len) 70396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath{ 71396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath jint fd = fdval(env, fdo); 72396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath ssize_t result = 0; 73396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath struct iovec *iov = (struct iovec *)jlong_to_ptr(address); 74396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath struct msghdr m; 75396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath 76396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath // Android-changed : Use sysconf for IOV_MAX. 77396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath if (iov_max == -1) { 78396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath iov_max = sysconf(_SC_IOV_MAX); 79396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath } 80396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath if (len > iov_max) { 81396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath len = iov_max; 82396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath } 83396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath 84396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath // initialize the message 85396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath memset(&m, 0, sizeof(m)); 86396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath m.msg_iov = iov; 87396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath m.msg_iovlen = len; 88396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath 89396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath result = recvmsg(fd, &m, 0); 90396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath if (result < 0 && errno == ECONNREFUSED) { 91396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", 0); 92396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath return -2; 93396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath } 94396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath return convertLongReturnVal(env, (jlong)result, JNI_TRUE); 95396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath} 96396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath 97396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan KamathJNIEXPORT jint JNICALL 98396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan KamathJava_sun_nio_ch_DatagramDispatcher_write0(JNIEnv *env, jclass clazz, 99396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath jobject fdo, jlong address, jint len) 100396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath{ 101396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath jint fd = fdval(env, fdo); 102396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath void *buf = (void *)jlong_to_ptr(address); 103396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath int result = send(fd, buf, len, 0); 104396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath if (result < 0 && errno == ECONNREFUSED) { 105396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", 0); 106396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath return -2; 107396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath } 108396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath return convertReturnVal(env, result, JNI_FALSE); 109396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath} 110396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath 111396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan KamathJNIEXPORT jlong JNICALL 112396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan KamathJava_sun_nio_ch_DatagramDispatcher_writev0(JNIEnv *env, jclass clazz, 113396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath jobject fdo, jlong address, jint len) 114396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath{ 115396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath jint fd = fdval(env, fdo); 116396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath struct iovec *iov = (struct iovec *)jlong_to_ptr(address); 117396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath struct msghdr m; 118396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath ssize_t result = 0; 119396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath 120396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath // Android-changed : Use sysconf for IOV_MAX. 121396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath if (iov_max == -1) { 122396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath iov_max = sysconf(_SC_IOV_MAX); 123396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath } 124396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath 125396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath if (len > iov_max) { 126396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath len = iov_max; 127396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath } 128396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath 129396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath // initialize the message 130396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath memset(&m, 0, sizeof(m)); 131396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath m.msg_iov = iov; 132396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath m.msg_iovlen = len; 133396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath 134396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath result = sendmsg(fd, &m, 0); 135396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath if (result < 0 && errno == ECONNREFUSED) { 136396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", 0); 137396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath return -2; 138396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath } 139396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath return convertLongReturnVal(env, (jlong)result, JNI_FALSE); 140396f2361ba82cce530a4ff8aa9ac0780af8d4d56Narayan Kamath} 141fade2d5bb6ee8a4d3e13d3341d439bae58e20cfcNarayan Kamath 142fade2d5bb6ee8a4d3e13d3341d439bae58e20cfcNarayan Kamathstatic JNINativeMethod gMethods[] = { 143fade2d5bb6ee8a4d3e13d3341d439bae58e20cfcNarayan Kamath NATIVE_METHOD(DatagramDispatcher, read0, "(Ljava/io/FileDescriptor;JI)I"), 144fade2d5bb6ee8a4d3e13d3341d439bae58e20cfcNarayan Kamath NATIVE_METHOD(DatagramDispatcher, readv0, "(Ljava/io/FileDescriptor;JI)J"), 145fade2d5bb6ee8a4d3e13d3341d439bae58e20cfcNarayan Kamath NATIVE_METHOD(DatagramDispatcher, write0, "(Ljava/io/FileDescriptor;JI)I"), 146fade2d5bb6ee8a4d3e13d3341d439bae58e20cfcNarayan Kamath NATIVE_METHOD(DatagramDispatcher, writev0, "(Ljava/io/FileDescriptor;JI)J"), 147fade2d5bb6ee8a4d3e13d3341d439bae58e20cfcNarayan Kamath}; 148fade2d5bb6ee8a4d3e13d3341d439bae58e20cfcNarayan Kamath 149fade2d5bb6ee8a4d3e13d3341d439bae58e20cfcNarayan Kamathvoid register_sun_nio_ch_DatagramDispatcher(JNIEnv* env) { 15009f993b04651359387d5e089b076994bb6cccc5fNarayan Kamath jniRegisterNativeMethods(env, "sun/nio/ch/DatagramDispatcher", gMethods, NELEM(gMethods)); 151fade2d5bb6ee8a4d3e13d3341d439bae58e20cfcNarayan Kamath} 152