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

1.1       misho       1: /* POSIX compatible read() function.
1.1.1.2 ! misho       2:    Copyright (C) 2008-2019 Free Software Foundation, Inc.
1.1       misho       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
1.1.1.2 ! misho      16:    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
1.1       misho      17: 
                     18: #include <config.h>
                     19: 
                     20: /* Specification.  */
                     21: #include <unistd.h>
                     22: 
1.1.1.2 ! misho      23: #if defined _WIN32 && ! defined __CYGWIN__
1.1       misho      24: 
1.1.1.2 ! misho      25: # include <errno.h>
        !            26: # include <io.h>
1.1       misho      27: 
1.1.1.2 ! misho      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
1.1       misho      37: #  include <io.h>
1.1.1.2 ! misho      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;
1.1       misho      58: 
1.1.1.2 ! misho      59:   return result;
        !            60: }
        !            61: # else
        !            62: #  define read_nothrow read
        !            63: # endif
1.1       misho      64: 
                     65: ssize_t
                     66: rpl_read (int fd, void *buf, size_t count)
                     67: {
1.1.1.2 ! misho      68:   ssize_t ret = read_nothrow (fd, buf, count);
1.1       misho      69: 
1.1.1.2 ! misho      70: # if GNULIB_NONBLOCKING
1.1       misho      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:     }
1.1.1.2 ! misho      86: # endif
        !            87: 
1.1       misho      88:   return ret;
                     89: }
                     90: 
                     91: #endif

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