From f864eb9ac034a50c8e4418caa2bea7ea4bf602fe Mon Sep 17 00:00:00 2001 From: mark Date: Sat, 4 Jan 2003 03:53:00 +0000 Subject: [PATCH] * java/io/FileDescriptor.java (position): New private field. * java/io/natFileDescriptorPosix.cc (write): Up position. (setLength): Use and set position. (seek): Set position. (getFilePointer): Return position. (read): Up position. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@60869 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/ChangeLog | 9 ++++++ libjava/java/io/FileDescriptor.java | 4 ++- libjava/java/io/natFileDescriptorPosix.cc | 50 ++++++++++++++++++------------- 3 files changed, 42 insertions(+), 21 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index b38a3a5..221fa21 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,5 +1,14 @@ 2003-01-03 Mark Wielaard + * java/io/FileDescriptor.java (position): New private field. + * java/io/natFileDescriptorPosix.cc (write): Up position. + (setLength): Use and set position. + (seek): Set position. + (getFilePointer): Return position. + (read): Up position. + +2003-01-03 Mark Wielaard + Merge with Classpath: * java/io/ObjectStreamClass.java (lookup): Split method and call lookupForClassObject(). diff --git a/libjava/java/io/FileDescriptor.java b/libjava/java/io/FileDescriptor.java index 08f8edf..f105c6f 100644 --- a/libjava/java/io/FileDescriptor.java +++ b/libjava/java/io/FileDescriptor.java @@ -1,6 +1,6 @@ // FileDescriptor.java - Open file or device -/* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation +/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation This file is part of libgcj. @@ -101,4 +101,6 @@ public final class FileDescriptor // we want to make sure this has the value -1. This is the most // efficient way to accomplish that. private int fd = -1; + + private long position = 0; } diff --git a/libjava/java/io/natFileDescriptorPosix.cc b/libjava/java/io/natFileDescriptorPosix.cc index 80e6bad..e8ec9a7 100644 --- a/libjava/java/io/natFileDescriptorPosix.cc +++ b/libjava/java/io/natFileDescriptorPosix.cc @@ -1,6 +1,6 @@ // natFileDescriptor.cc - Native part of FileDescriptor class. -/* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation +/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation This file is part of libgcj. @@ -147,6 +147,7 @@ java::io::FileDescriptor::write (jint b) throw new IOException (JvNewStringLatin1 (strerror (errno))); } } + position++; } void @@ -177,6 +178,7 @@ java::io::FileDescriptor::write (jbyteArray b, jint offset, jint len) written += r; len -= r; bytes += r; + position += r; } } @@ -193,7 +195,6 @@ void java::io::FileDescriptor::setLength (jlong pos) { struct stat sb; - off_t orig; #ifdef HAVE_FTRUNCATE if (::fstat (fd, &sb)) @@ -202,10 +203,6 @@ java::io::FileDescriptor::setLength (jlong pos) if ((jlong) sb.st_size == pos) return; - orig = ::lseek (fd, (off_t) 0, SEEK_CUR); - if (orig == -1) - throw new IOException (JvNewStringLatin1 (strerror (errno))); - // If the file is too short, we extend it. We can't rely on // ftruncate() extending the file. So we lseek() to 1 byte less // than we want, and then we write a single byte at the end. @@ -215,11 +212,15 @@ java::io::FileDescriptor::setLength (jlong pos) throw new IOException (JvNewStringLatin1 (strerror (errno))); char out = '\0'; int r = ::write (fd, &out, 1); - if (r <= 0 || ::lseek (fd, orig, SEEK_SET) == -1) + if (r <= 0 || ::lseek (fd, position, SEEK_SET) == -1) throw new IOException (JvNewStringLatin1 (strerror (errno))); } - else if (::ftruncate (fd, (off_t) pos)) - throw new IOException (JvNewStringLatin1 (strerror (errno))); + else + { + if (::ftruncate (fd, (off_t) pos)) + throw new IOException (JvNewStringLatin1 (strerror (errno))); + position = pos; + } #else /* HAVE_FTRUNCATE */ throw new IOException (JvNewStringLatin1 ("FileDescriptor.setLength not implemented")); #endif /* HAVE_FTRUNCATE */ @@ -230,19 +231,29 @@ java::io::FileDescriptor::seek (jlong pos, jint whence, jboolean eof_trunc) { JvAssert (whence == SET || whence == CUR); - jlong len = length (); - jlong here = getFilePointer (); - - if (eof_trunc - && ((whence == SET && pos > len) || (whence == CUR && here + pos > len))) + if (eof_trunc) { - whence = SET; - pos = len; + jlong len = length (); + if (whence == SET) + { + if (pos > len) + pos = len; + } + else + { + jlong here = getFilePointer (); + if (here + pos > len) + { + pos = len; + whence = SET; + } + } } off_t r = ::lseek (fd, (off_t) pos, whence == SET ? SEEK_SET : SEEK_CUR); if (r == -1) throw new IOException (JvNewStringLatin1 (strerror (errno))); + position = r; return r; } @@ -258,10 +269,7 @@ java::io::FileDescriptor::length (void) jlong java::io::FileDescriptor::getFilePointer (void) { - off_t r = ::lseek (fd, 0, SEEK_CUR); - if (r == -1) - throw new IOException (JvNewStringLatin1 (strerror (errno))); - return r; + return position; } jint @@ -282,6 +290,7 @@ java::io::FileDescriptor::read (void) } throw new IOException (JvNewStringLatin1 (strerror (errno))); } + position++; return b & 0xFF; } @@ -313,6 +322,7 @@ java::io::FileDescriptor::read (jbyteArray buffer, jint offset, jint count) } throw new IOException (JvNewStringLatin1 (strerror (errno))); } + position += r; return r; } -- 2.7.4