static apr_status_t fcgid_feed_data()

in modules/fcgid/fcgid_bucket.c [23:56]


static apr_status_t fcgid_feed_data(fcgid_bucket_ctx * ctx,
                                    apr_bucket_alloc_t * bucketalloc,
                                    char **buffer, apr_size_t * bufferlen)
{
    apr_status_t rv;

    if (!ctx->buffer) {
        *buffer = apr_bucket_alloc(FCGID_FEED_LEN, bucketalloc);

        *bufferlen = FCGID_FEED_LEN;
        if ((rv =
             proc_read_ipc(&ctx->ipc, *buffer,
                           bufferlen)) != APR_SUCCESS) {
            ctx->has_error = 1;
            apr_bucket_free(*buffer);
            return rv;
        }

        ctx->buffer =
            apr_bucket_heap_create(*buffer, FCGID_FEED_LEN,
                                   apr_bucket_free, bucketalloc);
        if (*bufferlen != FCGID_FEED_LEN) {
            apr_bucket *buckettmp;

            apr_bucket_split(ctx->buffer, *bufferlen);
            buckettmp = APR_BUCKET_NEXT(ctx->buffer);
            apr_bucket_delete(buckettmp);
        }
    } else {
        apr_bucket_read(ctx->buffer, (const char **) buffer, bufferlen,
                        APR_BLOCK_READ);
    }
    return APR_SUCCESS;
}