New module 'msvc-nothrow'. Makes _get_osfhandle safe on MSVC 9.
authorBruno Haible <bruno@clisp.org>
Fri, 23 Sep 2011 19:38:44 +0000 (21:38 +0200)
committerBruno Haible <bruno@clisp.org>
Fri, 23 Sep 2011 19:38:44 +0000 (21:38 +0200)
* lib/msvc-nothrow.h: New file.
* lib/msvc-nothrow.c: New file.
* m4/msvc-nothrow.m4: New file.
* modules/msvc-nothrow: New file.
* lib/dup2.c: Include msvc-nothrow.h.
(rpl_dup2): No need to protect _get_osfhandle call here.
* lib/accept4.c: Include msvc-nothrow.h.
* lib/error.c: Likewise.
* lib/fcntl.c: Likewise.
* lib/lseek.c: Likewise.
* lib/nonblocking.c: Likewise.
* lib/poll.c: Likewise.
* lib/read.c: Likewise.
* lib/select.c: Likewise.
* lib/sockets.h: Likewise.
* lib/sockets.c: Likewise.
* lib/stdio-read.c: Likewise.
* lib/stdio-write.c: Likewise.
* lib/write.c: Likewise.
* lib/w32sock.h: Likewise.
* lib/w32spawn.h: Likewise.
* lib/flock.c: Include msvc-nothrow.h instead of <io.h>.
* lib/fsync.c: Likewise.
* lib/isapipe.c: Likewise.
* modules/dup2 (Depends-on): Add msvc-nothrow.
* modules/accept4 (Depends-on): Likewise.
* modules/error (Depends-on): Likewise.
* modules/fcntl (Depends-on): Likewise.
* modules/lseek (Depends-on): Likewise.
* modules/nonblocking (Depends-on): Likewise.
* modules/poll (Depends-on): Likewise.
* modules/read (Depends-on): Likewise.
* modules/select (Depends-on): Likewise.
* modules/sockets (Depends-on): Likewise.
* modules/sigpipe (Depends-on): Likewise.
* modules/write (Depends-on): Likewise.
* modules/accept (Depends-on): Likewise.
* modules/bind (Depends-on): Likewise.
* modules/connect (Depends-on): Likewise.
* modules/gethostname (Depends-on): Likewise.
* modules/getpeername (Depends-on): Likewise.
* modules/getsockname (Depends-on): Likewise.
* modules/getsockopt (Depends-on): Likewise.
* modules/ioctl (Depends-on): Likewise.
* modules/listen (Depends-on): Likewise.
* modules/recv (Depends-on): Likewise.
* modules/recvfrom (Depends-on): Likewise.
* modules/send (Depends-on): Likewise.
* modules/sendto (Depends-on): Likewise.
* modules/setsockopt (Depends-on): Likewise.
* modules/shutdown (Depends-on): Likewise.
* modules/socket (Depends-on): Likewise.
* modules/execute (Depends-on): Likewise.
* modules/spawn-pipe (Depends-on): Likewise.
* modules/flock (Depends-on): Likewise.
* modules/fsync (Depends-on): Likewise.
* modules/isapipe (Depends-on): Likewise.
* tests/test-cloexec.c: Include msvc-nothrow.h.
* tests/test-dup-safer.c: Likewise.
* tests/test-dup2.c: Likewise.
* tests/test-dup3.c: Likewise.
* tests/test-fcntl.c: Likewise.
* tests/test-pipe.c: Likewise.
* tests/test-pipe2.c: Likewise.
* modules/cloexec-tests (Depends-on): Add msvc-nothrow.
* modules/unistd-safer-tests (Depends-on): Likewise.
* modules/dup2-tests (Depends-on): Likewise.
* modules/dup3-tests (Depends-on): Likewise.
* modules/fcntl-tests (Depends-on): Likewise.
* modules/pipe-posix-tests (Depends-on): Likewise.
* modules/pipe2-tests (Depends-on): Likewise.

71 files changed:
ChangeLog
lib/accept4.c
lib/dup2.c
lib/error.c
lib/fcntl.c
lib/flock.c
lib/fsync.c
lib/isapipe.c
lib/lseek.c
lib/msvc-nothrow.c [new file with mode: 0644]
lib/msvc-nothrow.h [new file with mode: 0644]
lib/nonblocking.c
lib/poll.c
lib/read.c
lib/select.c
lib/sockets.c
lib/sockets.h
lib/stdio-read.c
lib/stdio-write.c
lib/w32sock.h
lib/w32spawn.h
lib/write.c
m4/msvc-nothrow.m4 [new file with mode: 0644]
modules/accept
modules/accept4
modules/bind
modules/cloexec-tests
modules/connect
modules/dup2
modules/dup2-tests
modules/dup3-tests
modules/error
modules/execute
modules/fcntl
modules/fcntl-tests
modules/flock
modules/fsync
modules/gethostname
modules/getpeername
modules/getsockname
modules/getsockopt
modules/ioctl
modules/isapipe
modules/listen
modules/lseek
modules/msvc-nothrow [new file with mode: 0644]
modules/nonblocking
modules/pipe-posix-tests
modules/pipe2-tests
modules/poll
modules/read
modules/recv
modules/recvfrom
modules/select
modules/send
modules/sendto
modules/setsockopt
modules/shutdown
modules/sigpipe
modules/socket
modules/sockets
modules/spawn-pipe
modules/unistd-safer-tests
modules/write
tests/test-cloexec.c
tests/test-dup-safer.c
tests/test-dup2.c
tests/test-dup3.c
tests/test-fcntl.c
tests/test-pipe.c
tests/test-pipe2.c

index 74677b0..f6d7f09 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,80 @@
 2011-09-23  Bruno Haible  <bruno@clisp.org>
 
+       New module 'msvc-nothrow'. Makes _get_osfhandle safe on MSVC 9.
+       * lib/msvc-nothrow.h: New file.
+       * lib/msvc-nothrow.c: New file.
+       * m4/msvc-nothrow.m4: New file.
+       * modules/msvc-nothrow: New file.
+       * lib/dup2.c: Include msvc-nothrow.h.
+       (rpl_dup2): No need to protect _get_osfhandle call here.
+       * lib/accept4.c: Include msvc-nothrow.h.
+       * lib/error.c: Likewise.
+       * lib/fcntl.c: Likewise.
+       * lib/lseek.c: Likewise.
+       * lib/nonblocking.c: Likewise.
+       * lib/poll.c: Likewise.
+       * lib/read.c: Likewise.
+       * lib/select.c: Likewise.
+       * lib/sockets.h: Likewise.
+       * lib/sockets.c: Likewise.
+       * lib/stdio-read.c: Likewise.
+       * lib/stdio-write.c: Likewise.
+       * lib/write.c: Likewise.
+       * lib/w32sock.h: Likewise.
+       * lib/w32spawn.h: Likewise.
+       * lib/flock.c: Include msvc-nothrow.h instead of <io.h>.
+       * lib/fsync.c: Likewise.
+       * lib/isapipe.c: Likewise.
+       * modules/dup2 (Depends-on): Add msvc-nothrow.
+       * modules/accept4 (Depends-on): Likewise.
+       * modules/error (Depends-on): Likewise.
+       * modules/fcntl (Depends-on): Likewise.
+       * modules/lseek (Depends-on): Likewise.
+       * modules/nonblocking (Depends-on): Likewise.
+       * modules/poll (Depends-on): Likewise.
+       * modules/read (Depends-on): Likewise.
+       * modules/select (Depends-on): Likewise.
+       * modules/sockets (Depends-on): Likewise.
+       * modules/sigpipe (Depends-on): Likewise.
+       * modules/write (Depends-on): Likewise.
+       * modules/accept (Depends-on): Likewise.
+       * modules/bind (Depends-on): Likewise.
+       * modules/connect (Depends-on): Likewise.
+       * modules/gethostname (Depends-on): Likewise.
+       * modules/getpeername (Depends-on): Likewise.
+       * modules/getsockname (Depends-on): Likewise.
+       * modules/getsockopt (Depends-on): Likewise.
+       * modules/ioctl (Depends-on): Likewise.
+       * modules/listen (Depends-on): Likewise.
+       * modules/recv (Depends-on): Likewise.
+       * modules/recvfrom (Depends-on): Likewise.
+       * modules/send (Depends-on): Likewise.
+       * modules/sendto (Depends-on): Likewise.
+       * modules/setsockopt (Depends-on): Likewise.
+       * modules/shutdown (Depends-on): Likewise.
+       * modules/socket (Depends-on): Likewise.
+       * modules/execute (Depends-on): Likewise.
+       * modules/spawn-pipe (Depends-on): Likewise.
+       * modules/flock (Depends-on): Likewise.
+       * modules/fsync (Depends-on): Likewise.
+       * modules/isapipe (Depends-on): Likewise.
+       * tests/test-cloexec.c: Include msvc-nothrow.h.
+       * tests/test-dup-safer.c: Likewise.
+       * tests/test-dup2.c: Likewise.
+       * tests/test-dup3.c: Likewise.
+       * tests/test-fcntl.c: Likewise.
+       * tests/test-pipe.c: Likewise.
+       * tests/test-pipe2.c: Likewise.
+       * modules/cloexec-tests (Depends-on): Add msvc-nothrow.
+       * modules/unistd-safer-tests (Depends-on): Likewise.
+       * modules/dup2-tests (Depends-on): Likewise.
+       * modules/dup3-tests (Depends-on): Likewise.
+       * modules/fcntl-tests (Depends-on): Likewise.
+       * modules/pipe-posix-tests (Depends-on): Likewise.
+       * modules/pipe2-tests (Depends-on): Likewise.
+
+2011-09-23  Bruno Haible  <bruno@clisp.org>
+
        dup2: Make code more maintainable.
        * lib/dup2.c (dup2_nothrow): New function, extracted from rpl_dup2.
        (rpl_dup2): Use it.
index 1e7e7f4..4e1ef1a 100644 (file)
@@ -23,6 +23,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include "binary-io.h"
+#include "msvc-nothrow.h"
 
 #ifndef SOCK_CLOEXEC
 # define SOCK_CLOEXEC 0
index b8798f3..e2a4473 100644 (file)
@@ -29,6 +29,8 @@
 /* Get declarations of the Win32 API functions.  */
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
+/* Get _get_osfhandle.  */
+# include "msvc-nothrow.h"
 #endif
 
 #include "msvc-inval.h"
@@ -70,19 +72,7 @@ rpl_dup2 (int fd, int desired_fd)
      future dup2 calls will hang.  */
   if (fd == desired_fd)
     {
-      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)
+      if ((HANDLE) _get_osfhandle (fd) == INVALID_HANDLE_VALUE)
         {
           errno = EBADF;
           return -1;
index 7482baa..5ebe8bf 100644 (file)
@@ -92,6 +92,8 @@ extern void __error_at_line (int status, int errnum, const char *file_name,
 /* Get declarations of the Win32 API functions.  */
 #  define WIN32_LEAN_AND_MEAN
 #  include <windows.h>
+/* Get _get_osfhandle.  */
+#  include "msvc-nothrow.h"
 # endif
 
 /* The gnulib override of fcntl is not needed in this file.  */
index d6a328c..92e32ee 100644 (file)
@@ -37,6 +37,9 @@
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
 
+/* Get _get_osfhandle.  */
+# include "msvc-nothrow.h"
+
 /* Upper bound on getdtablesize().  See lib/getdtablesize.c.  */
 # define OPEN_MAX_MAX 0x10000
 
index 8f018e5..439ff43 100644 (file)
 
 #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
 
-/* _get_osfhandle */
-# include <io.h>
-
 /* LockFileEx */
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
 
 # include <errno.h>
 
+/* _get_osfhandle */
+# include "msvc-nothrow.h"
+
 /* Determine the current size of a file.  Because the other braindead
  * APIs we'll call need lower/upper 32 bit pairs, keep the file size
  * like that too.
index f0fc8e5..325f216 100644 (file)
 
 #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
 
-/* _get_osfhandle */
-# include <io.h>
-
 /* FlushFileBuffers */
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
 
 # include <errno.h>
 
+/* Get _get_osfhandle.  */
+# include "msvc-nothrow.h"
+
 int
 fsync (int fd)
 {
index a5349b1..f6e16d1 100644 (file)
 #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
 /* Windows platforms.  */
 
-/* Get _get_osfhandle.  */
-# include <io.h>
-
 /* Get GetFileType.  */
 # include <windows.h>
 
+/* Get _get_osfhandle.  */
+# include "msvc-nothrow.h"
+
 int
 isapipe (int fd)
 {
index e6c2136..134e8b7 100644 (file)
@@ -24,6 +24,8 @@
 /* Windows platforms.  */
 /* Get GetFileType.  */
 # include <windows.h>
+/* Get _get_osfhandle.  */
+# include "msvc-nothrow.h"
 #else
 # include <sys/stat.h>
 #endif
diff --git a/lib/msvc-nothrow.c b/lib/msvc-nothrow.c
new file mode 100644 (file)
index 0000000..db72631
--- /dev/null
@@ -0,0 +1,50 @@
+/* Wrappers that don't throw invalid parameter notifications
+   with MSVC runtime libraries.
+   Copyright (C) 2011 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "msvc-nothrow.h"
+
+/* Get declarations of the Win32 API functions.  */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#include "msvc-inval.h"
+
+#undef _get_osfhandle
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+intptr_t
+_gl_nothrow_get_osfhandle (int fd)
+{
+  intptr_t result;
+
+  TRY_MSVC_INVAL
+    {
+      result = _get_osfhandle (fd);
+    }
+  CATCH_MSVC_INVAL
+    {
+      result = INVALID_HANDLE_VALUE;
+    }
+  DONE_MSVC_INVAL;
+
+  return result;
+}
+#endif
diff --git a/lib/msvc-nothrow.h b/lib/msvc-nothrow.h
new file mode 100644 (file)
index 0000000..1ec2888
--- /dev/null
@@ -0,0 +1,44 @@
+/* Wrappers that don't throw invalid parameter notifications
+   with MSVC runtime libraries.
+   Copyright (C) 2011 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#ifndef _MSVC_NOTHROW_H
+#define _MSVC_NOTHROW_H
+
+/* With MSVC runtime libraries with the "invalid parameter handler" concept,
+   functions like fprintf(), dup2(), or close() crash when the caller passes
+   an invalid argument.  But POSIX wants error codes (such as EINVAL or EBADF)
+   instead.
+   This file defines wrappers that turn such an invalid parameter notification
+   into an error code.  */
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* Get original declaration of _get_osfhandle.  */
+# include <io.h>
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+
+/* Override _get_osfhandle.  */
+extern intptr_t _gl_nothrow_get_osfhandle (int fd);
+#  define _get_osfhandle _gl_nothrow_get_osfhandle
+
+# endif
+
+#endif
+
+#endif /* _MSVC_NOTHROW_H */
index 9f7bce9..c356f36 100644 (file)
@@ -32,6 +32,8 @@
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
 
+# include "msvc-nothrow.h"
+
 int
 get_nonblocking_flag (int desc)
 {
index e064565..b012ba0 100644 (file)
@@ -43,6 +43,7 @@
 # include <io.h>
 # include <stdio.h>
 # include <conio.h>
+# include "msvc-nothrow.h"
 #else
 # include <sys/time.h>
 # include <sys/socket.h>
index 21b90db..61675af 100644 (file)
@@ -31,6 +31,8 @@
 #  define WIN32_LEAN_AND_MEAN  /* avoid including junk */
 #  include <windows.h>
 
+#  include "msvc-nothrow.h"
+
 ssize_t
 rpl_read (int fd, void *buf, size_t count)
 #undef read
index 4848859..aee0ac2 100644 (file)
@@ -37,6 +37,8 @@
 #include <conio.h>
 #include <time.h>
 
+#include "msvc-nothrow.h"
+
 struct bitset {
   unsigned char in[FD_SETSIZE / CHAR_BIT];
   unsigned char out[FD_SETSIZE / CHAR_BIT];
index 53cb66e..39939b0 100644 (file)
@@ -28,6 +28,7 @@
 # include <sys/socket.h>
 
 # include "fd-hook.h"
+# include "msvc-nothrow.h"
 
 /* Get set_winsock_errno, FD_TO_SOCKET etc. */
 # include "w32sock.h"
index 93ae5d2..323f68c 100644 (file)
@@ -36,6 +36,8 @@ int gl_sockets_cleanup (void);
 
 #include <sys/socket.h>
 
+#include "msvc-nothrow.h"
+
 static inline SOCKET
 gl_fd_to_handle (int fd)
 {
index d7901dd..86b1d61 100644 (file)
@@ -37,6 +37,8 @@
 #  define WIN32_LEAN_AND_MEAN  /* avoid including junk */
 #  include <windows.h>
 
+#  include "msvc-nothrow.h"
+
 #  define CALL_WITH_ERRNO_FIX(RETTYPE, EXPRESSION, FAILED) \
   if (ferror (stream))                                                        \
     return (EXPRESSION);                                                      \
index a586c35..02aed45 100644 (file)
@@ -39,6 +39,8 @@
 #  define WIN32_LEAN_AND_MEAN  /* avoid including junk */
 #  include <windows.h>
 
+#  include "msvc-nothrow.h"
+
 #  if GNULIB_NONBLOCKING
 #   define CLEAR_ERRNO \
       errno = 0;
index 651a76d..55280d6 100644 (file)
 /* Get O_RDWR and O_BINARY.  */
 #include <fcntl.h>
 
-/* Get _get_osfhandle() and _open_osfhandle().  */
+/* Get _open_osfhandle().  */
 #include <io.h>
 
+/* Get _get_osfhandle().  */
+#include "msvc-nothrow.h"
+
 #define FD_TO_SOCKET(fd)   ((SOCKET) _get_osfhandle ((fd)))
 #define SOCKET_TO_FD(fh)   (_open_osfhandle ((long) (fh), O_RDWR | O_BINARY))
 
index 58b0392..1667370 100644 (file)
@@ -19,7 +19,7 @@
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 
-/* Get _get_osfhandle() and _open_osfhandle().  */
+/* Get _open_osfhandle().  */
 #include <io.h>
 
 #include <stdbool.h>
@@ -27,6 +27,9 @@
 #include <unistd.h>
 #include <errno.h>
 
+/* Get _get_osfhandle().  */
+#include "msvc-nothrow.h"
+
 #include "cloexec.h"
 #include "xalloc.h"
 
index b0ffa94..64bc535 100644 (file)
@@ -38,6 +38,8 @@
 #  define WIN32_LEAN_AND_MEAN  /* avoid including junk */
 #  include <windows.h>
 
+#  include "msvc-nothrow.h"
+
 ssize_t
 rpl_write (int fd, const void *buf, size_t count)
 #undef write
diff --git a/m4/msvc-nothrow.m4 b/m4/msvc-nothrow.m4
new file mode 100644 (file)
index 0000000..b2f6bb4
--- /dev/null
@@ -0,0 +1,10 @@
+# msvc-nothrow.m4 serial 1
+dnl Copyright (C) 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,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MSVC_NOTHROW],
+[
+  AC_REQUIRE([gl_MSVC_INVAL])
+])
index 6421e92..059a56d 100644 (file)
@@ -9,6 +9,7 @@ Depends-on:
 sys_socket
 socketlib
 errno           [test "$ac_cv_header_winsock2_h" = yes]
+msvc-nothrow    [test "$ac_cv_header_winsock2_h" = yes]
 
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
index e6b9994..e931976 100644 (file)
@@ -12,6 +12,7 @@ accept
 fcntl-h
 binary-io
 extensions
+msvc-nothrow
 
 configure.ac:
 gl_FUNC_ACCEPT4
index dd211d4..e46bd26 100644 (file)
@@ -9,6 +9,7 @@ Depends-on:
 sys_socket
 socketlib
 errno           [test "$ac_cv_header_winsock2_h" = yes]
+msvc-nothrow    [test "$ac_cv_header_winsock2_h" = yes]
 
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
index 3a76b9e..524716c 100644 (file)
@@ -4,6 +4,7 @@ tests/macros.h
 
 Depends-on:
 binary-io
+msvc-nothrow
 
 configure.ac:
 
index d595843..c77632c 100644 (file)
@@ -9,6 +9,7 @@ Depends-on:
 sys_socket
 socketlib
 errno           [test "$ac_cv_header_winsock2_h" = yes]
+msvc-nothrow    [test "$ac_cv_header_winsock2_h" = yes]
 
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
index 2317db3..2ad65d1 100644 (file)
@@ -9,6 +9,7 @@ Depends-on:
 unistd
 dup2-obsolete
 msvc-inval      [test $HAVE_DUP2 = 0 || test $REPLACE_DUP2 = 1]
+msvc-nothrow    [test $HAVE_DUP2 = 0 || test $REPLACE_DUP2 = 1]
 
 configure.ac:
 gl_FUNC_DUP2
index a973fd7..8277e3b 100644 (file)
@@ -5,6 +5,7 @@ tests/macros.h
 
 Depends-on:
 binary-io
+msvc-nothrow
 open
 
 configure.ac:
index 26dd5d8..02f422e 100644 (file)
@@ -4,6 +4,7 @@ tests/signature.h
 tests/macros.h
 
 Depends-on:
+msvc-nothrow
 open
 
 configure.ac:
index ae12b45..f867617 100644 (file)
@@ -14,6 +14,7 @@ m4/error.m4
 Depends-on:
 strerror        [test $ac_cv_lib_error_at_line = no]
 unistd          [test $ac_cv_lib_error_at_line = no]
+msvc-nothrow    [test $ac_cv_lib_error_at_line = no]
 
 configure.ac:
 gl_ERROR
index a65696b..f4584ab 100644 (file)
@@ -14,6 +14,7 @@ error
 fatal-signal
 wait-process
 gettext-h
+msvc-nothrow
 spawn
 posix_spawnp
 posix_spawn_file_actions_init
index 4c30e9e..ab7c8ad 100644 (file)
@@ -10,6 +10,7 @@ fcntl-h
 extensions
 dup2            [test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1]
 getdtablesize   [test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1]
+msvc-nothrow    [test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1]
 
 configure.ac:
 gl_FUNC_FCNTL
index 44b040c..7270580 100644 (file)
@@ -6,6 +6,7 @@ tests/macros.h
 Depends-on:
 binary-io
 getdtablesize
+msvc-nothrow
 stdbool
 
 configure.ac:
index 56ef9b2..73d27c6 100644 (file)
@@ -7,6 +7,7 @@ m4/flock.m4
 
 Depends-on:
 sys_file
+msvc-nothrow    [test $HAVE_FLOCK = 0]
 
 configure.ac:
 gl_FUNC_FLOCK
index 0f5b3fc..660eb59 100644 (file)
@@ -7,6 +7,7 @@ m4/fsync.m4
 
 Depends-on:
 unistd
+msvc-nothrow    [test $HAVE_FSYNC = 0]
 
 configure.ac:
 gl_FUNC_FSYNC
index 42ee838..b41dfad 100644 (file)
@@ -11,6 +11,7 @@ unistd
 sys_socket      [test $HAVE_GETHOSTNAME = 0]
 errno           [test $HAVE_GETHOSTNAME = 0]
 sockets         [test $HAVE_GETHOSTNAME = 0]
+msvc-nothrow    [test $HAVE_GETHOSTNAME = 0]
 
 configure.ac:
 gl_FUNC_GETHOSTNAME
index b7f04ee..d1ef822 100644 (file)
@@ -10,6 +10,7 @@ Depends-on:
 sys_socket
 socketlib
 errno           [test "$ac_cv_header_winsock2_h" = yes]
+msvc-nothrow    [test "$ac_cv_header_winsock2_h" = yes]
 
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
index 033c170..15cf490 100644 (file)
@@ -10,6 +10,7 @@ Depends-on:
 sys_socket
 socketlib
 errno           [test "$ac_cv_header_winsock2_h" = yes]
+msvc-nothrow    [test "$ac_cv_header_winsock2_h" = yes]
 
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
index d13e064..1cd1f2e 100644 (file)
@@ -10,6 +10,7 @@ sys_socket
 socketlib
 sys_time        [test "$ac_cv_header_winsock2_h" = yes]
 errno           [test "$ac_cv_header_winsock2_h" = yes]
+msvc-nothrow    [test "$ac_cv_header_winsock2_h" = yes]
 
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
index 9842a53..ba4a85a 100644 (file)
@@ -11,6 +11,7 @@ sys_ioctl
 sys_socket      [test $HAVE_IOCTL = 0 || test $REPLACE_IOCTL = 1]
 errno           [test $HAVE_IOCTL = 0 || test $REPLACE_IOCTL = 1]
 fd-hook         [test $HAVE_IOCTL = 0 || test $REPLACE_IOCTL = 1]
+msvc-nothrow    [test $HAVE_IOCTL = 0 || test $REPLACE_IOCTL = 1]
 
 configure.ac:
 gl_FUNC_IOCTL
index cc62ea8..945df3e 100644 (file)
@@ -10,6 +10,7 @@ Depends-on:
 stdbool         [test $HAVE_ISAPIPE = 0]
 sys_stat        [test $HAVE_ISAPIPE = 0]
 unistd          [test $HAVE_ISAPIPE = 0]
+msvc-nothrow    [test $HAVE_ISAPIPE = 0]
 
 configure.ac:
 gl_ISAPIPE
index 8aff376..baaadc2 100644 (file)
@@ -9,6 +9,7 @@ Depends-on:
 sys_socket
 socketlib
 errno           [test "$ac_cv_header_winsock2_h" = yes]
+msvc-nothrow    [test "$ac_cv_header_winsock2_h" = yes]
 
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
index 0fc7923..c430273 100644 (file)
@@ -8,6 +8,7 @@ m4/lseek.m4
 Depends-on:
 unistd
 largefile
+msvc-nothrow    [test $REPLACE_LSEEK = 1]
 
 configure.ac:
 gl_FUNC_LSEEK
diff --git a/modules/msvc-nothrow b/modules/msvc-nothrow
new file mode 100644 (file)
index 0000000..46d71aa
--- /dev/null
@@ -0,0 +1,28 @@
+Description:
+wrappers that don't throw invalid parameter notifications with MSVC runtime
+libraries
+
+Files:
+lib/msvc-nothrow.h
+lib/msvc-nothrow.c
+m4/msvc-nothrow.m4
+
+Depends-on:
+msvc-inval
+
+configure.ac:
+gl_MSVC_NOTHROW
+if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+  AC_LIBOBJ([msvc-nothrow])
+fi
+
+Makefile.am:
+
+Include:
+"msvc-nothrow.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
index 2d469eb..96881f5 100644 (file)
@@ -12,6 +12,7 @@ m4/asm-underscore.m4
 Depends-on:
 fcntl-h
 ioctl
+msvc-nothrow
 stdbool
 stdio
 sys_socket
index 7afafdc..3f428a0 100644 (file)
@@ -6,6 +6,7 @@ tests/macros.h
 Depends-on:
 stdbool
 binary-io
+msvc-nothrow
 
 configure.ac:
 
index 2e6c3f7..74f9d5f 100644 (file)
@@ -5,6 +5,7 @@ tests/macros.h
 
 Depends-on:
 stdbool
+msvc-nothrow
 
 configure.ac:
 
index f1f22bf..3714332 100644 (file)
@@ -12,6 +12,7 @@ select          [test $HAVE_POLL = 0 || test $REPLACE_POLL = 1]
 sys_select      [test $HAVE_POLL = 0 || test $REPLACE_POLL = 1]
 sys_time        [test $HAVE_POLL = 0 || test $REPLACE_POLL = 1]
 errno           [test $HAVE_POLL = 0 || test $REPLACE_POLL = 1]
+msvc-nothrow    [test $HAVE_POLL = 0 || test $REPLACE_POLL = 1]
 
 configure.ac:
 gl_FUNC_POLL
index 12d97c7..d725955 100644 (file)
@@ -7,6 +7,7 @@ m4/read.m4
 
 Depends-on:
 unistd
+msvc-nothrow    [test $REPLACE_READ = 1]
 
 configure.ac:
 gl_FUNC_READ
index 731717b..b47d8f5 100644 (file)
@@ -9,6 +9,7 @@ Depends-on:
 sys_socket
 socketlib
 errno           [test "$ac_cv_header_winsock2_h" = yes]
+msvc-nothrow    [test "$ac_cv_header_winsock2_h" = yes]
 
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
index c4749ae..2b051b4 100644 (file)
@@ -10,6 +10,7 @@ sys_socket
 socketlib
 errno           [test "$ac_cv_header_winsock2_h" = yes]
 getpeername     [test "$ac_cv_header_winsock2_h" = yes]
+msvc-nothrow    [test "$ac_cv_header_winsock2_h" = yes]
 
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
index f665740..7b25a8b 100644 (file)
@@ -9,6 +9,7 @@ Depends-on:
 sys_select
 alloca          [test $REPLACE_SELECT = 1]
 sockets         [test $REPLACE_SELECT = 1]
+msvc-nothrow    [test $REPLACE_SELECT = 1]
 
 configure.ac:
 gl_FUNC_SELECT
index 18d6c0d..5e115c3 100644 (file)
@@ -9,6 +9,7 @@ Depends-on:
 sys_socket
 socketlib
 errno           [test "$ac_cv_header_winsock2_h" = yes]
+msvc-nothrow    [test "$ac_cv_header_winsock2_h" = yes]
 
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
index 847699d..924818e 100644 (file)
@@ -9,6 +9,7 @@ Depends-on:
 sys_socket
 socketlib
 errno           [test "$ac_cv_header_winsock2_h" = yes]
+msvc-nothrow    [test "$ac_cv_header_winsock2_h" = yes]
 
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
index 0b4ae49..bfe8acd 100644 (file)
@@ -10,6 +10,7 @@ sys_socket
 socketlib
 sys_time        [test "$ac_cv_header_winsock2_h" = yes]
 errno           [test "$ac_cv_header_winsock2_h" = yes]
+msvc-nothrow    [test "$ac_cv_header_winsock2_h" = yes]
 
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
index 7c76ba5..32845db 100644 (file)
@@ -9,6 +9,7 @@ Depends-on:
 sys_socket
 socketlib
 errno           [test "$ac_cv_header_winsock2_h" = yes]
+msvc-nothrow    [test "$ac_cv_header_winsock2_h" = yes]
 
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
index 4f03c9e..d28a562 100644 (file)
@@ -12,6 +12,7 @@ lib/stdio-write.c
 m4/asm-underscore.m4
 
 Depends-on:
+msvc-nothrow
 raise
 signal
 sigprocmask
index 6a056e4..4962549 100644 (file)
@@ -10,6 +10,7 @@ sys_socket
 socketlib
 errno           [test "$ac_cv_header_winsock2_h" = yes]
 sockets         [test "$ac_cv_header_winsock2_h" = yes]
+msvc-nothrow    [test "$ac_cv_header_winsock2_h" = yes]
 
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
index fe92926..b6dffab 100644 (file)
@@ -11,6 +11,7 @@ Depends-on:
 socketlib
 sys_socket
 fd-hook
+msvc-nothrow
 
 configure.ac:
 gl_SOCKETS
index 9898b37..bcb0c9d 100644 (file)
@@ -14,6 +14,7 @@ environ
 error
 fatal-signal
 gettext-h
+msvc-nothrow
 open
 pipe2
 pipe2-safer
index cc4b97a..d8519a6 100644 (file)
@@ -6,6 +6,7 @@ Depends-on:
 binary-io
 cloexec
 fd-safer-flag
+msvc-nothrow
 stdbool
 
 configure.ac:
index d60b5a7..c19f73b 100644 (file)
@@ -8,6 +8,7 @@ m4/write.m4
 Depends-on:
 unistd
 raise           [test $REPLACE_WRITE = 1]
+msvc-nothrow    [test $REPLACE_WRITE = 1]
 
 configure.ac:
 gl_FUNC_WRITE
index 374de30..c1473d5 100644 (file)
@@ -28,6 +28,8 @@
 /* Get declarations of the Win32 API functions.  */
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
+/* Get _get_osfhandle.  */
+# include "msvc-nothrow.h"
 #endif
 
 #include "binary-io.h"
index 14cfaff..5cb45f5 100644 (file)
@@ -32,6 +32,8 @@
 /* Get declarations of the Win32 API functions.  */
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
+/* Get _get_osfhandle.  */
+# include "msvc-nothrow.h"
 #endif
 
 #if !O_BINARY
index 37454e9..a14807a 100644 (file)
@@ -36,6 +36,8 @@ SIGNATURE_CHECK (dup2, int, (int, int));
 /* Get declarations of the Win32 API functions.  */
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
+/* Get _get_osfhandle.  */
+# include "msvc-nothrow.h"
 #endif
 
 #include "macros.h"
index ed3a88f..033193d 100644 (file)
@@ -32,6 +32,8 @@ SIGNATURE_CHECK (dup3, int, (int, int, int));
 /* Get declarations of the Win32 API functions.  */
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
+/* Get _get_osfhandle.  */
+# include "msvc-nothrow.h"
 #endif
 
 #include "binary-io.h"
index 59b0077..c6066ea 100644 (file)
@@ -34,6 +34,8 @@ SIGNATURE_CHECK (fcntl, int, (int, int, ...));
 /* Get declarations of the Win32 API functions.  */
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
+/* Get _get_osfhandle.  */
+# include "msvc-nothrow.h"
 #endif
 
 #include "binary-io.h"
index 5302c3e..90f41f9 100644 (file)
@@ -29,6 +29,8 @@ SIGNATURE_CHECK (pipe, int, (int[2]));
 /* Get declarations of the Win32 API functions.  */
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
+/* Get _get_osfhandle.  */
+# include "msvc-nothrow.h"
 #endif
 
 #include "binary-io.h"
index d83162c..c278f7a 100644 (file)
@@ -29,6 +29,8 @@ SIGNATURE_CHECK (pipe2, int, (int[2], int));
 /* Get declarations of the Win32 API functions.  */
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
+/* Get _get_osfhandle.  */
+# include "msvc-nothrow.h"
 #endif
 
 #include "binary-io.h"