libcore_io_Linux.cpp revision 7e13c0f05ac9e7c55682d10e953dd4cbd5e6107c
13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/* 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright (C) 2011 The Android Open Source Project 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License. 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License. 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry */ 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define LOG_TAG "Posix" 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "JNIHelp.h" 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "JniConstants.h" 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "JniException.h" 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "ScopedUtfChars.h" 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "toStringArray.h" 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <errno.h> 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <stdlib.h> 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <unistd.h> 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <sys/mman.h> 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <sys/stat.h> 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void throwErrnoException(JNIEnv* env, const char* name) { 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int errnum = errno; 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry jthrowable cause = NULL; 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (env->ExceptionCheck()) { 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry cause = env->ExceptionOccurred(); 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry env->ExceptionClear(); 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ScopedLocalRef<jstring> javaName(env, env->NewStringUTF(name)); 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (javaName.get() == NULL) { 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Not really much we can do here. We're probably dead in the water, 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // but let's try to stumble on... 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry env->ExceptionClear(); 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry jobject exception; 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (cause != NULL) { 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static jmethodID ctor = env->GetMethodID(JniConstants::errnoExceptionClass, "<init>", 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "(Ljava/lang/String;ILjava/lang/Throwable;)V"); 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry exception = env->NewObject(JniConstants::errnoExceptionClass, ctor, 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry javaName.get(), errnum, cause); 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } else { 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static jmethodID ctor = env->GetMethodID(JniConstants::errnoExceptionClass, "<init>", 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "(Ljava/lang/String;I)V"); 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry exception = env->NewObject(JniConstants::errnoExceptionClass, ctor, javaName.get(), errnum); 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry env->Throw(reinterpret_cast<jthrowable>(exception)); 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename rc_t> 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic rc_t throwIfMinusOne(JNIEnv* env, const char* name, rc_t rc) { 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (rc == rc_t(-1)) { 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throwErrnoException(env, name); 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return rc; 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic jobject makeStructStat(JNIEnv* env, const struct stat& sb) { 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static jmethodID ctor = env->GetMethodID(JniConstants::structStatClass, "<init>", 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "(JJIJIIJJJJJJJ)V"); 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return env->NewObject(JniConstants::structStatClass, ctor, 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry jlong(sb.st_dev), jlong(sb.st_ino), jint(sb.st_mode), jlong(sb.st_nlink), 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry jint(sb.st_uid), jint(sb.st_gid), jlong(sb.st_rdev), jlong(sb.st_size), 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry jlong(sb.st_atime), jlong(sb.st_mtime), jlong(sb.st_ctime), 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry jlong(sb.st_blksize), jlong(sb.st_blocks)); 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic jobject doStat(JNIEnv* env, jstring javaPath, bool isLstat) { 803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ScopedUtfChars path(env, javaPath); 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (path.c_str() == NULL) { 823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return NULL; 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry struct stat sb; 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int rc = isLstat ? TEMP_FAILURE_RETRY(lstat(path.c_str(), &sb)) 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : TEMP_FAILURE_RETRY(stat(path.c_str(), &sb)); 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (rc == -1) { 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throwErrnoException(env, isLstat ? "lstat" : "stat"); 893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return NULL; 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return makeStructStat(env, sb); 923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 943c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic jboolean Posix_access(JNIEnv* env, jobject, jstring javaPath, jint mode) { 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ScopedUtfChars path(env, javaPath); 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (path.c_str() == NULL) { 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return JNI_FALSE; 983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int rc = TEMP_FAILURE_RETRY(access(path.c_str(), mode)); 1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (rc == -1) { 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throwErrnoException(env, "access"); 1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return (rc == 0); 1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic jobjectArray Posix_environ(JNIEnv* env, jobject) { 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry extern char** environ; // Standard, but not in any header file. 1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return toStringArray(env, environ); 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void Posix_fdatasync(JNIEnv* env, jobject, jobject javaFd) { 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int fd = jniGetFDFromFileDescriptor(env, javaFd); 1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throwIfMinusOne(env, "fdatasync", TEMP_FAILURE_RETRY(fdatasync(fd))); 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 115ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry 1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic jobject Posix_fstat(JNIEnv* env, jobject, jobject javaFd) { 1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int fd = jniGetFDFromFileDescriptor(env, javaFd); 1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry struct stat sb; 1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int rc = TEMP_FAILURE_RETRY(fstat(fd, &sb)); 120ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry if (rc == -1) { 121ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry throwErrnoException(env, "fstat"); 122ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry return NULL; 123ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry } 124ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry return makeStructStat(env, sb); 125ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry} 126ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry 127ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyrystatic void Posix_fsync(JNIEnv* env, jobject, jobject javaFd) { 128ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry int fd = jniGetFDFromFileDescriptor(env, javaFd); 129ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry throwIfMinusOne(env, "fsync", TEMP_FAILURE_RETRY(fsync(fd))); 130ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry} 131ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry 132ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyrystatic void Posix_ftruncate(JNIEnv* env, jobject, jobject javaFd, jlong length) { 133ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry int fd = jniGetFDFromFileDescriptor(env, javaFd); 134ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry throwIfMinusOne(env, "ftruncate", TEMP_FAILURE_RETRY(ftruncate64(fd, length))); 135ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry} 136ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry 137ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyrystatic jstring Posix_getenv(JNIEnv* env, jobject, jstring javaName) { 138ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry ScopedUtfChars name(env, javaName); 139ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry if (name.c_str() == NULL) { 140ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry return NULL; 141ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry } 142ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry return env->NewStringUTF(getenv(name.c_str())); 143ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry} 144ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry 145ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyrystatic jboolean Posix_isatty(JNIEnv* env, jobject, jobject javaFd) { 146ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry int fd = jniGetFDFromFileDescriptor(env, javaFd); 147ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry return TEMP_FAILURE_RETRY(isatty(fd)) == 0; 148ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry} 149ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry 150ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyrystatic jlong Posix_lseek(JNIEnv* env, jobject, jobject javaFd, jlong offset, jint whence) { 151ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry int fd = jniGetFDFromFileDescriptor(env, javaFd); 152ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry return throwIfMinusOne(env, "lseek", TEMP_FAILURE_RETRY(lseek64(fd, offset, whence))); 153ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry} 154ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry 155ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyrystatic jobject Posix_lstat(JNIEnv* env, jobject, jstring javaPath) { 156ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry return doStat(env, javaPath, true); 157ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry} 1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void Posix_mlock(JNIEnv* env, jobject, jlong address, jlong byteCount) { 1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void* ptr = reinterpret_cast<void*>(static_cast<uintptr_t>(address)); 1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throwIfMinusOne(env, "mlock", TEMP_FAILURE_RETRY(mlock(ptr, byteCount))); 1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic jlong Posix_mmap(JNIEnv* env, jobject, jlong address, jlong byteCount, jint prot, jint flags, jobject javaFd, jlong offset) { 1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int fd = jniGetFDFromFileDescriptor(env, javaFd); 1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void* suggestedPtr = reinterpret_cast<void*>(static_cast<uintptr_t>(address)); 1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void* ptr = mmap(suggestedPtr, byteCount, prot, flags, fd, offset); 1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (ptr == MAP_FAILED) { 1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throwErrnoException(env, "mmap"); 1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return static_cast<jlong>(reinterpret_cast<uintptr_t>(ptr)); 1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void Posix_msync(JNIEnv* env, jobject, jlong address, jlong byteCount, jint flags) { 1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void* ptr = reinterpret_cast<void*>(static_cast<uintptr_t>(address)); 1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throwIfMinusOne(env, "msync", TEMP_FAILURE_RETRY(msync(ptr, byteCount, flags))); 1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void Posix_munlock(JNIEnv* env, jobject, jlong address, jlong byteCount) { 1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void* ptr = reinterpret_cast<void*>(static_cast<uintptr_t>(address)); 1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throwIfMinusOne(env, "munlock", TEMP_FAILURE_RETRY(munlock(ptr, byteCount))); 1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void Posix_munmap(JNIEnv* env, jobject, jlong address, jlong byteCount) { 1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void* ptr = reinterpret_cast<void*>(static_cast<uintptr_t>(address)); 1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throwIfMinusOne(env, "munmap", TEMP_FAILURE_RETRY(munmap(ptr, byteCount))); 1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic jobject Posix_stat(JNIEnv* env, jobject, jstring javaPath) { 1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return doStat(env, javaPath, false); 1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic jstring Posix_strerror(JNIEnv* env, jobject, jint errnum) { 1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry char buffer[BUFSIZ]; 195cb24d85a6dae33dd3a658b831cd5f0c34918126aPyry Haulos const char* message = jniStrError(errnum, buffer, sizeof(buffer)); 1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return env->NewStringUTF(message); 1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic jlong Posix_sysconf(JNIEnv* env, jobject, jint name) { 2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Since -1 is a valid result from sysconf(3), detecting failure is a little more awkward. 2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry errno = 0; 2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry long result = sysconf(name); 2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (result == -1L && errno == EINVAL) { 2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throwErrnoException(env, "sysconf"); 2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return result; 2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic JNINativeMethod gMethods[] = { 2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, access, "(Ljava/lang/String;I)Z"), 2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, environ, "()[Ljava/lang/String;"), 2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, fdatasync, "(Ljava/io/FileDescriptor;)V"), 2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, fstat, "(Ljava/io/FileDescriptor;)Llibcore/io/StructStat;"), 2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, fsync, "(Ljava/io/FileDescriptor;)V"), 2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, ftruncate, "(Ljava/io/FileDescriptor;J)V"), 2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, getenv, "(Ljava/lang/String;)Ljava/lang/String;"), 2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, isatty, "(Ljava/io/FileDescriptor;)Z"), 2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, lseek, "(Ljava/io/FileDescriptor;JI)J"), 2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, lstat, "(Ljava/lang/String;)Llibcore/io/StructStat;"), 2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, mlock, "(JJ)V"), 2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, mmap, "(JJIILjava/io/FileDescriptor;J)J"), 2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, msync, "(JJI)V"), 2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, munlock, "(JJ)V"), 2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, munmap, "(JJ)V"), 2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, stat, "(Ljava/lang/String;)Llibcore/io/StructStat;"), 2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, strerror, "(I)Ljava/lang/String;"), 2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NATIVE_METHOD(Posix, sysconf, "(I)J"), 2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyryint register_libcore_io_Posix(JNIEnv* env) { 2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return jniRegisterNativeMethods(env, "libcore/io/Posix", gMethods, NELEM(gMethods)); 2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry