OSDN Git Service

http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=205157
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Apr 2007 01:05:50 +0000 (01:05 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Apr 2007 01:05:50 +0000 (01:05 +0000)
* gnu/java/nio/channels/natFileChannelPosix.cc (mapImpl): Extend
file, when writing, if it is too short.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123447 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/gnu/java/nio/channels/natFileChannelPosix.cc

index ca93983..9602e29 100644 (file)
@@ -1,5 +1,11 @@
 2007-04-02  Tom Tromey  <tromey@redhat.com>
 
+       http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=205157
+       * gnu/java/nio/channels/natFileChannelPosix.cc (mapImpl): Extend
+       file, when writing, if it is too short.
+
+2007-04-02  Tom Tromey  <tromey@redhat.com>
+
        https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=233406
        * gnu/java/net/natPlainSocketImplPosix.cc (create): Return if
        already created.
index 52caf82..e05904c 100644 (file)
@@ -1,7 +1,7 @@
 
 // natFileChannelImplPosix.cc - Native part of FileChannelImpl class.
 
-/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006  Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2007  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -499,6 +499,18 @@ FileChannelImpl::mapImpl (jchar mmode, jlong position, jint size)
     {
       prot = PROT_READ|PROT_WRITE;
       flags = mmode == '+' ? MAP_SHARED : MAP_PRIVATE;
+
+      // If the file is too short, we must extend it.  While using
+      // ftruncate() to extend a file is not portable in general, it
+      // should work on all systems where you can mmap() a file.
+      struct stat st;
+      if (fstat (fd, &st) == -1)
+       throw new IOException (JvNewStringLatin1 (strerror (errno)));
+      if (position + size > st.st_size)
+       {
+         if (ftruncate (fd, position + size) == -1)
+           throw new IOException (JvNewStringLatin1 (strerror (errno)));
+       }
     }
   jint page_size = ::getpagesize();
   jint offset = position & ~(page_size-1);