summaryrefslogtreecommitdiff
path: root/lib/safe-read.c
blob: d915d4e7ccce9fefac2de3db699df24758f6261a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/* Read LEN bytes at PTR from descriptor DESC, retrying if necessary.
   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;
{
  int n_remaining;

  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;
    }
  return len - n_remaining;
}