151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1997, Oracle and/or its affiliates. All rights reserved.
351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code).
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions.
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
253d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski#include <sys/socket.h>
263d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski#include <sys/types.h>
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include "jni.h"
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include "jni_util.h"
3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include "jvm.h"
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
32cab01ac294bb8ded259851673baa4c6ca226f828Steven Moreland#include <nativehelper/JNIHelp.h>
333d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski
343d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski#define NATIVE_METHOD(className, functionName, signature) \
353d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski{ #functionName, signature, (void*)(className ## _ ## functionName) }
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*******************************************************************/
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*  BEGIN JNI ********* BEGIN JNI *********** BEGIN JNI ************/
3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*******************************************************************/
4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* field id for jint 'fd' in java.io.FileDescriptor */
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskijfieldID IO_fd_fdID;
4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/**************************************************************
4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * static methods to store field ID's in initializers
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
48f9d2599c4341d07938392d0d3f23a302755d4f93Przemyslaw Szczepaniakstatic void FileDescriptor_initIDs(JNIEnv *env) {
49f9d2599c4341d07938392d0d3f23a302755d4f93Przemyslaw Szczepaniak    jclass fdClass = (*env)->FindClass(env, "java/io/FileDescriptor");
50ba7cc9f5357c323a1006119a20ce025fd4c57fd2Piotr Jastrzebski    IO_fd_fdID = (*env)->GetFieldID(env, fdClass, "descriptor", "I");
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/**************************************************************
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * File Descriptor
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT void JNICALL
583d43823e17818b3c5f45831f830884917b181454Piotr JastrzebskiFileDescriptor_sync(JNIEnv *env, jobject this) {
5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    int fd = (*env)->GetIntField(env, this, IO_fd_fdID);
6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    if (JVM_Sync(fd) == -1) {
6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        JNU_ThrowByName(env, "java/io/SyncFailedException", "sync failed");
6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
643d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski
653d43823e17818b3c5f45831f830884917b181454Piotr JastrzebskiJNIEXPORT jboolean JNICALL FileDescriptor_isSocket(JNIEnv *env, jclass ignored, jint fd) {
663d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski    int error;
673d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski    socklen_t error_length = sizeof(error);
6802869f3468ab3254be65b841157c124f293a07b5Przemyslaw Szczepaniak    return TEMP_FAILURE_RETRY(getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &error_length)) == 0;
693d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski}
703d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski
713d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebskistatic JNINativeMethod gMethods[] = {
723d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski  NATIVE_METHOD(FileDescriptor, sync, "()V"),
733d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski  NATIVE_METHOD(FileDescriptor, isSocket, "(I)Z"),
743d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski};
753d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski
763d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebskivoid register_java_io_FileDescriptor(JNIEnv* env) {
77f9d2599c4341d07938392d0d3f23a302755d4f93Przemyslaw Szczepaniak    jniRegisterNativeMethods(env, "java/io/FileDescriptor", gMethods, NELEM(gMethods));
78f9d2599c4341d07938392d0d3f23a302755d4f93Przemyslaw Szczepaniak
79f9d2599c4341d07938392d0d3f23a302755d4f93Przemyslaw Szczepaniak    FileDescriptor_initIDs(env);
803d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski}
81