Annotation of embedaddon/libiconv/srclib/read.c, revision 1.1.1.1

1.1       misho       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: 
                     34: ssize_t
                     35: rpl_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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>