posix_file_write.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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. void file::write_all(int fd, const void *buf, size_t count)
  10. {
  11. for(;;)
  12. {
  13. ssize_t n = ::write(fd, buf, count);
  14. if(n >= 0)
  15. {
  16. if(static_cast<size_t>(n) == count) return;
  17. // Assert: n < count
  18. buf = static_cast<const char *>(buf) + n;
  19. count -= n;
  20. }
  21. else
  22. {
  23. int err = errno;
  24. if(err != EINTR) throw_errno("write", err);
  25. }
  26. }
  27. }
  28. //----------------------------------------------------------------------------
  29. size_t file::write_all_nt(int fd, const void *buf, size_t count) noexcept
  30. {
  31. size_t res = 0;
  32. for(;;)
  33. {
  34. ssize_t n = ::write(fd, buf, count);
  35. if(n >= 0)
  36. {
  37. res += n;
  38. if(static_cast<size_t>(n) == count) break;
  39. // Assert: n < count
  40. buf = static_cast<const char *>(buf) + n;
  41. count -= n;
  42. }
  43. else
  44. if(errno != EINTR) break;
  45. }
  46. return res;
  47. }
  48. //----------------------------------------------------------------------------
  49. }} // namespace