X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fsafe-read.c;h=e404586c75fe9b31c2153473111606d8d04d7fd1;hb=27646e67c4e73f21d438d0161797386ff36bb04a;hp=d915d4e7ccce9fefac2de3db699df24758f6261a;hpb=811a26c818092d4888dafb6f07967b341ae7b8d6;p=gnulib.git diff --git a/lib/safe-read.c b/lib/safe-read.c index d915d4e7c..e404586c7 100644 --- a/lib/safe-read.c +++ b/lib/safe-read.c @@ -1,31 +1,59 @@ -/* 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, 1998 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include + +#if HAVE_UNISTD_H +# include +#endif + +#include +#ifndef errno +extern int errno; +#endif + +#include "safe-read.h" + +/* 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. */ -int -safe_read (desc, ptr, len) - int desc; - char *ptr; - int len; +ssize_t +safe_read (int desc, void *ptr, size_t len) { - int n_remaining; + ssize_t 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; }