aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2001-05-31 17:33:05 +0000
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2001-05-31 17:33:05 +0000
commit544580baba540d9968b89c9e9d0713a88384616a (patch)
tree8b33aeed60e98f119fb0f177c7ed775d58c7194e /libjava
parent33943ff1f75ead78dbcf83c9b7c36a0c8548ae29 (diff)
* java/io/natFileDescriptorPosix.cc (open): Allocate buffer to
correct size. (write): Loop until write completes. From Corey Minyard. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@42749 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog6
-rw-r--r--libjava/java/io/natFileDescriptorPosix.cc52
2 files changed, 37 insertions, 21 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 4009be6bcf5..33399886542 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,9 @@
+2001-05-31 Tom Tromey <tromey@redhat.com>
+
+ * java/io/natFileDescriptorPosix.cc (open): Allocate buffer to
+ correct size.
+ (write): Loop until write completes. From Corey Minyard.
+
2001-05-29 Laurent Guerby <guerby@acm.org>
* java/awt/geom/Rectangle2D.java: fix doc typo.
diff --git a/libjava/java/io/natFileDescriptorPosix.cc b/libjava/java/io/natFileDescriptorPosix.cc
index 8e4be858a08..cb7a164d934 100644
--- a/libjava/java/io/natFileDescriptorPosix.cc
+++ b/libjava/java/io/natFileDescriptorPosix.cc
@@ -68,10 +68,8 @@ java::io::FileDescriptor::sync (void)
jint
java::io::FileDescriptor::open (jstring path, jint jflags)
{
- // FIXME: eww.
- char buf[MAXPATHLEN];
+ char *buf = (char *) _Jv_AllocBytes (_Jv_GetStringUTFLength (path) + 1);
jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
- // FIXME?
buf[total] = '\0';
int flags = 0;
#ifdef O_BINARY
@@ -121,17 +119,20 @@ void
java::io::FileDescriptor::write (jint b)
{
jbyte d = (jbyte) b;
- int r = ::write (fd, &d, 1);
- if (java::lang::Thread::interrupted())
+ int r = 0;
+ while (r != 1)
{
- InterruptedIOException *iioe
- = new InterruptedIOException (JvNewStringLatin1 ("write interrupted"));
- iioe->bytesTransferred = r == -1 ? 0 : r;
- throw iioe;
+ r = ::write (fd, &d, 1);
+ if (java::lang::Thread::interrupted())
+ {
+ InterruptedIOException *iioe
+ = new InterruptedIOException (JvNewStringLatin1 ("write interrupted"));
+ iioe->bytesTransferred = r == -1 ? 0 : r;
+ throw iioe;
+ }
+ else if (r == -1)
+ throw new IOException (JvNewStringLatin1 (strerror (errno)));
}
- else if (r == -1)
- throw new IOException (JvNewStringLatin1 (strerror (errno)));
- // FIXME: loop if r != 1.
}
void
@@ -142,17 +143,26 @@ java::io::FileDescriptor::write (jbyteArray b, jint offset, jint len)
if (offset < 0 || len < 0 || offset + len > JvGetArrayLength (b))
throw new java::lang::ArrayIndexOutOfBoundsException;
jbyte *bytes = elements (b) + offset;
- int r = ::write (fd, bytes, len);
- if (java::lang::Thread::interrupted())
+
+ int written = 0;
+ while (len > 0)
{
- InterruptedIOException *iioe
- = new InterruptedIOException (JvNewStringLatin1 ("write interrupted"));
- iioe->bytesTransferred = r == -1 ? 0 : r;
- throw iioe;
+ int r = ::write (fd, bytes, len);
+ if (r != -1)
+ written += r;
+ if (java::lang::Thread::interrupted())
+ {
+ InterruptedIOException *iioe
+ = new InterruptedIOException (JvNewStringLatin1 ("write interrupted"));
+ iioe->bytesTransferred = written;
+ throw iioe;
+ }
+ else if (r == -1)
+ throw new IOException (JvNewStringLatin1 (strerror (errno)));
+
+ len -= r;
+ bytes += r;
}
- else if (r == -1)
- throw new IOException (JvNewStringLatin1 (strerror (errno)));
- // FIXME: loop if r != len.
}
void