summaryrefslogtreecommitdiffstats
path: root/luni/src/main/native/java_io_File.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'luni/src/main/native/java_io_File.cpp')
-rw-r--r--luni/src/main/native/java_io_File.cpp61
1 files changed, 15 insertions, 46 deletions
diff --git a/luni/src/main/native/java_io_File.cpp b/luni/src/main/native/java_io_File.cpp
index f85daf8..905eae2 100644
--- a/luni/src/main/native/java_io_File.cpp
+++ b/luni/src/main/native/java_io_File.cpp
@@ -18,6 +18,7 @@
#include "AndroidSystemNatives.h"
#include "JNIHelp.h"
#include "LocalArray.h"
+#include "ScopedByteArray.h"
#include "ScopedFd.h"
#include <string.h>
@@ -36,40 +37,8 @@
// poor choices of where to divide the work between Java and native
// code.
-class Path {
-public:
- // The Java byte[] already contains a trailing NUL.
- Path(JNIEnv* env, jbyteArray byteArray)
- : mEnv(env), mByteArray(byteArray), mBytes(NULL)
- {
- mBytes = env->GetByteArrayElements(mByteArray, NULL);
- }
-
- ~Path() {
- if (mBytes) {
- mEnv->ReleaseByteArrayElements(mByteArray, mBytes, JNI_ABORT);
- }
- }
-
- const jbyte* bytes() const {
- return mBytes;
- }
-
- // Element access.
- const char& operator[](size_t n) const {
- const char* array = reinterpret_cast<const char*>(mBytes);
- return array[n];
- }
-
-private:
- JNIEnv* mEnv;
- jbyteArray mByteArray;
- jbyte* mBytes;
-};
-
-
static jbyteArray java_io_File_getCanonImpl(JNIEnv* env, jobject, jbyteArray pathBytes) {
- Path path(env, pathBytes);
+ ScopedByteArray path(env, pathBytes);
// The only thing this native code currently does is truncate the byte[] at
// the first NUL.
// TODO: this is completely pointless. we should do this in Java, or do all of getCanonicalPath in native code. (realpath(2)?)
@@ -80,12 +49,12 @@ static jbyteArray java_io_File_getCanonImpl(JNIEnv* env, jobject, jbyteArray pat
}
static jboolean java_io_File_deleteImpl(JNIEnv* env, jobject, jbyteArray pathBytes) {
- Path path(env, pathBytes);
+ ScopedByteArray path(env, pathBytes);
return (remove(&path[0]) == 0);
}
static bool doStat(JNIEnv* env, jbyteArray pathBytes, struct stat& sb) {
- Path path(env, pathBytes);
+ ScopedByteArray path(env, pathBytes);
return (stat(&path[0], &sb) == 0);
}
@@ -132,22 +101,22 @@ static jboolean java_io_File_isFileImpl(JNIEnv* env, jobject, jbyteArray pathByt
}
static jboolean java_io_File_existsImpl(JNIEnv* env, jobject, jbyteArray pathBytes) {
- Path path(env, pathBytes);
+ ScopedByteArray path(env, pathBytes);
return (access(&path[0], F_OK) == 0);
}
static jboolean java_io_File_isReadableImpl(JNIEnv* env, jobject, jbyteArray pathBytes) {
- Path path(env, pathBytes);
+ ScopedByteArray path(env, pathBytes);
return (access(&path[0], R_OK) == 0);
}
static jboolean java_io_File_isWritableImpl(JNIEnv* env, jobject recv, jbyteArray pathBytes) {
- Path path(env, pathBytes);
+ ScopedByteArray path(env, pathBytes);
return (access(&path[0], W_OK) == 0);
}
static jbyteArray java_io_File_getLinkImpl(JNIEnv* env, jobject, jbyteArray pathBytes) {
- Path path(env, pathBytes);
+ ScopedByteArray path(env, pathBytes);
// We can't know how big a buffer readlink(2) will need, so we need to
// loop until it says "that fit".
@@ -174,7 +143,7 @@ static jbyteArray java_io_File_getLinkImpl(JNIEnv* env, jobject, jbyteArray path
}
static jboolean java_io_File_setLastModifiedImpl(JNIEnv* env, jobject, jbyteArray pathBytes, jlong ms) {
- Path path(env, pathBytes);
+ ScopedByteArray path(env, pathBytes);
// We want to preserve the access time.
struct stat sb;
@@ -190,7 +159,7 @@ static jboolean java_io_File_setLastModifiedImpl(JNIEnv* env, jobject, jbyteArra
}
static jboolean java_io_File_setReadOnlyImpl(JNIEnv* env, jobject recv, jbyteArray pathBytes) {
- Path path(env, pathBytes);
+ ScopedByteArray path(env, pathBytes);
struct stat sb;
if (stat(&path[0], &sb) == -1) {
@@ -238,7 +207,7 @@ struct LinkedDirEntry {
};
static jobject java_io_File_listImpl(JNIEnv* env, jclass clazz, jbyteArray pathBytes) {
- Path path(env, pathBytes);
+ ScopedByteArray path(env, pathBytes);
ScopedReaddir dir(opendir(&path[0]));
if (dir.dirp == NULL) {
@@ -302,13 +271,13 @@ static jobject java_io_File_listImpl(JNIEnv* env, jclass clazz, jbyteArray pathB
}
static jboolean java_io_File_mkdirImpl(JNIEnv* env, jobject, jbyteArray pathBytes) {
- Path path(env, pathBytes);
+ ScopedByteArray path(env, pathBytes);
// On Android, we don't want default permissions to allow global access.
return (mkdir(&path[0], S_IRWXU) == 0);
}
static jboolean java_io_File_createNewFileImpl(JNIEnv* env, jobject, jbyteArray pathBytes) {
- Path path(env, pathBytes);
+ ScopedByteArray path(env, pathBytes);
// On Android, we don't want default permissions to allow global access.
ScopedFd fd(open(&path[0], O_CREAT | O_EXCL, 0600));
if (fd.get() != -1) {
@@ -324,8 +293,8 @@ static jboolean java_io_File_createNewFileImpl(JNIEnv* env, jobject, jbyteArray
}
static jboolean java_io_File_renameToImpl(JNIEnv* env, jobject, jbyteArray oldPathBytes, jbyteArray newPathBytes) {
- Path oldPath(env, oldPathBytes);
- Path newPath(env, newPathBytes);
+ ScopedByteArray oldPath(env, oldPathBytes);
+ ScopedByteArray newPath(env, newPathBytes);
return (rename(&oldPath[0], &newPath[0]) == 0);
}