From 66c8aed2528f2f1c3df140f491c53b4834ca8123 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 31 May 2001 17:33:05 +0000 Subject: [PATCH] natFileDescriptorPosix.cc (open): Allocate buffer to correct size. * java/io/natFileDescriptorPosix.cc (open): Allocate buffer to correct size. (write): Loop until write completes. From Corey Minyard. From-SVN: r42749 --- libjava/ChangeLog | 6 +++ libjava/java/io/natFileDescriptorPosix.cc | 52 ++++++++++++++--------- 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 + + * java/io/natFileDescriptorPosix.cc (open): Allocate buffer to + correct size. + (write): Loop until write completes. From Corey Minyard. + 2001-05-29 Laurent Guerby * 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