* fhandler.h (fhandler_base::ftruncate): Define new virtual method.
(fhandler_disk_file::ftruncate): Ditto. * fhandler.cc (fhandler_base::ftruncate): New method. * fhandler_disk_file.cc (fhandler_disk_file::ftruncate): Ditto. * syscalls.cc (ftruncate64): Move functionality into fhandlers. Call fhandler method from here.
This commit is contained in:
@@ -1737,37 +1737,12 @@ setmode (int fd, int mode)
|
||||
extern "C" int
|
||||
ftruncate64 (int fd, _off64_t length)
|
||||
{
|
||||
int res = -1, res_bug = 0;
|
||||
|
||||
if (length < 0)
|
||||
set_errno (EINVAL);
|
||||
int res = -1;
|
||||
cygheap_fdget cfd (fd);
|
||||
if (cfd >= 0)
|
||||
res = cfd->ftruncate (length);
|
||||
else
|
||||
{
|
||||
cygheap_fdget cfd (fd);
|
||||
if (cfd >= 0)
|
||||
{
|
||||
HANDLE h = cygheap->fdtab[fd]->get_handle ();
|
||||
|
||||
if (cfd->get_handle ())
|
||||
{
|
||||
/* remember curr file pointer location */
|
||||
_off64_t prev_loc = cfd->lseek (0, SEEK_CUR);
|
||||
|
||||
cfd->lseek (length, SEEK_SET);
|
||||
/* Fill the space with 0, if needed */
|
||||
if (wincap.has_lseek_bug ())
|
||||
res_bug = cfd->write (&res, 0);
|
||||
if (!SetEndOfFile (h))
|
||||
__seterrno ();
|
||||
else
|
||||
res = res_bug;
|
||||
|
||||
/* restore original file pointer location */
|
||||
cfd->lseek (prev_loc, SEEK_SET);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
set_errno (EBADF);
|
||||
syscall_printf ("%d = ftruncate (%d, %D)", res, fd, length);
|
||||
return res;
|
||||
}
|
||||
|
Reference in New Issue
Block a user