X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fsafe-read.c;h=93d35e4fa6e3975bc11596fb9ed92fb761d5f83d;hb=9ac91c30e0cb147b7cc062454e37b1e0ee7bb057;hp=d915d4e7ccce9fefac2de3db699df24758f6261a;hpb=811a26c818092d4888dafb6f07967b341ae7b8d6;p=gnulib.git diff --git a/lib/safe-read.c b/lib/safe-read.c index d915d4e7c..93d35e4fa 100644 --- a/lib/safe-read.c +++ b/lib/safe-read.c @@ -1,4 +1,37 @@ -/* Read LEN bytes at PTR from descriptor DESC, retrying if necessary. +/* safe-read.c -- an interface to read that retries after interrupts + Copyright (C) 1993, 1994 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include +#ifndef errno +extern int errno; +#endif + +/* Read LEN bytes at PTR from descriptor DESC, retrying if interrupted. Return the actual number of bytes read, zero for EOF, or negative for an error. */ @@ -8,24 +41,20 @@ safe_read (desc, ptr, len) char *ptr; int len; { - int n_remaining; + int n_chars; + + if (len <= 0) + return len; - n_remaining = len; - while (n_remaining > 0) - { - int n_chars = read (desc, ptr, n_remaining); - if (n_chars < 0) - { #ifdef EINTR - if (errno == EINTR) - continue; -#endif - return n_chars; - } - if (n_chars == 0) - break; - ptr += n_chars; - n_remaining -= n_chars; + do + { + n_chars = read (desc, ptr, len); } - return len - n_remaining; + while (n_chars < 0 && errno == EINTR); +#else + n_chars = read (desc, ptr, len); +#endif + + return n_chars; }