From: Bruno Haible <bruno@clisp.org>
Date: Sun, 25 Sep 2011 12:10:58 +0000 (+0200)
Subject: ftruncate: Support for MSVC 9.
X-Git-Tag: v0.1~1744
X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=5d91e956e6cca4176be51f9591ac00a189b7df00;p=gnulib.git

ftruncate: Support for MSVC 9.

* lib/ftruncate.c: Include errno.h, msvc-inval.h.
(chsize_nothrow): New function.
(chsize): Redefine as a macro.
* m4/ftruncate.m4 (gl_PREREQ_FTRUNCATE): Require AC_C_INLINE.
* modules/ftruncate (Depends-on): Add msvc-inval.
---

diff --git a/ChangeLog b/ChangeLog
index c7bc060ee7..12ef00a68b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2011-09-25  Bruno Haible  <bruno@clisp.org>
+
+	ftruncate: Support for MSVC 9.
+	* lib/ftruncate.c: Include errno.h, msvc-inval.h.
+	(chsize_nothrow): New function.
+	(chsize): Redefine as a macro.
+	* m4/ftruncate.m4 (gl_PREREQ_FTRUNCATE): Require AC_C_INLINE.
+	* modules/ftruncate (Depends-on): Add msvc-inval.
+
 2011-09-25  Bruno Haible  <bruno@clisp.org>
 
 	New module 'fstat'.
diff --git a/lib/ftruncate.c b/lib/ftruncate.c
index d5a3be144c..ae1e85890c 100644
--- a/lib/ftruncate.c
+++ b/lib/ftruncate.c
@@ -8,8 +8,32 @@
 
 #if HAVE_CHSIZE
 
+# include <errno.h>
 # include <io.h>
 
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+#  include "msvc-inval.h"
+static inline int
+chsize_nothrow (int fd, long length)
+{
+  int result;
+
+  TRY_MSVC_INVAL
+    {
+      result = chsize (fd, length);
+    }
+  CATCH_MSVC_INVAL
+    {
+      result = -1;
+      errno = EBADF;
+    }
+  DONE_MSVC_INVAL;
+
+  return result;
+}
+#  define chsize chsize_nothrow
+# endif
+
 int
 ftruncate (int fd, off_t length)
 {
diff --git a/m4/ftruncate.m4 b/m4/ftruncate.m4
index 42730907a6..4a47ba4297 100644
--- a/m4/ftruncate.m4
+++ b/m4/ftruncate.m4
@@ -1,4 +1,4 @@
-# serial 17
+# serial 18
 
 # See if we need to emulate a missing ftruncate function using chsize.
 
@@ -19,5 +19,6 @@ AC_DEFUN([gl_FUNC_FTRUNCATE],
 # Prerequisites of lib/ftruncate.c.
 AC_DEFUN([gl_PREREQ_FTRUNCATE],
 [
+  AC_REQUIRE([AC_C_INLINE])
   AC_CHECK_FUNCS([chsize])
 ])
diff --git a/modules/ftruncate b/modules/ftruncate
index 3bea20be3b..097ed9c770 100644
--- a/modules/ftruncate
+++ b/modules/ftruncate
@@ -8,6 +8,7 @@ m4/ftruncate.m4
 Depends-on:
 unistd
 largefile
+msvc-inval      [test $HAVE_FTRUNCATE = 0]
 
 configure.ac:
 gl_FUNC_FTRUNCATE