close: Support for MSVC 9.
authorBruno Haible <bruno@clisp.org>
Sat, 24 Sep 2011 00:48:19 +0000 (02:48 +0200)
committerBruno Haible <bruno@clisp.org>
Sat, 24 Sep 2011 00:48:19 +0000 (02:48 +0200)
* lib/close.c: Include <errno.h>, msvc-inval.h.
(close_nothrow): New function.
(rpl_close): Use it.
* m4/close.m4 (gl_FUNC_CLOSE): Replace close if the platform has an
invalid parameter handler.
* modules/close (Depends-on): Add msvc-inval.
* modules/dup2-tests (Depends-on): Add close.
* modules/dup3-tests (Depends-on): Likewise.
* modules/fcntl-tests (Depends-on): Likewise.
* modules/spawn-pipe-tests (Depends-on): Likewise.
* modules/unistd-safer-tests (Depends-on): Likewise.
* doc/posix-functions/close.texi: Mention the problem on MSVC.

ChangeLog
doc/posix-functions/close.texi
lib/close.c
m4/close.m4
modules/close
modules/dup2-tests
modules/dup3-tests
modules/fcntl-tests
modules/spawn-pipe-tests
modules/unistd-safer-tests

index a81731e..cfe8026 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,21 @@
 2011-09-23  Bruno Haible  <bruno@clisp.org>
 
+       close: Support for MSVC 9.
+       * lib/close.c: Include <errno.h>, msvc-inval.h.
+       (close_nothrow): New function.
+       (rpl_close): Use it.
+       * m4/close.m4 (gl_FUNC_CLOSE): Replace close if the platform has an
+       invalid parameter handler.
+       * modules/close (Depends-on): Add msvc-inval.
+       * modules/dup2-tests (Depends-on): Add close.
+       * modules/dup3-tests (Depends-on): Likewise.
+       * modules/fcntl-tests (Depends-on): Likewise.
+       * modules/spawn-pipe-tests (Depends-on): Likewise.
+       * modules/unistd-safer-tests (Depends-on): Likewise.
+       * doc/posix-functions/close.texi: Mention the problem on MSVC.
+
+2011-09-23  Bruno Haible  <bruno@clisp.org>
+
        New module 'dup'.
        * lib/unistd.in.h (dup): Declare only if the 'dup' module is in use.
        Allow replacement.
index e93156f..a1dc703 100644 (file)
@@ -9,6 +9,9 @@ Gnulib module: close
 Portability problems fixed by Gnulib:
 @itemize
 @item
+This function crashes when invoked with invalid arguments on some platforms:
+MSVC 9.
+@item
 On Windows platforms (excluding Cygwin), @code{socket} and @code{accept}
 do not return file descriptors that can be closed by @code{close}.
 Instead, @code{closesocket} must be used.
index 2c41c75..c2197fe 100644 (file)
 /* Specification.  */
 #include <unistd.h>
 
+#include <errno.h>
+
 #include "fd-hook.h"
+#include "msvc-inval.h"
+
+#undef close
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static int
+close_nothrow (int fd)
+{
+  int result;
+
+  TRY_MSVC_INVAL
+    {
+      result = close (fd);
+    }
+  CATCH_MSVC_INVAL
+    {
+      result = -1;
+      errno = EBADF;
+    }
+  DONE_MSVC_INVAL;
+
+  return result;
+}
+#else
+# define close_nothrow close
+#endif
 
 /* Override close() to call into other gnulib modules.  */
 
 int
 rpl_close (int fd)
-#undef close
 {
 #if WINDOWS_SOCKETS
-  int retval = execute_all_close_hooks (close, fd);
+  int retval = execute_all_close_hooks (close_nothrow, fd);
 #else
-  int retval = close (fd);
+  int retval = close_nothrow (fd);
 #endif
 
 #if REPLACE_FCHDIR
index cd30d08..f860a32 100644 (file)
@@ -1,4 +1,4 @@
-# close.m4 serial 7
+# close.m4 serial 8
 dnl Copyright (C) 2008-2011 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -7,6 +7,10 @@ dnl with or without modifications, as long as this notice is preserved.
 AC_DEFUN([gl_FUNC_CLOSE],
 [
   AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  AC_REQUIRE([gl_MSVC_INVAL])
+  if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+    REPLACE_CLOSE=1
+  fi
   m4_ifdef([gl_PREREQ_SYS_H_WINSOCK2], [
     gl_PREREQ_SYS_H_WINSOCK2
     if test $UNISTD_H_HAVE_WINSOCK2_H = 1; then
index adec040..6451ce2 100644 (file)
@@ -8,6 +8,7 @@ m4/close.m4
 Depends-on:
 unistd
 fd-hook         [test $REPLACE_CLOSE = 1]
+msvc-inval      [test $REPLACE_CLOSE = 1]
 
 configure.ac:
 gl_FUNC_CLOSE
index 8277e3b..25a4a18 100644 (file)
@@ -5,6 +5,7 @@ tests/macros.h
 
 Depends-on:
 binary-io
+close
 msvc-nothrow
 open
 
index 02f422e..03f1cad 100644 (file)
@@ -6,6 +6,7 @@ tests/macros.h
 Depends-on:
 msvc-nothrow
 open
+close
 
 configure.ac:
 
index 7270580..5e34440 100644 (file)
@@ -5,6 +5,7 @@ tests/macros.h
 
 Depends-on:
 binary-io
+close
 getdtablesize
 msvc-nothrow
 stdbool
index 16d96fc..f7831d5 100644 (file)
@@ -5,6 +5,7 @@ tests/test-spawn-pipe-child.c
 tests/macros.h
 
 Depends-on:
+close
 
 configure.ac:
 
index 03e753c..cd2bbcd 100644 (file)
@@ -5,6 +5,7 @@ tests/macros.h
 Depends-on:
 binary-io
 cloexec
+close
 dup
 fd-safer-flag
 msvc-nothrow