X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fread.c;h=d130e311ceefeb7bfb170e1ada5a2d2259d6d339;hb=96f023c5e537dd4afbdb294de7065f65effe3eb2;hp=61675af0ddbfeb9e3a6a7aa62129e5aef4f72617;hpb=9b604b4cbfad7422bacc1c723df1d027b6a7c738;p=gnulib.git diff --git a/lib/read.c b/lib/read.c index 61675af0d..d130e311c 100644 --- a/lib/read.c +++ b/lib/read.c @@ -1,5 +1,5 @@ /* POSIX compatible read() function. - Copyright (C) 2008-2011 Free Software Foundation, Inc. + Copyright (C) 2008-2012 Free Software Foundation, Inc. Written by Bruno Haible , 2011. This program is free software: you can redistribute it and/or modify @@ -20,25 +20,48 @@ /* Specification. */ #include -/* Replace this function only if module 'nonblocking' is requested. */ -#if GNULIB_NONBLOCKING +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ -# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +# include +# include -# include -# include +# define WIN32_LEAN_AND_MEAN /* avoid including junk */ +# include -# define WIN32_LEAN_AND_MEAN /* avoid including junk */ -# include +# include "msvc-inval.h" +# include "msvc-nothrow.h" -# include "msvc-nothrow.h" +# undef read + +# if HAVE_MSVC_INVALID_PARAMETER_HANDLER +static inline ssize_t +read_nothrow (int fd, void *buf, size_t count) +{ + ssize_t result; + + TRY_MSVC_INVAL + { + result = read (fd, buf, count); + } + CATCH_MSVC_INVAL + { + result = -1; + errno = EBADF; + } + DONE_MSVC_INVAL; + + return result; +} +# else +# define read_nothrow read +# endif ssize_t rpl_read (int fd, void *buf, size_t count) -#undef read { - ssize_t ret = read (fd, buf, count); + ssize_t ret = read_nothrow (fd, buf, count); +# if GNULIB_NONBLOCKING if (ret < 0 && GetLastError () == ERROR_NO_DATA) { @@ -54,8 +77,9 @@ rpl_read (int fd, void *buf, size_t count) errno = EAGAIN; } } +# endif + return ret; } -# endif #endif