File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libiconv / srclib / read.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 13:38:46 2021 UTC (3 years, 3 months ago) by misho
Branches: libiconv, MAIN
CVS tags: v1_16p0, HEAD
libiconv 1.16

    1: /* POSIX compatible read() function.
    2:    Copyright (C) 2008-2019 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 <https://www.gnu.org/licenses/>.  */
   17: 
   18: #include <config.h>
   19: 
   20: /* Specification.  */
   21: #include <unistd.h>
   22: 
   23: #if defined _WIN32 && ! defined __CYGWIN__
   24: 
   25: # include <errno.h>
   26: # include <io.h>
   27: 
   28: # define WIN32_LEAN_AND_MEAN  /* avoid including junk */
   29: # include <windows.h>
   30: 
   31: # if HAVE_MSVC_INVALID_PARAMETER_HANDLER
   32: #  include "msvc-inval.h"
   33: # endif
   34: # if GNULIB_MSVC_NOTHROW
   35: #  include "msvc-nothrow.h"
   36: # else
   37: #  include <io.h>
   38: # endif
   39: 
   40: # undef read
   41: 
   42: # if HAVE_MSVC_INVALID_PARAMETER_HANDLER
   43: static ssize_t
   44: read_nothrow (int fd, void *buf, size_t count)
   45: {
   46:   ssize_t result;
   47: 
   48:   TRY_MSVC_INVAL
   49:     {
   50:       result = read (fd, buf, count);
   51:     }
   52:   CATCH_MSVC_INVAL
   53:     {
   54:       result = -1;
   55:       errno = EBADF;
   56:     }
   57:   DONE_MSVC_INVAL;
   58: 
   59:   return result;
   60: }
   61: # else
   62: #  define read_nothrow read
   63: # endif
   64: 
   65: ssize_t
   66: rpl_read (int fd, void *buf, size_t count)
   67: {
   68:   ssize_t ret = read_nothrow (fd, buf, count);
   69: 
   70: # if GNULIB_NONBLOCKING
   71:   if (ret < 0
   72:       && GetLastError () == ERROR_NO_DATA)
   73:     {
   74:       HANDLE h = (HANDLE) _get_osfhandle (fd);
   75:       if (GetFileType (h) == FILE_TYPE_PIPE)
   76:         {
   77:           /* h is a pipe or socket.  */
   78:           DWORD state;
   79:           if (GetNamedPipeHandleState (h, &state, NULL, NULL, NULL, NULL, 0)
   80:               && (state & PIPE_NOWAIT) != 0)
   81:             /* h is a pipe in non-blocking mode.
   82:                Change errno from EINVAL to EAGAIN.  */
   83:             errno = EAGAIN;
   84:         }
   85:     }
   86: # endif
   87: 
   88:   return ret;
   89: }
   90: 
   91: #endif

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