changeset 371:2f5dae439e46

See log in textutils/lib/.
author Jim Meyering <jim@meyering.net>
date Sun, 08 Jan 1995 19:33:34 +0000
parents 7e56070e27b2
children 066ee41f8e97
files lib/safe-read.c
diffstat 1 files changed, 19 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/lib/safe-read.c
+++ b/lib/safe-read.c
@@ -27,39 +27,34 @@
 #endif
 
 #include <errno.h>
-#ifndef STDC_HEADERS
+#ifndef errno
 extern int errno;
 #endif
 
-/* Read LEN bytes at PTR from descriptor DESC, for file FILENAME,
-   retrying if necessary.  Return a negative value if an error occurs,
-   otherwise return the actual number of bytes read,
-   which must be LEN unless end-of-file was reached.  */
+/* 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.  */
 
-   The canonical source for this function is in the gcc distribution
-   in file cccp.c.  So don't make any changes here.  */
-
-static int
+int
 safe_read (desc, ptr, len)
      int desc;
      char *ptr;
      int len;
 {
-  int left = len;
-  while (left > 0) {
-    int nchars = read (desc, ptr, left);
-    if (nchars < 0)
-      {
+  int n_chars;
+
+  if (len <= 0)
+    return len;
+
 #ifdef EINTR
-	if (errno == EINTR)
-	  continue;
+  do
+    {
+      n_chars = read (desc, ptr, len);
+    }
+  while (n_chars < 0 && errno == EINTR);
+#else
+  n_chars = read (desc, ptr, len);
 #endif
-	return nchars;
-      }
-    if (nchars == 0)
-      break;
-    ptr += nchars;
-    left -= nchars;
-  }
-  return len - left;
+
+  return n_chars;
 }