--- a/src/java.base/solaris/classes/sun/nio/ch/FileDispatcherImpl.java Mon Oct 10 20:08:47 2022 +++ b/src/java.base/solaris/classes/sun/nio/ch/FileDispatcherImpl.java Mon Oct 10 19:39:09 2022 @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2000, 2022, 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. + */ + +package sun.nio.ch; + +import java.io.FileDescriptor; + +class FileDispatcherImpl extends UnixFileDispatcherImpl { + FileDispatcherImpl() { + super(); + } + + long transferTo(FileDescriptor src, long position, long count, + FileDescriptor dst, boolean append) { + return transferTo0(src, position, count, dst, append); + } + + // -- Native methods -- + + static native long transferTo0(FileDescriptor src, long position, + long count, FileDescriptor dst, + boolean append); +} --- a/src/java.base/solaris/native/libnio/ch/FileDispatcherImpl.c Mon Oct 10 20:09:47 2022 +++ b/src/java.base/solaris/native/libnio/ch/FileDispatcherImpl.c Mon Oct 10 19:39:25 2022 @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2000, 2022, 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 +#include + +#include "jni.h" +#include "nio.h" +#include "nio_util.h" +#include "sun_nio_ch_FileDispatcherImpl.h" + +JNIEXPORT jlong JNICALL +Java_sun_nio_ch_FileDispatcherImpl_transferTo0(JNIEnv *env, jobject this, + jobject srcFDO, + jlong position, jlong count, + jobject dstFDO, jboolean append) +{ + jint srcFD = fdval(env, srcFDO); + jint dstFD = fdval(env, dstFDO); + + sendfilevec64_t sfv; + size_t numBytes = 0; + jlong result; + + sfv.sfv_fd = srcFD; + sfv.sfv_flag = 0; + sfv.sfv_off = (off64_t)position; + sfv.sfv_len = count; + + result = sendfilev64(dstFD, &sfv, 1, &numBytes); + + /* Solaris sendfilev() will return -1 even if some bytes have been + * transferred, so we check numBytes first. + */ + if (numBytes > 0) + return numBytes; + if (result < 0) { + if (errno == EAGAIN) + return IOS_UNAVAILABLE; + if (errno == EOPNOTSUPP) + return IOS_UNSUPPORTED_CASE; + if ((errno == EINVAL) && ((ssize_t)count >= 0)) + return IOS_UNSUPPORTED_CASE; + if (errno == EINTR) + return IOS_INTERRUPTED; + JNU_ThrowIOExceptionWithLastError(env, "Transfer failed"); + return IOS_THROWN; + } + return result; +}