diff -r 115e09b7a004 -r 3acf8e5e2ca0 jdk/src/solaris/native/sun/nio/ch/FileDispatcher.c --- a/jdk/src/solaris/native/sun/nio/ch/FileDispatcher.c Wed Feb 11 13:16:53 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,147 +0,0 @@ -/* - * Copyright 2000-2002 Sun Microsystems, Inc. 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. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.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_FileDispatcher.h" -#include -#include -#include -#include -#include "nio_util.h" - - -static int preCloseFD = -1; /* File descriptor to which we dup other fd's - before closing them for real */ - - -JNIEXPORT void JNICALL -Java_sun_nio_ch_FileDispatcher_init(JNIEnv *env, jclass cl) -{ - int sp[2]; - if (socketpair(PF_UNIX, SOCK_STREAM, 0, sp) < 0) { - JNU_ThrowIOExceptionWithLastError(env, "socketpair failed"); - return; - } - preCloseFD = sp[0]; - close(sp[1]); -} - -JNIEXPORT jint JNICALL -Java_sun_nio_ch_FileDispatcher_read0(JNIEnv *env, jclass clazz, - jobject fdo, jlong address, jint len) -{ - jint fd = fdval(env, fdo); - void *buf = (void *)jlong_to_ptr(address); - - return convertReturnVal(env, read(fd, buf, len), JNI_TRUE); -} - -JNIEXPORT jint JNICALL -Java_sun_nio_ch_FileDispatcher_pread0(JNIEnv *env, jclass clazz, jobject fdo, - jlong address, jint len, jlong offset) -{ - jint fd = fdval(env, fdo); - void *buf = (void *)jlong_to_ptr(address); - - return convertReturnVal(env, pread64(fd, buf, len, offset), JNI_TRUE); -} - -JNIEXPORT jlong JNICALL -Java_sun_nio_ch_FileDispatcher_readv0(JNIEnv *env, jclass clazz, - jobject fdo, jlong address, jint len) -{ - jint fd = fdval(env, fdo); - struct iovec *iov = (struct iovec *)jlong_to_ptr(address); - if (len > 16) { - len = 16; - } - return convertLongReturnVal(env, readv(fd, iov, len), JNI_TRUE); -} - -JNIEXPORT jint JNICALL -Java_sun_nio_ch_FileDispatcher_write0(JNIEnv *env, jclass clazz, - jobject fdo, jlong address, jint len) -{ - jint fd = fdval(env, fdo); - void *buf = (void *)jlong_to_ptr(address); - - return convertReturnVal(env, write(fd, buf, len), JNI_FALSE); -} - -JNIEXPORT jint JNICALL -Java_sun_nio_ch_FileDispatcher_pwrite0(JNIEnv *env, jclass clazz, jobject fdo, - jlong address, jint len, jlong offset) -{ - jint fd = fdval(env, fdo); - void *buf = (void *)jlong_to_ptr(address); - - return convertReturnVal(env, pwrite64(fd, buf, len, offset), JNI_FALSE); -} - -JNIEXPORT jlong JNICALL -Java_sun_nio_ch_FileDispatcher_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); - if (len > 16) { - len = 16; - } - return convertLongReturnVal(env, writev(fd, iov, len), JNI_FALSE); -} - -static void closeFileDescriptor(JNIEnv *env, int fd) { - if (fd != -1) { - int result = close(fd); - if (result < 0) - JNU_ThrowIOExceptionWithLastError(env, "Close failed"); - } -} - -JNIEXPORT void JNICALL -Java_sun_nio_ch_FileDispatcher_close0(JNIEnv *env, jclass clazz, jobject fdo) -{ - jint fd = fdval(env, fdo); - closeFileDescriptor(env, fd); -} - -JNIEXPORT void JNICALL -Java_sun_nio_ch_FileDispatcher_preClose0(JNIEnv *env, jclass clazz, jobject fdo) -{ - jint fd = fdval(env, fdo); - if (preCloseFD >= 0) { - if (dup2(preCloseFD, fd) < 0) - JNU_ThrowIOExceptionWithLastError(env, "dup2 failed"); - } -} - -JNIEXPORT void JNICALL -Java_sun_nio_ch_FileDispatcher_closeIntFD(JNIEnv *env, jclass clazz, jint fd) -{ - closeFileDescriptor(env, fd); -}