/* readn.c - from Stevens, modified so as not to depend on other files*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

extern int errno;

ssize_t				/* Read "n" bytes from a descriptor. */
readn(int fd, void *vptr, size_t n)
{
  size_t   nleft = n;
  ssize_t  nread;
  char	   *ptr = vptr;
  
  while (nleft > 0) {
    if ( (nread = read(fd, ptr, nleft)) < 0) {
      if (errno == EINTR)
	nread = 0;		/* and call read() again */
      else
	return(-1);
    } else if (nread == 0)
      break;			/* EOF */
    
    nleft -= nread;
    ptr   += nread;
  }
  return(n - nleft);		/* return >= 0 */
}
/* end readn */

ssize_t
Readn(int fd, void *ptr, size_t nbytes)
{
  ssize_t		n;
  
  if ( (n = readn(fd, ptr, nbytes)) < 0) {
    fprintf(stderr, "readn error`: %s\n", strerror(errno));
    exit(0);
  }
  return(n);
}
