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

1.1       misho       1: /* An interface to read and write that retries after interrupts.
                      2: 
1.1.1.2 ! misho       3:    Copyright (C) 1993-1994, 1998, 2002-2006, 2009-2019 Free Software
1.1       misho       4:    Foundation, Inc.
                      5: 
                      6:    This program is free software: you can redistribute it and/or modify
                      7:    it under the terms of the GNU General Public License as published by
                      8:    the Free Software Foundation; either version 3 of the License, or
                      9:    (at your option) any later version.
                     10: 
                     11:    This program is distributed in the hope that it will be useful,
                     12:    but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14:    GNU General Public License for more details.
                     15: 
                     16:    You should have received a copy of the GNU General Public License
1.1.1.2 ! misho      17:    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
1.1       misho      18: 
                     19: #include <config.h>
                     20: 
                     21: /* Specification.  */
                     22: #ifdef SAFE_WRITE
                     23: # include "safe-write.h"
                     24: #else
                     25: # include "safe-read.h"
                     26: #endif
                     27: 
                     28: /* Get ssize_t.  */
                     29: #include <sys/types.h>
                     30: #include <unistd.h>
                     31: 
                     32: #include <errno.h>
                     33: 
                     34: #ifdef EINTR
                     35: # define IS_EINTR(x) ((x) == EINTR)
                     36: #else
                     37: # define IS_EINTR(x) 0
                     38: #endif
                     39: 
1.1.1.2 ! misho      40: #include "sys-limits.h"
1.1       misho      41: 
                     42: #ifdef SAFE_WRITE
                     43: # define safe_rw safe_write
                     44: # define rw write
                     45: #else
                     46: # define safe_rw safe_read
                     47: # define rw read
                     48: # undef const
                     49: # define const /* empty */
                     50: #endif
                     51: 
                     52: /* Read(write) up to COUNT bytes at BUF from(to) descriptor FD, retrying if
                     53:    interrupted.  Return the actual number of bytes read(written), zero for EOF,
                     54:    or SAFE_READ_ERROR(SAFE_WRITE_ERROR) upon error.  */
                     55: size_t
                     56: safe_rw (int fd, void const *buf, size_t count)
                     57: {
                     58:   for (;;)
                     59:     {
                     60:       ssize_t result = rw (fd, buf, count);
                     61: 
                     62:       if (0 <= result)
                     63:         return result;
                     64:       else if (IS_EINTR (errno))
                     65:         continue;
1.1.1.2 ! misho      66:       else if (errno == EINVAL && SYS_BUFSIZE_MAX < count)
        !            67:         count = SYS_BUFSIZE_MAX;
1.1       misho      68:       else
                     69:         return result;
                     70:     }
                     71: }

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