* 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>
+
+ 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'.
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.
/* 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
-# 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,
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
Depends-on:
unistd
fd-hook [test $REPLACE_CLOSE = 1]
+msvc-inval [test $REPLACE_CLOSE = 1]
configure.ac:
gl_FUNC_CLOSE
Depends-on:
binary-io
+close
msvc-nothrow
open
Depends-on:
msvc-nothrow
open
+close
configure.ac:
Depends-on:
binary-io
+close
getdtablesize
msvc-nothrow
stdbool
tests/macros.h
Depends-on:
+close
configure.ac:
Depends-on:
binary-io
cloexec
+close
dup
fd-safer-flag
msvc-nothrow