diff options
author | Ludovic Courtès <ludo@gnu.org> | 2011-10-22 16:24:32 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2011-10-22 16:24:32 +0200 |
commit | 35428fb6b2d269dbfa2eec7d0739aec149bd4cc2 (patch) | |
tree | 03146c5871ad9b2167f3dffc89fdbb3082d7fc4e /lib/write.c | |
parent | fe4ea6859e7d19a0fe2694a3fb49f4abb722afc1 (diff) | |
download | guile-35428fb6b2d269dbfa2eec7d0739aec149bd4cc2.tar.gz |
Update Gnulib to v0.0-6523-gb3609c1.
Diffstat (limited to 'lib/write.c')
-rw-r--r-- | lib/write.c | 56 |
1 files changed, 39 insertions, 17 deletions
diff --git a/lib/write.c b/lib/write.c index 3093df2d8..3941f29a4 100644 --- a/lib/write.c +++ b/lib/write.c @@ -20,35 +20,58 @@ /* Specification. */ #include <unistd.h> -/* Replace this function only if module 'nonblocking' or module 'sigpipe' is - requested. */ -#if GNULIB_NONBLOCKING || GNULIB_SIGPIPE - /* On native Windows platforms, SIGPIPE does not exist. When write() is called on a pipe with no readers, WriteFile() fails with error GetLastError() = ERROR_NO_DATA, and write() in consequence fails with error EINVAL. */ -# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +# include <errno.h> +# include <signal.h> +# include <io.h> + +# define WIN32_LEAN_AND_MEAN /* avoid including junk */ +# include <windows.h> + +# include "msvc-inval.h" +# include "msvc-nothrow.h" -# include <errno.h> -# include <signal.h> -# include <io.h> +# undef write + +# if HAVE_MSVC_INVALID_PARAMETER_HANDLER +static inline ssize_t +write_nothrow (int fd, const void *buf, size_t count) +{ + ssize_t result; + + TRY_MSVC_INVAL + { + result = write (fd, buf, count); + } + CATCH_MSVC_INVAL + { + result = -1; + errno = EBADF; + } + DONE_MSVC_INVAL; -# define WIN32_LEAN_AND_MEAN /* avoid including junk */ -# include <windows.h> + return result; +} +# else +# define write_nothrow write +# endif ssize_t rpl_write (int fd, const void *buf, size_t count) -#undef write { for (;;) { - ssize_t ret = write (fd, buf, count); + ssize_t ret = write_nothrow (fd, buf, count); if (ret < 0) { -# if GNULIB_NONBLOCKING +# if GNULIB_NONBLOCKING if (errno == ENOSPC) { HANDLE h = (HANDLE) _get_osfhandle (fd); @@ -99,9 +122,9 @@ rpl_write (int fd, const void *buf, size_t count) } } else -# endif +# endif { -# if GNULIB_SIGPIPE +# if GNULIB_SIGPIPE if (GetLastError () == ERROR_NO_DATA && GetFileType ((HANDLE) _get_osfhandle (fd)) == FILE_TYPE_PIPE) @@ -112,12 +135,11 @@ rpl_write (int fd, const void *buf, size_t count) EINVAL to EPIPE. */ errno = EPIPE; } -# endif +# endif } } return ret; } } -# endif #endif |