Commit 8854e14c by Tom Tromey Committed by Tom Tromey

natFileChannelPosix.cc (mapImpl): Extend file, when writing, if it is too short.

	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.

From-SVN: r123447
parent cb7ad97b
2007-04-02 Tom Tromey <tromey@redhat.com> 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 https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=233406
* gnu/java/net/natPlainSocketImplPosix.cc (create): Return if * gnu/java/net/natPlainSocketImplPosix.cc (create): Return if
already created. already created.
......
// natFileChannelImplPosix.cc - Native part of FileChannelImpl class. // 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. This file is part of libgcj.
...@@ -499,6 +499,18 @@ FileChannelImpl::mapImpl (jchar mmode, jlong position, jint size) ...@@ -499,6 +499,18 @@ FileChannelImpl::mapImpl (jchar mmode, jlong position, jint size)
{ {
prot = PROT_READ|PROT_WRITE; prot = PROT_READ|PROT_WRITE;
flags = mmode == '+' ? MAP_SHARED : MAP_PRIVATE; 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 page_size = ::getpagesize();
jint offset = position & ~(page_size-1); jint offset = position & ~(page_size-1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment