mirror of
https://https.git.savannah.gnu.org/git/gnulib.git
synced 2026-05-13 15:13:36 +00:00
dup2: Support for MSVC.
* lib/dup2.c: Include msvc-inval.h. (rpl_dup2): Handle invalid parameter notifications during dup2 and _get_osfhandle calls. * modules/dup2 (Depends-on): Add msvc-inval. * doc/posix-functions/dup2.texi: Mention problem on MSVC.
This commit is contained in:
@@ -1,5 +1,12 @@
|
||||
2011-09-18 Bruno Haible <bruno@clisp.org>
|
||||
|
||||
dup2: Support for MSVC.
|
||||
* lib/dup2.c: Include msvc-inval.h.
|
||||
(rpl_dup2): Handle invalid parameter notifications during dup2 and
|
||||
_get_osfhandle calls.
|
||||
* modules/dup2 (Depends-on): Add msvc-inval.
|
||||
* doc/posix-functions/dup2.texi: Mention problem on MSVC.
|
||||
|
||||
New module 'msvc-inval'.
|
||||
* lib/msvc-inval.h: New file.
|
||||
* lib/msvc-inval.c: New file.
|
||||
|
||||
@@ -16,6 +16,10 @@ mingw, MSVC 9.
|
||||
This function can hang when duplicating an fd to itself on some platforms:
|
||||
mingw, MSVC 9.
|
||||
|
||||
@item
|
||||
This function crashes when invoked with invalid arguments on some platforms:
|
||||
MSVC 9.
|
||||
|
||||
@item
|
||||
This function resets the @code{FD_CLOEXEC} flag when duplicating an fd
|
||||
to itself on some platforms:
|
||||
|
||||
29
lib/dup2.c
29
lib/dup2.c
@@ -31,6 +31,8 @@
|
||||
# include <windows.h>
|
||||
#endif
|
||||
|
||||
#include "msvc-inval.h"
|
||||
|
||||
#if HAVE_DUP2
|
||||
|
||||
# undef dup2
|
||||
@@ -45,7 +47,19 @@ rpl_dup2 (int fd, int desired_fd)
|
||||
future dup2 calls will hang. */
|
||||
if (fd == desired_fd)
|
||||
{
|
||||
if ((HANDLE) _get_osfhandle (fd) == INVALID_HANDLE_VALUE)
|
||||
HANDLE handle;
|
||||
|
||||
TRY_MSVC_INVAL
|
||||
{
|
||||
handle = (HANDLE) _get_osfhandle (fd);
|
||||
}
|
||||
CATCH_MSVC_INVAL
|
||||
{
|
||||
handle = INVALID_HANDLE_VALUE;
|
||||
}
|
||||
DONE_MSVC_INVAL
|
||||
|
||||
if (handle == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
errno = EBADF;
|
||||
return -1;
|
||||
@@ -64,7 +78,18 @@ rpl_dup2 (int fd, int desired_fd)
|
||||
if (fd == desired_fd)
|
||||
return fcntl (fd, F_GETFL) == -1 ? -1 : fd;
|
||||
# endif
|
||||
result = dup2 (fd, desired_fd);
|
||||
|
||||
TRY_MSVC_INVAL
|
||||
{
|
||||
result = dup2 (fd, desired_fd);
|
||||
}
|
||||
CATCH_MSVC_INVAL
|
||||
{
|
||||
result = -1;
|
||||
errno = EBADF;
|
||||
}
|
||||
DONE_MSVC_INVAL
|
||||
|
||||
# ifdef __linux__
|
||||
/* Correct a Linux return value.
|
||||
<http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.30.y.git;a=commitdiff;h=2b79bc4f7ebbd5af3c8b867968f9f15602d5f802>
|
||||
|
||||
@@ -8,6 +8,7 @@ m4/dup2.m4
|
||||
Depends-on:
|
||||
unistd
|
||||
dup2-obsolete
|
||||
msvc-inval [test $HAVE_DUP2 = 0 || test $REPLACE_DUP2 = 1]
|
||||
|
||||
configure.ac:
|
||||
gl_FUNC_DUP2
|
||||
|
||||
Reference in New Issue
Block a user