summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog16
-rw-r--r--doc/posix-functions/close.texi3
-rw-r--r--lib/close.c33
-rw-r--r--m4/close.m46
-rw-r--r--modules/close1
-rw-r--r--modules/dup2-tests1
-rw-r--r--modules/dup3-tests1
-rw-r--r--modules/fcntl-tests1
-rw-r--r--modules/spawn-pipe-tests1
-rw-r--r--modules/unistd-safer-tests1
10 files changed, 60 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index a81731ea50..cfe80269a1 100644
--- 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.
diff --git a/doc/posix-functions/close.texi b/doc/posix-functions/close.texi
index e93156f41f..a1dc7034b4 100644
--- a/doc/posix-functions/close.texi
+++ b/doc/posix-functions/close.texi
@@ -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.
diff --git a/lib/close.c b/lib/close.c
index 2c41c75b8b..c2197fe0a6 100644
--- a/lib/close.c
+++ b/lib/close.c
@@ -19,18 +19,45 @@
/* 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
diff --git a/m4/close.m4 b/m4/close.m4
index cd30d08cf6..f860a320c1 100644
--- a/m4/close.m4
+++ b/m4/close.m4
@@ -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
diff --git a/modules/close b/modules/close
index adec0401e3..6451ce2f7e 100644
--- a/modules/close
+++ b/modules/close
@@ -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
diff --git a/modules/dup2-tests b/modules/dup2-tests
index 8277e3b170..25a4a18b3c 100644
--- a/modules/dup2-tests
+++ b/modules/dup2-tests
@@ -5,6 +5,7 @@ tests/macros.h
Depends-on:
binary-io
+close
msvc-nothrow
open
diff --git a/modules/dup3-tests b/modules/dup3-tests
index 02f422e845..03f1cad5e4 100644
--- a/modules/dup3-tests
+++ b/modules/dup3-tests
@@ -6,6 +6,7 @@ tests/macros.h
Depends-on:
msvc-nothrow
open
+close
configure.ac:
diff --git a/modules/fcntl-tests b/modules/fcntl-tests
index 72705801e5..5e34440e7b 100644
--- a/modules/fcntl-tests
+++ b/modules/fcntl-tests
@@ -5,6 +5,7 @@ tests/macros.h
Depends-on:
binary-io
+close
getdtablesize
msvc-nothrow
stdbool
diff --git a/modules/spawn-pipe-tests b/modules/spawn-pipe-tests
index 16d96fcd9a..f7831d5e4d 100644
--- a/modules/spawn-pipe-tests
+++ b/modules/spawn-pipe-tests
@@ -5,6 +5,7 @@ tests/test-spawn-pipe-child.c
tests/macros.h
Depends-on:
+close
configure.ac:
diff --git a/modules/unistd-safer-tests b/modules/unistd-safer-tests
index 03e753c456..cd2bbcd34a 100644
--- a/modules/unistd-safer-tests
+++ b/modules/unistd-safer-tests
@@ -5,6 +5,7 @@ tests/macros.h
Depends-on:
binary-io
cloexec
+close
dup
fd-safer-flag
msvc-nothrow