From: Ito Kazumitsu <[EMAIL PROTECTED]> 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 \ _______________________________________________ kaffe mailing list kaffe@kaffe.org http://kaffe.org/cgi-bin/mailman/listinfo/kaffe