See log in textutils/lib/.
authorJim Meyering <jim@meyering.net>
Sun, 8 Jan 1995 19:33:34 +0000 (19:33 +0000)
committerJim Meyering <jim@meyering.net>
Sun, 8 Jan 1995 19:33:34 +0000 (19:33 +0000)
lib/safe-read.c

index 7fd4415..93d35e4 100644 (file)
 #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;
 }