in modules/fcgid/fcgid_proc_unix.c [758:813]
apr_status_t proc_write_ipc(fcgid_ipc *ipc_handle,
apr_bucket_brigade *output_brigade)
{
apr_status_t rv;
struct iovec vec[FCGID_VEC_COUNT];
int nvec = 0;
apr_bucket *e;
apr_bucket_brigade *tmpbb = apr_brigade_create(output_brigade->p,
output_brigade->bucket_alloc);
while (!APR_BRIGADE_EMPTY(output_brigade))
{
apr_size_t len;
const char *base;
e = APR_BRIGADE_FIRST(output_brigade);
if (APR_BUCKET_IS_METADATA(e)) {
apr_bucket_delete(e);
continue;
}
if ((rv = apr_bucket_read(e, &base, &len,
APR_BLOCK_READ)) != APR_SUCCESS) {
ap_log_rerror(APLOG_MARK, APLOG_WARNING, rv, ipc_handle->request,
"mod_fcgid: can't read request from bucket");
return rv;
}
APR_BUCKET_REMOVE(e);
APR_BRIGADE_INSERT_TAIL(tmpbb, e);
vec[nvec].iov_len = len;
vec[nvec].iov_base = (char*) base;
if (nvec == (FCGID_VEC_COUNT - 1)) {
/* It's time to write now */
if ((rv =
writev_it_all(ipc_handle, vec,
FCGID_VEC_COUNT)) != APR_SUCCESS)
return rv;
nvec = 0;
apr_brigade_cleanup(tmpbb);
}
else
nvec++;
}
/* There are something left */
if (nvec != 0) {
if ((rv = writev_it_all(ipc_handle, vec, nvec)) != APR_SUCCESS)
return rv;
}
apr_brigade_destroy(tmpbb);
return APR_SUCCESS;
}