in modules/fcgid/fcgid_proc_unix.c [715:755]
static apr_status_t writev_it_all(fcgid_ipc *ipc_handle,
struct iovec *vec, int nvec)
{
apr_size_t bytes_written = 0;
apr_status_t rv;
apr_size_t len = 0;
int i = 0;
int writecnt = 0;
/* Calculate the total size */
for (i = 0; i < nvec; i++) {
len += vec[i].iov_len;
}
i = 0;
while (bytes_written != len) {
rv = socket_writev(ipc_handle, vec + i, nvec - i, &writecnt);
if (rv != APR_SUCCESS)
return rv;
bytes_written += writecnt;
if (bytes_written < len) {
/* Skip over the vectors that have already been written */
apr_size_t cnt = vec[i].iov_len;
while (writecnt >= cnt && i + 1 < nvec) {
i++;
cnt += vec[i].iov_len;
}
if (writecnt < cnt) {
/* Handle partial write of vec i */
vec[i].iov_base = (char *) vec[i].iov_base +
(vec[i].iov_len - (cnt - writecnt));
vec[i].iov_len = cnt - writecnt;
}
}
}
return APR_SUCCESS;
}