19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright 2007, The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if INCLUDE_SYS_MOUNT_FOR_STATFS 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/mount.h> 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/statfs.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <errno.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_runtime/AndroidRuntime.h" 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct fields_t { 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID context; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic fields_t fields; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_os_StatFs_getBlockSize(JNIEnv *env, jobject thiz) 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct statfs *stat = (struct statfs *)env->GetIntField(thiz, fields.context); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return stat->f_bsize; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_os_StatFs_getBlockCount(JNIEnv *env, jobject thiz) 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct statfs *stat = (struct statfs *)env->GetIntField(thiz, fields.context); 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return stat->f_blocks; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_os_StatFs_getFreeBlocks(JNIEnv *env, jobject thiz) 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct statfs *stat = (struct statfs *)env->GetIntField(thiz, fields.context); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return stat->f_bfree; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_os_StatFs_getAvailableBlocks(JNIEnv *env, jobject thiz) 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct statfs *stat = (struct statfs *)env->GetIntField(thiz, fields.context); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return stat->f_bavail; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_os_StatFs_native_restat(JNIEnv *env, jobject thiz, jstring path) 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (path == NULL) { 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // get the object handle 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct statfs *stat = (struct statfs *)env->GetIntField(thiz, fields.context); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (stat == NULL) { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/NoSuchFieldException", NULL); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* pathstr = env->GetStringUTFChars(path, NULL); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pathstr == NULL) { 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Out of memory"); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // note that stat will contain the new file data corresponding to 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pathstr 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (statfs(pathstr, stat) != 0) { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("statfs %s failed, errno: %d", pathstr, errno); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete stat; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(thiz, fields.context, 0); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Release pathstr 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(path, pathstr); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_os_StatFs_native_setup(JNIEnv *env, jobject thiz, jstring path) 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (path == NULL) { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct statfs* stat = new struct statfs; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (stat == NULL) { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Out of memory"); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(thiz, fields.context, (int)stat); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_os_StatFs_native_restat(env, thiz, path); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_os_StatFs_native_finalize(JNIEnv *env, jobject thiz) 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct statfs *stat = (struct statfs *)env->GetIntField(thiz, fields.context); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (stat != NULL) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete stat; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(thiz, fields.context, 0); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getBlockSize", "()I", (void *)android_os_StatFs_getBlockSize}, 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getBlockCount", "()I", (void *)android_os_StatFs_getBlockCount}, 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getFreeBlocks", "()I", (void *)android_os_StatFs_getFreeBlocks}, 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getAvailableBlocks", "()I", (void *)android_os_StatFs_getAvailableBlocks}, 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_setup", "(Ljava/lang/String;)V", (void *)android_os_StatFs_native_setup}, 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_finalize", "()V", (void *)android_os_StatFs_native_finalize}, 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_restat", "(Ljava/lang/String;)V", (void *)android_os_StatFs_native_restat}, 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_os_StatFs(JNIEnv *env) 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("android/os/StatFs"); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clazz == NULL) { 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Can't find android/os/StatFs"); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fields.context = env->GetFieldID(clazz, "mNativeContext", "I"); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fields.context == NULL) { 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Can't find StatFs.mNativeContext"); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android/os/StatFs", gMethods, NELEM(gMethods)); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} // namespace android 164