+static int writev_retry(int fd, struct iovec *iov, int iov_len)
+{
+ int len = 0;
+
+ do {
+ int cur_len = writev(fd, iov, iov_len);
+ if (cur_len < 0) {
+ switch(errno) {
+ case EAGAIN:
+ /* turn off non-blocking mode */
+ fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) &
+ ~O_NONBLOCK);
+ break;
+ case EINTR:
+ break;
+ default:
+ return -1;
+ }
+ continue;
+ }
+ len += cur_len;
+ while (cur_len >= iov->iov_len) {
+ cur_len -= iov->iov_len;
+ iov_len--;
+ iov++;
+ if (!cur_len || !iov_len)
+ return len;
+ }
+ iov->iov_len -= cur_len;
+ } while (1);
+}
+