diff -r 4ebc2e2fb97c -r 71c04702a3d5 src/java.base/unix/native/libnio/ch/DatagramDispatcher.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/java.base/unix/native/libnio/ch/DatagramDispatcher.c Tue Sep 12 19:03:39 2017 +0200 @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + */ + +#include "jni.h" +#include "jni_util.h" +#include "jvm.h" +#include "jlong.h" +#include "sun_nio_ch_DatagramDispatcher.h" +#include +#include +#include +#include + +#include "nio_util.h" +#include + +JNIEXPORT jint JNICALL +Java_sun_nio_ch_DatagramDispatcher_read0(JNIEnv *env, jclass clazz, + jobject fdo, jlong address, jint len) +{ + jint fd = fdval(env, fdo); + void *buf = (void *)jlong_to_ptr(address); + int result = recv(fd, buf, len, 0); + if (result < 0 && errno == ECONNREFUSED) { + JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", 0); + return -2; + } + return convertReturnVal(env, result, JNI_TRUE); +} + + +JNIEXPORT jlong JNICALL +Java_sun_nio_ch_DatagramDispatcher_readv0(JNIEnv *env, jclass clazz, + jobject fdo, jlong address, jint len) +{ + jint fd = fdval(env, fdo); + ssize_t result = 0; + struct iovec *iov = (struct iovec *)jlong_to_ptr(address); + struct msghdr m; + if (len > IOV_MAX) { + len = IOV_MAX; + } + + // initialize the message + memset(&m, 0, sizeof(m)); + m.msg_iov = iov; + m.msg_iovlen = len; + + result = recvmsg(fd, &m, 0); + if (result < 0 && errno == ECONNREFUSED) { + JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", 0); + return -2; + } + return convertLongReturnVal(env, (jlong)result, JNI_TRUE); +} + +JNIEXPORT jint JNICALL +Java_sun_nio_ch_DatagramDispatcher_write0(JNIEnv *env, jclass clazz, + jobject fdo, jlong address, jint len) +{ + jint fd = fdval(env, fdo); + void *buf = (void *)jlong_to_ptr(address); + int result = send(fd, buf, len, 0); + if (result < 0 && errno == ECONNREFUSED) { + JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", 0); + return -2; + } + return convertReturnVal(env, result, JNI_FALSE); +} + +JNIEXPORT jlong JNICALL +Java_sun_nio_ch_DatagramDispatcher_writev0(JNIEnv *env, jclass clazz, + jobject fdo, jlong address, jint len) +{ + jint fd = fdval(env, fdo); + struct iovec *iov = (struct iovec *)jlong_to_ptr(address); + struct msghdr m; + ssize_t result = 0; + if (len > IOV_MAX) { + len = IOV_MAX; + } + + // initialize the message + memset(&m, 0, sizeof(m)); + m.msg_iov = iov; + m.msg_iovlen = len; + + result = sendmsg(fd, &m, 0); + if (result < 0 && errno == ECONNREFUSED) { + JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", 0); + return -2; + } + return convertLongReturnVal(env, (jlong)result, JNI_FALSE); +}