1 /* 2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 #include "jni.h" 27 #include "jni_util.h" 28 29 extern jfieldID IO_fd_fdID; 30 extern jfieldID IO_handle_fdID; 31 extern jfieldID IO_append_fdID; 32 extern jfieldID IO_pgsz_fdID; 33 34 #ifdef _ALLBSD_SOURCE 35 #include <fcntl.h> 36 #ifndef O_SYNC 37 #define O_SYNC O_FSYNC 38 #endif 39 #ifndef O_DSYNC 40 #define O_DSYNC O_FSYNC 41 #endif 42 #elif !defined(O_DSYNC) || !defined(O_SYNC) 43 #define O_SYNC (0x0800) 44 #define O_DSYNC (0x2000) 45 #endif 46 47 /* 48 * IO helper functions 49 */ 50 51 jint readSingle(JNIEnv *env, jobject this, jfieldID fid); 52 jint readBytes(JNIEnv *env, jobject this, jbyteArray bytes, jint off, 53 jint len, jfieldID fid); 54 jint readBytesD(JNIEnv *env, jobject this, jbyteArray bytes, jint off, 55 jint len, jfieldID fid, jfieldID pgsz_id); 56 void writeSingle(JNIEnv *env, jobject this, jint byte, jboolean append, jfieldID fid); 57 void writeBytes(JNIEnv *env, jobject this, jbyteArray bytes, jint off, 58 jint len, jboolean append, jfieldID fid); 59 void writeBytesD(JNIEnv *env, jobject this, jbyteArray bytes, jint off, 60 jint len, jboolean append, jfieldID fid, jfieldID pgsz_id); 61 void fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags); 62 void throwFileNotFoundException(JNIEnv *env, jstring path); 63 64 /* 65 * Macros for managing platform strings. The typical usage pattern is: 66 * 67 * WITH_PLATFORM_STRING(env, string, var) { 68 * doSomethingWith(var); 69 * } END_PLATFORM_STRING(env, var); 70 * 71 * where env is the prevailing JNIEnv, 72 * string is a JNI reference to a java.lang.String object, and 73 * var is the char * variable that will point to the string, 74 * after being converted into the platform encoding. 75 * 76 * The related macro WITH_FIELD_PLATFORM_STRING first extracts the string from 77 * a given field of a given object: 78 * 79 * WITH_FIELD_PLATFORM_STRING(env, object, id, var) { 80 * doSomethingWith(var); 81 * } END_PLATFORM_STRING(env, var); 82 * 83 * where env is the prevailing JNIEnv, 84 * object is a jobject, 85 * id is the field ID of the String field to be extracted, and 86 * var is the char * variable that will point to the string. 87 * 88 * Uses of these macros may be nested as long as each WITH_.._STRING macro 89 * declares a unique variable. 90 */ 91 92 #define WITH_PLATFORM_STRING(env, strexp, var) \ 93 if (1) { \ 94 const char *var; \ 95 jstring _##var##str = (strexp); \ 96 if (_##var##str == NULL) { \ 97 JNU_ThrowNullPointerException((env), NULL); \ 98 goto _##var##end; \ 99 } \ 100 var = JNU_GetStringPlatformChars((env), _##var##str, NULL); \ 101 if (var == NULL) goto _##var##end; 102 103 #define WITH_FIELD_PLATFORM_STRING(env, object, id, var) \ 104 WITH_PLATFORM_STRING(env, \ 105 ((object == NULL) \ 106 ? NULL \ 107 : (*(env))->GetObjectField((env), (object), (id))), \ 108 var) 109 110 #define END_PLATFORM_STRING(env, var) \ 111 JNU_ReleaseStringPlatformChars(env, _##var##str, var); \ 112 _##var##end: ; \ 113 } else ((void)NULL) 114 115 116 /* Macros for transforming Java Strings into native Unicode strings. 117 * Works analogously to WITH_PLATFORM_STRING. 118 */ 119 120 #define WITH_UNICODE_STRING(env, strexp, var) \ 121 if (1) { \ 122 const jchar *var; \ 123 jstring _##var##str = (strexp); \ 124 if (_##var##str == NULL) { \ 125 JNU_ThrowNullPointerException((env), NULL); \ 126 goto _##var##end; \ 127 } \ 128 var = (*(env))->GetStringChars((env), _##var##str, NULL); \ 129 if (var == NULL) goto _##var##end; 130 131 #define END_UNICODE_STRING(env, var) \ 132 (*(env))->ReleaseStringChars(env, _##var##str, var); \ 133 _##var##end: ; \ 134 } else ((void)NULL) 135 136 #define GET_PG_SIZE(this, IO_pgsz_fdID) \ 137 (*env)->GetIntField(env, (this), (IO_pgsz_fdID))