posix_file_read.cpp 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. //
  2. // $Id$
  3. //
  4. #include<__vic/posix/file.h>
  5. #include<__vic/throw_errno.h>
  6. #include<cerrno>
  7. namespace __vic { namespace posix {
  8. //----------------------------------------------------------------------------
  9. size_t file::read_max(int fd, void *buf, size_t count)
  10. {
  11. size_t res = 0;
  12. for(;;)
  13. {
  14. ssize_t n = ::read(fd, buf, count);
  15. if(n > 0)
  16. {
  17. res += n;
  18. if(static_cast<size_t>(n) == count) break;
  19. buf = static_cast<char *>(buf) + n;
  20. count -= n;
  21. }
  22. else if(n == 0) break;
  23. else // n < 0
  24. {
  25. int err = errno;
  26. if(err != EINTR) throw_errno("read", err);
  27. }
  28. }
  29. return res;
  30. }
  31. //----------------------------------------------------------------------------
  32. size_t file::read_some(int fd, void *buf, size_t count)
  33. {
  34. for(;;)
  35. {
  36. ssize_t n = ::read(fd, buf, count);
  37. if(n >= 0) return n;
  38. // Assert: n < 0
  39. int err = errno;
  40. if(err != EINTR) throw_errno("read", err);
  41. // Interrupted by signal. Try again
  42. }
  43. }
  44. //----------------------------------------------------------------------------
  45. }} // namespace