apr_status_t proc_write_ipc()

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;
}