[kaffe] InputStream#available() for System.in throws IOException

Ito Kazumitsu kaz at maczuka.gcd.org
Mon Aug 29 21:57:07 PDT 2005


From: Ito Kazumitsu <kaz at maczuka.gcd.org>
Subject: [kaffe] InputStream#available() for System.in throws IOException
Date: Tue, 30 Aug 2005 01:54:52 +0900 (JST)

> Case 1: Terminal input
> $ kaffe TestBufferedReader
> aaaa
> java.io.IOException: No such file or directory

> Case 2: Pipe
> $ echo aaaa | kaffe TestBufferedReader     
> java.io.IOException: No such file or directory

> Case 3: File input - OK
> $ kaffe TestBufferedReader <TestBufferedReader.java 

> Case 4: Here document - OK
> $ kaffe TestBufferedReader <<EOF
> > aaaa
> > EOF

The message text of the IOException is meaningless.
This IOException comes from the macro TARGET_NATIVE_FILE_AVAILABLE
defined in libraries/clib/target/Linux/target_native_file.h.

If the standard input is piped to another process or it is a
character device, KFSTAT(filedescriptor,&__statBuffer) returns 0
but S_ISREG(__statBuffer.st_mode) is false because it is not a
regular file.

The solution may be either

  (a) if S_ISREG(__statBuffer.st_mode) is false, try other
      methods as libraries/clib/nio/FileChannelImpl.c did before.

or

  (b) if S_ISREG(__statBuffer.st_mode) is false, give up trying
      to figure out available length and just return 0.

I think (b) is simple and reasonable enough. Running the following
program on Sun's JDK,

public class TestAvailable {
    public static void main(String[] args) throws Exception {
        System.out.println(System.in.available());
    }
}

I find Sun's System.in.available() often returns 0 if the standerd
input is a terminal or is piped to another process.

So here is my proposed patch.

--- libraries/clib/target/Linux/target_native_file.h.orig	Fri Aug  5 10:20:19 2005
+++ libraries/clib/target/Linux/target_native_file.h	Tue Aug 30 13:31:24 2005
@@ -138,18 +138,26 @@
         \
         length=0; \
         \
-        if ((KFSTAT(filedescriptor,&__statBuffer)==0) && S_ISREG(__statBuffer.st_mode)) \
+        if (KFSTAT(filedescriptor,&__statBuffer)==0) \
         { \
-	  int klseek_result; \
-          klseek_result=(KLSEEK(filedescriptor,0,SEEK_CUR, &__n));	\
-          if (klseek_result == 0) \
+          if (S_ISREG(__statBuffer.st_mode)) \
           { \
-            length=TARGET_NATIVE_MATH_INT_INT32_TO_INT64(__statBuffer.st_size-__n); \
-            result=TARGET_NATIVE_OK; \
+            int klseek_result; \
+            klseek_result=(KLSEEK(filedescriptor,0,SEEK_CUR, &__n));	\
+            if (klseek_result == 0) \
+            { \
+              length=TARGET_NATIVE_MATH_INT_INT32_TO_INT64(__statBuffer.st_size-__n); \
+              result=TARGET_NATIVE_OK; \
+            } \
+            else \
+            { \
+              result=TARGET_NATIVE_ERROR; \
+            } \
           } \
           else \
           { \
-            result=TARGET_NATIVE_ERROR; \
+              length=TARGET_NATIVE_MATH_INT_INT32_TO_INT64(0); \
+              result=TARGET_NATIVE_OK; \
           } \
         } \
         else \



More information about the kaffe mailing list