[vmkit-commits] [PATCH] OpenJDK.inc: Implement I/O wrappers (open/close/read/write/available/lseek)
Will Dietz
wdietz2 at illinois.edu
Wed Oct 26 18:58:19 PDT 2011
Inlined below.
~Will
>From 61e512153a68efe9679bc5e1dce539b0af731f2f Mon Sep 17 00:00:00 2001
From: Will Dietz <w at wdtz.org>
Date: Wed, 26 Oct 2011 20:54:44 -0500
Subject: [PATCH 3/3] OpenJDK.inc: Implement I/O wrappers:
open/close/read/write/available/lseek
---
lib/J3/ClassLib/OpenJDK/OpenJDK.inc | 75 ++++++++++++++++++++++++++++++++---
1 files changed, 69 insertions(+), 6 deletions(-)
diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
index eded2e1..8ff8035 100644
--- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
+++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
@@ -1310,7 +1310,16 @@ JVM_NativePath(char * path) {
*/
JNIEXPORT jint JNICALL
JVM_Open(const char *fname, jint flags, jint mode) {
- NYI();
+ //fprintf(stderr, "JVM_Open(fname=%s,flags=%d,mode=%d)\n",
+ // fname, flags, mode);
+ BEGIN_JNI_EXCEPTION
+ int result = open(fname, flags, mode);
+
+ result = (result == 0) ? -1 : result;
+ RETURN_FROM_JNI(result);
+ END_JNI_EXCEPTION
+
+ return -1;
}
/*
@@ -1321,7 +1330,12 @@ JVM_Open(const char *fname, jint flags, jint mode) {
*/
JNIEXPORT jint JNICALL
JVM_Close(jint fd) {
- NYI();
+ BEGIN_JNI_EXCEPTION
+ jint res = close(fd);
+ RETURN_FROM_JNI(res);
+ END_JNI_EXCEPTION
+
+ return -1;
}
/*
@@ -1337,7 +1351,11 @@ JVM_Close(jint fd) {
*/
JNIEXPORT jint JNICALL
JVM_Read(jint fd, char *buf, jint nbytes) {
- NYI();
+ BEGIN_JNI_EXCEPTION
+ jint res = read(fd, buf, nbytes);
+ RETURN_FROM_JNI(res);
+ END_JNI_EXCEPTION
+ return -1;
}
/*
@@ -1351,7 +1369,11 @@ JVM_Read(jint fd, char *buf, jint nbytes) {
*/
JNIEXPORT jint JNICALL
JVM_Write(jint fd, char *buf, jint nbytes) {
- NYI();
+ BEGIN_JNI_EXCEPTION
+ jint res = write(fd, buf, nbytes);
+ RETURN_FROM_JNI(res);
+ END_JNI_EXCEPTION
+ return -1;
}
/*
@@ -1360,7 +1382,44 @@ JVM_Write(jint fd, char *buf, jint nbytes) {
*/
JNIEXPORT jint JNICALL
JVM_Available(jint fd, jlong *pbytes) {
- NYI();
+ // From JamVM's JVM_Available implementation, GPLv2
+ BEGIN_JNI_EXCEPTION
+ struct stat sb;
+
+ if(fstat(fd, &sb) == -1)
+ RETURN_FROM_JNI(0);
+
+ switch(sb.st_mode & S_IFMT) {
+ case S_IFCHR:
+ case S_IFIFO:
+ case S_IFSOCK: {
+ int n;
+
+ if(ioctl(fd, TIOCINQ, &n) == -1)
+ RETURN_FROM_JNI(0);
+
+ *pbytes = n;
+ RETURN_FROM_JNI(1);
+ }
+
+ default: {
+ off64_t cur, end;
+
+ if((cur = lseek64(fd, 0, SEEK_CUR)) == -1)
+ RETURN_FROM_JNI(0);
+
+ if((end = lseek64(fd, 0, SEEK_END)) == -1)
+ RETURN_FROM_JNI(0);
+
+ if(lseek64(fd, cur, SEEK_SET) == -1)
+ RETURN_FROM_JNI(0);
+
+ *pbytes = end - cur;
+ RETURN_FROM_JNI(1);
+ }
+ }
+ END_JNI_EXCEPTION
+ return 0;
}
/*
@@ -1374,7 +1433,11 @@ JVM_Available(jint fd, jlong *pbytes) {
*/
JNIEXPORT jlong JNICALL
JVM_Lseek(jint fd, jlong offset, jint whence) {
- NYI();
+ BEGIN_JNI_EXCEPTION
+ jlong res = lseek64(fd, offset, whence);
+ RETURN_FROM_JNI(res);
+ END_JNI_EXCEPTION
+ return 0;
}
/*
--
1.7.5.1
More information about the vmkit-commits
mailing list