[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