From d505cf0581ccbde3b94cf444fff5128eae454a03 Mon Sep 17 00:00:00 2001 From: Marcus Comstedt <marcus@mc.pp.se> Date: Wed, 2 Jun 1999 23:22:52 +0200 Subject: [PATCH] Implemented truncate-functions for NT. Rev: src/fdlib.c:1.26 Rev: src/modules/files/efuns.c:1.71 --- src/fdlib.c | 25 ++++++++++++++++++------- src/modules/files/efuns.c | 23 +++++++++++++++++++++-- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/fdlib.c b/src/fdlib.c index e587fedc9d..e3d9cbcb57 100644 --- a/src/fdlib.c +++ b/src/fdlib.c @@ -3,7 +3,7 @@ #include "error.h" #include <math.h> -RCSID("$Id: fdlib.c,v 1.25 1999/05/19 14:24:19 mirar Exp $"); +RCSID("$Id: fdlib.c,v 1.26 1999/06/02 21:22:52 marcus Exp $"); #ifdef HAVE_WINSOCK_H @@ -520,6 +520,7 @@ long debug_fd_lseek(FD fd, long pos, int where) long debug_fd_ftruncate(FD fd, long len) { long ret; + LONG oldfp_lo, oldfp_hi; mt_lock(&fd_mutex); if(fd_type[fd]!=FD_FILE) { @@ -530,15 +531,25 @@ long debug_fd_ftruncate(FD fd, long len) ret=da_handle[fd]; mt_unlock(&fd_mutex); - would you mind filling this one out? /Mirar - - ret=i dont know((HANDLE)ret, len); - if(ret == 0xffffffff) - { + oldfp_hi = 0; + oldfp_lo = SetFilePointer((HANDLE)ret, 0, &oldfp_hi, FILE_CURRENT); + if(oldfp_lo == 0xffffffff) { + errno=GetLastError(); + if(errno != NO_ERROR) + return -1; + } + if(SetFilePointer((HANDLE)ret, len, NULL, FILE_BEGIN) == 0xffffffff || + !SetEndOfFile((HANDLE)ret)) { errno=GetLastError(); + SetFilePointer((HANDLE)ret, oldfp_lo, &oldfp_hi, FILE_BEGIN); return -1; } - return ret; + if(SetFilePointer((HANDLE)ret, oldfp_lo, &oldfp_hi, FILE_BEGIN) == 0xffffffff) { + errno=GetLastError(); + if(errno != NO_ERROR) + return -1; + } + return 0; } int debug_fd_flock(FD fd, int oper) diff --git a/src/modules/files/efuns.c b/src/modules/files/efuns.c index 2b3cc4688f..68cd9b7445 100644 --- a/src/modules/files/efuns.c +++ b/src/modules/files/efuns.c @@ -24,7 +24,7 @@ #include "file_machine.h" #include "file.h" -RCSID("$Id: efuns.c,v 1.70 1999/05/30 22:41:54 per Exp $"); +RCSID("$Id: efuns.c,v 1.71 1999/06/02 21:22:51 marcus Exp $"); #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> @@ -159,8 +159,27 @@ void f_file_truncate(INT32 args) VALID_FILE_IO("file_truncate","write"); +#ifdef __NT__ + { + HANDLE h = CreateFile(s, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if(h == INVALID_HANDLE_VALUE) { + errno = GetLastError(); + res=-1; + } else { + if(SetFilePointer(h, len, NULL, FILE_BEGIN) != 0xffffffff && + SetEndOfFile(h)) + res=0; + else { + errno = GetLastError(); + res=-1; + } + CloseHandle(h); + } + } +#else /* !__NT__ */ res=truncate(s,len); - /* NT: fixme? /Mirar */ +#endif /* __NT__ */ pop_n_elems(args); -- GitLab