static apr_status_t serf_event_read_iovec()

in buckets/event_buckets.c [104:153]


static apr_status_t serf_event_read_iovec(serf_bucket_t *bucket,
                                          apr_size_t requested,
                                          int vecs_size,
                                          struct iovec *vecs,
                                          int *vecs_used)
{
    event_context_t *ctx = bucket->data;
    apr_status_t status;

    if (ctx->start_cb) {
        status = ctx->start_cb(ctx->baton, ctx->bytes_read);
        ctx->start_cb = NULL;

        if (SERF_BUCKET_READ_ERROR(status))
            return status;
    }

    if (ctx->stream && !ctx->at_eof) {
        status = serf_bucket_read_iovec(ctx->stream, requested, vecs_size,
                                        vecs, vecs_used);
    }
    else {
        status = APR_EOF;
        *vecs_used = 0;

        if (ctx->at_eof && ctx->stream) {
            serf_bucket_destroy(ctx->stream);
            ctx->stream = NULL;
        }
    }

    if (!SERF_BUCKET_READ_ERROR(status)) {
        int i;

        for (i = 0; i < *vecs_used; i++)
            ctx->bytes_read += vecs[i].iov_len;

        if (APR_STATUS_IS_EOF(status)) {
            ctx->at_eof = true;

            if (ctx->eof_cb) {
                status = ctx->eof_cb(ctx->baton, ctx->bytes_read);
                ctx->eof_cb = NULL;
                status = SERF_BUCKET_READ_ERROR(status) ? status : APR_EOF;
            }
        }
    }

    return status;
}