readn.c 645 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. /* include readn */
  2. #include "unp.h"
  3. ssize_t /* Read "n" bytes from a descriptor. */
  4. readn(int fd, void *vptr, size_t n)
  5. {
  6. size_t nleft;
  7. ssize_t nread;
  8. char *ptr;
  9. ptr = vptr;
  10. nleft = n;
  11. while (nleft > 0) {
  12. if ( (nread = read(fd, ptr, nleft)) < 0) {
  13. if (errno == EINTR)
  14. nread = 0; /* and call read() again */
  15. else
  16. return(-1);
  17. } else if (nread == 0)
  18. break; /* EOF */
  19. nleft -= nread;
  20. ptr += nread;
  21. }
  22. return(n - nleft); /* return >= 0 */
  23. }
  24. /* end readn */
  25. ssize_t
  26. Readn(int fd, void *ptr, size_t nbytes)
  27. {
  28. ssize_t n;
  29. if ( (n = readn(fd, ptr, nbytes)) < 0)
  30. err_sys("readn error");
  31. return(n);
  32. }