1/* POSIX compatible read() function. 2 Copyright (C) 2008-2011 Free Software Foundation, Inc. 3 Written by Bruno Haible <bruno@clisp.org>, 2011. 4 5 This program is free software: you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 18#include <config.h> 19 20/* Specification. */ 21#include <unistd.h> 22 23/* Replace this function only if module 'nonblocking' is requested. */ 24#if GNULIB_NONBLOCKING 25 26# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ 27 28# include <errno.h> 29# include <io.h> 30 31# define WIN32_LEAN_AND_MEAN /* avoid including junk */ 32# include <windows.h> 33 34ssize_t 35rpl_read (int fd, void *buf, size_t count) 36#undef read 37{ 38 ssize_t ret = read (fd, buf, count); 39 40 if (ret < 0 41 && GetLastError () == ERROR_NO_DATA) 42 { 43 HANDLE h = (HANDLE) _get_osfhandle (fd); 44 if (GetFileType (h) == FILE_TYPE_PIPE) 45 { 46 /* h is a pipe or socket. */ 47 DWORD state; 48 if (GetNamedPipeHandleState (h, &state, NULL, NULL, NULL, NULL, 0) 49 && (state & PIPE_NOWAIT) != 0) 50 /* h is a pipe in non-blocking mode. 51 Change errno from EINVAL to EAGAIN. */ 52 errno = EAGAIN; 53 } 54 } 55 return ret; 56} 57 58# endif 59#endif 60