posix_writev_all.cpp 856 B

1234567891011121314151617181920212223242526272829303132333435
  1. //
  2. // $Id$
  3. //
  4. #include<__vic/posix/iov.h>
  5. #include<__vic/throw_errno.h>
  6. #include<cassert>
  7. #include<cerrno>
  8. namespace __vic { namespace posix {
  9. //----------------------------------------------------------------------------
  10. void writev_all(int fd, ::iovec *v, unsigned v_len, size_t total_bytes)
  11. {
  12. assert(total_bytes == total(v, v_len));
  13. for(;;)
  14. {
  15. ssize_t n = ::writev(fd, v, v_len);
  16. if(n < 0)
  17. {
  18. int err = errno;
  19. if(err != EINTR) throw_errno("writev", err);
  20. // Interrupted by signal. Nothing was written. Try againg
  21. }
  22. else // n >= 0
  23. {
  24. if(static_cast<size_t>(n) == total_bytes) break; // all done
  25. cut_prefix(v, v_len, n);
  26. }
  27. }
  28. }
  29. //----------------------------------------------------------------------------
  30. }} // namespace