diff options
author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-05-31 17:33:05 +0000 |
---|---|---|
committer | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-05-31 17:33:05 +0000 |
commit | 544580baba540d9968b89c9e9d0713a88384616a (patch) | |
tree | 8b33aeed60e98f119fb0f177c7ed775d58c7194e /libjava | |
parent | 33943ff1f75ead78dbcf83c9b7c36a0c8548ae29 (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/ChangeLog | 6 | ||||
-rw-r--r-- | 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 <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 |