From 895d4925b7eb3475050328ef820e8ddfee95e1de Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sat, 24 Sep 2011 02:48:19 +0200 Subject: [PATCH] close: Support for MSVC 9. * lib/close.c: Include , 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 | 16 ++++++++++++++++ doc/posix-functions/close.texi | 3 +++ lib/close.c | 33 ++++++++++++++++++++++++++++++--- m4/close.m4 | 6 +++++- modules/close | 1 + modules/dup2-tests | 1 + modules/dup3-tests | 1 + modules/fcntl-tests | 1 + modules/spawn-pipe-tests | 1 + modules/unistd-safer-tests | 1 + 10 files changed, 60 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index a81731ea5..cfe80269a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,21 @@ 2011-09-23 Bruno Haible + close: Support for MSVC 9. + * lib/close.c: Include , 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 + 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 e93156f41..a1dc7034b 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 2c41c75b8..c2197fe0a 100644 --- a/lib/close.c +++ b/lib/close.c @@ -19,18 +19,45 @@ /* Specification. */ #include +#include + #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 cd30d08cf..f860a320c 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 adec0401e..6451ce2f7 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 8277e3b17..25a4a18b3 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 02f422e84..03f1cad5e 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 72705801e..5e34440e7 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 16d96fcd9..f7831d5e4 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 03e753c45..cd2bbcd34 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 -- 2.11.0