| 796 | } |
| 797 | |
| 798 | int32_t proxy_link_send(int32_t sd, struct iovec *iov, int32_t count) |
| 799 | { |
| 800 | struct iovec iov_copy[count]; |
| 801 | ssize_t len; |
| 802 | int32_t total; |
| 803 | |
| 804 | memcpy(iov_copy, iov, sizeof(struct iovec) * count); |
| 805 | iov = iov_copy; |
| 806 | |
| 807 | total = 0; |
| 808 | while (count > 0) { |
| 809 | len = writev(sd, iov, count); |
| 810 | if (len < 0) { |
| 811 | return proxy_log(LOG_ERR, errno, "Failed to send data"); |
| 812 | } |
| 813 | if (len == 0) { |
| 814 | return proxy_log(LOG_ERR, ENOBUFS, "Partial write"); |
| 815 | } |
| 816 | total += len; |
| 817 | |
| 818 | while ((count > 0) && (iov->iov_len <= len)) { |
| 819 | len -= iov->iov_len; |
| 820 | iov++; |
| 821 | count--; |
| 822 | } |
| 823 | |
| 824 | if (count > 0) { |
| 825 | iov->iov_base = (char *)iov->iov_base + len; |
| 826 | iov->iov_len -= len; |
| 827 | } |
| 828 | } |
| 829 | |
| 830 | return total; |
| 831 | } |
| 832 | |
| 833 | int32_t proxy_link_recv(int32_t sd, struct iovec *iov, int32_t count) |
| 834 | { |
no test coverage detected