natFileDescriptorWin32.cc (setLength): New method.
2002-07-24 Tom Tromey <tromey@redhat.com> Tony Kimball <alk@pobox.com> * java/io/natFileDescriptorWin32.cc (setLength): New method. * java/io/natFileDescriptorPosix.cc (setLength): New method. * java/io/RandomAccessFile.java (setLength): New method. * java/io/natFileDescriptorEcos.cc (setLength): New method. * java/io/FileDescriptor.java (setLength): New method. Co-Authored-By: Tony Kimball <alk@pobox.com> From-SVN: r55715
This commit is contained in:
parent
8a3ad73714
commit
ce05139c56
6 changed files with 109 additions and 3 deletions
|
@ -17,6 +17,8 @@ details. */
|
|||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/socket.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#ifdef HAVE_SYS_IOCTL_H
|
||||
#define BSD_COMP /* Get FIONREAD on Solaris2. */
|
||||
|
@ -189,6 +191,38 @@ java::io::FileDescriptor::close (void)
|
|||
throw new IOException (JvNewStringLatin1 (strerror (errno)));
|
||||
}
|
||||
|
||||
void
|
||||
java::io::FileDescriptor::setLength (jlong pos)
|
||||
{
|
||||
struct stat sb;
|
||||
off_t orig;
|
||||
|
||||
if (::fstat (fd, &sb))
|
||||
throw new IOException (JvNewStringLatin1 (strerror (errno)));
|
||||
|
||||
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.
|
||||
if ((jlong) sb.st_size < pos)
|
||||
{
|
||||
if (::lseek (fd, (off_t) (pos - 1), SEEK_SET) == -1)
|
||||
throw new IOException (JvNewStringLatin1 (strerror (errno)));
|
||||
char out = '\0';
|
||||
int r = ::write (fd, &out, 1);
|
||||
if (r <= 0 || ::lseek (fd, orig, SEEK_SET) == -1)
|
||||
throw new IOException (JvNewStringLatin1 (strerror (errno)));
|
||||
}
|
||||
else if (::ftruncate (fd, (off_t) pos))
|
||||
throw new IOException (JvNewStringLatin1 (strerror (errno)));
|
||||
}
|
||||
|
||||
jint
|
||||
java::io::FileDescriptor::seek (jlong pos, jint whence, jboolean eof_trunc)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue