[multiple changes]
authorMichael Koch <mkoch@gcc.gnu.org>
Sat, 17 Jul 2004 13:46:02 +0000 (13:46 +0000)
committerMichael Koch <mkoch@gcc.gnu.org>
Sat, 17 Jul 2004 13:46:02 +0000 (13:46 +0000)
2004-07-17  Mark Wielaard  <mark@klomp.org>

* gnu/java/nio/channels/FileChannelImpl.java (truncate): Only truncate
when size is smaller.
* java/io/RandomAccessFile.java (setLength): Use truncate for
shrinking the file and seek plus write for expanding the file.

2004-07-17  Michael Koch  <konqueror@gmx.de>

* gnu/java/nio/channels/natFileChannelPosix.cc
(implTruncate): Always save current position. Only reposition file
pointer to where we started if not beyond new lenght. Reposition file
pointer to file length if it points beyond the end of file.

From-SVN: r84868

libjava/ChangeLog
libjava/gnu/java/nio/channels/FileChannelImpl.java
libjava/gnu/java/nio/channels/natFileChannelPosix.cc
libjava/java/io/RandomAccessFile.java

index 375f109b6fc23be047fc6c84d29811707e8b8842..b3e347fde2ec2248f92161734fe042678316b3a3 100644 (file)
@@ -1,3 +1,17 @@
+2004-07-17  Mark Wielaard  <mark@klomp.org>
+
+       * gnu/java/nio/channels/FileChannelImpl.java (truncate): Only truncate
+       when size is smaller.
+       * java/io/RandomAccessFile.java (setLength): Use truncate for
+       shrinking the file and seek plus write for expanding the file.
+
+2004-07-17  Michael Koch  <konqueror@gmx.de>
+
+       * gnu/java/nio/channels/natFileChannelPosix.cc
+       (implTruncate): Always save current position. Only reposition file
+       pointer to where we started if not beyond new lenght. Reposition file
+       pointer to file length if it points beyond the end of file.
+
 2004-07-17  Mark Wielaard  <mark@klomp.org>
 
        * javax/swing/Box.java: Put FIXME comment above class declaration.
index 8b3d0fc86b32145b1b06468d116f6894cdffe473..678e10f23495808c9ca5d425e6cf736e648aaf93 100644 (file)
@@ -422,7 +422,9 @@ public final class FileChannelImpl extends FileChannel
     if ((mode & WRITE) == 0)
        throw new NonWritableChannelException ();
 
-    implTruncate (size);
+    if (size < size ())
+      implTruncate (size);
+
     return this;
   }
 }
index b8f993788349d30a4a07c52d3e4cb2ea6d8e5dbe..a2c1c7962b0590f9449d8c1a34bc79387e090c96 100644 (file)
@@ -274,7 +274,10 @@ FileChannelImpl::implTruncate (jlong size)
     }
   else
     {
-      if (::ftruncate (fd, (off_t) pos))
+      if (::ftruncate (fd, (off_t) size))
+       throw new IOException (JvNewStringLatin1 (strerror (errno)));
+      if (pos > size
+         && ::lseek (fd, (off_t) size, SEEK_SET) == -1)
        throw new IOException (JvNewStringLatin1 (strerror (errno)));
       pos = size;
     }
index c20549c12df626747daee8787627d80f3c8bf6c8..7907d46f2fd95d031c0545cb660ba8821bcf15fe 100644 (file)
@@ -194,12 +194,14 @@ public class RandomAccessFile implements DataOutput, DataInput
   }
 
   /**
-   * This method sets the length of the file to the specified length.  If
-   * the currently length of the file is longer than the specified length,
-   * then the file is truncated to the specified length.  If the current
-   * length of the file is shorter than the specified length, the file
-   * is extended with bytes of an undefined value.
-   *  <p>
+   * This method sets the length of the file to the specified length.
+   * If the currently length of the file is longer than the specified
+   * length, then the file is truncated to the specified length (the
+   * file position is set to the end of file in this case).  If the
+   * current length of the file is shorter than the specified length,
+   * the file is extended with bytes of an undefined value (the file
+   * position is unchanged in this case).
+   * <p>
    * The file must be open for write access for this operation to succeed.
    *
    * @param newlen The new length of the file
@@ -208,7 +210,19 @@ public class RandomAccessFile implements DataOutput, DataInput
    */
   public void setLength (long newLen) throws IOException
   {
-    ch.truncate (newLen);
+    // FIXME: Extending a file should probably be done by one method call.
+
+    // FileChannel.truncate() can only shrink a file.
+    // To expand it we need to seek forward and write at least one byte.
+    if (newLen < length())
+      ch.truncate (newLen);
+    else if (newLen > length())
+      {
+       long pos = getFilePointer();
+       seek(newLen - 1);
+       write(0);
+       seek(pos);
+      }
   }
 
   /**