Hi,
This patch helps fix bug #31927.
Although it does not directly fix #31927, FreeBSD users may
change the line
#if defined (FIONREAD)
to
#if defined (FIONREAD) && 0
as a workaround of this bug.
ChangeLog:
2007-05-21 Ito Kazumitsu <[EMAIL PROTECTED]>
* native/jni/java-nio/gnu_java_nio_VMChannel.c
(Java_gnu_java_nio_VMChannel_available): Use fstat or select as an
alternative to ioctl.
* native/jni/native-lib/cpio.c(cpio_availableBytes): Corrected typo.
Index: classpath/native/jni/java-nio/gnu_java_nio_VMChannel.c
===================================================================
RCS file:
/cvsroot/classpath/classpath/native/jni/java-nio/gnu_java_nio_VMChannel.c,v
retrieving revision 1.17
diff -u -r1.17 gnu_java_nio_VMChannel.c
--- classpath/native/jni/java-nio/gnu_java_nio_VMChannel.c 17 Apr 2007
21:46:27 -0000 1.17
+++ classpath/native/jni/java-nio/gnu_java_nio_VMChannel.c 21 May 2007
22:48:34 -0000
@@ -1582,6 +1582,8 @@
jclass c __attribute__((unused)),
jint fd)
{
+#if defined (FIONREAD)
+
jint avail = 0;
/* NIODBG("fd: %d", fd); */
@@ -1590,6 +1592,53 @@
/* NIODBG("avail: %d", avail); */
return avail;
+
+#elif defined(HAVE_FSTAT)
+
+ jint avail = 0;
+
+ struct stat statBuffer;
+ off_t n;
+
+ if ((fstat (fd, &statBuffer) == 0) && S_ISREG (statBuffer.st_mode))
+ {
+ n = lseek (fd, 0, SEEK_CUR);
+ if (n != -1)
+ {
+ avail = statBuffer.st_size - n;
+ return avail;
+ }
+ }
+ JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
+
+#elif defined(HAVE_SELECT)
+
+ jint avail = 0;
+ fd_set filedescriptset;
+ struct timeval tv;
+
+ FD_ZERO (&filedescriptset);
+ FD_SET (fd,&filedescriptset);
+ memset (&tv, 0, sizeof(tv));
+
+ switch (select (fd+1, &filedescriptset, NULL, NULL, &tv))
+ {
+ case -1:
+ break;
+ case 0:
+ avail = 0;
+ return avail;
+ default:
+ avail = 1;
+ return avail;
+ }
+ JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
+
+#else
+
+ JCL_ThrowException (env, IO_EXCEPTION, "No native method for available");
+
+#endif
}
Index: classpath/native/jni/native-lib/cpio.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/native-lib/cpio.c,v
retrieving revision 1.7
diff -u -r1.7 cpio.c
--- classpath/native/jni/native-lib/cpio.c 9 Feb 2007 19:51:07 -0000
1.7
+++ classpath/native/jni/native-lib/cpio.c 21 May 2007 22:48:34 -0000
@@ -158,14 +158,14 @@
off_t n;
int result;
- *bytes_available = 0
+ *bytes_available = 0;
if ((fstat (fd, &statBuffer) == 0) && S_ISREG (statBuffer.st_mode))
{
n = lseek (fd, 0, SEEK_CUR);
if (n != -1)
{
*bytes_available = statBuffer.st_size - n;
- result = 0;
+ result = CPNATIVE_OK;
}
else
{
@@ -189,7 +189,7 @@
FD_SET (fd,&filedescriptset);
memset (&tv, 0, sizeof(tv));
- switch (select (fd+1, &filedescriptset, NULL, NULL, &timeval)) \
+ switch (select (fd+1, &filedescriptset, NULL, NULL, &tv))
{
case -1:
result=errno;