changeset 364:d9031d3b5944

(safe_read): Get this function from gcc's cccp.c.
author Jim Meyering <jim@meyering.net>
date Sat, 10 Dec 1994 22:00:12 +0000
parents ec4b36233380
children dca9a1bd7ae4
files lib/safe-read.c
diffstat 1 files changed, 23 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/lib/safe-read.c
+++ b/lib/safe-read.c
@@ -31,30 +31,35 @@
 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.  */
+/* 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.  */
 
-int
+   The canonical source for this function is in the gcc distribution
+   in file cccp.c.  So don't make any changes here.  */
+
+static int
 safe_read (desc, ptr, len)
      int desc;
      char *ptr;
      int len;
 {
-  int n_chars;
-
-  if (len <= 0)
-    return len;
-
+  int left = len;
+  while (left > 0) {
+    int nchars = read (desc, ptr, left);
+    if (nchars < 0)
+      {
 #ifdef EINTR
-  do
-    {
-      n_chars = read (desc, ptr, len);
-    }
-  while (n_chars < 0 && errno == EINTR);
-#else
-  n_chars = read (desc, ptr, len);
+	if (errno == EINTR)
+	  continue;
 #endif
-
-  return n_chars;
+	return nchars;
+      }
+    if (nchars == 0)
+      break;
+    ptr += nchars;
+    left -= nchars;
+  }
+  return len - left;
 }