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