Blame incoming.c

Packit 3adb1e
/* ====================================================================
Packit 3adb1e
 *    Licensed to the Apache Software Foundation (ASF) under one
Packit 3adb1e
 *    or more contributor license agreements.  See the NOTICE file
Packit 3adb1e
 *    distributed with this work for additional information
Packit 3adb1e
 *    regarding copyright ownership.  The ASF licenses this file
Packit 3adb1e
 *    to you under the Apache License, Version 2.0 (the
Packit 3adb1e
 *    "License"); you may not use this file except in compliance
Packit 3adb1e
 *    with the License.  You may obtain a copy of the License at
Packit 3adb1e
 *
Packit 3adb1e
 *      http://www.apache.org/licenses/LICENSE-2.0
Packit 3adb1e
 *
Packit 3adb1e
 *    Unless required by applicable law or agreed to in writing,
Packit 3adb1e
 *    software distributed under the License is distributed on an
Packit 3adb1e
 *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
Packit 3adb1e
 *    KIND, either express or implied.  See the License for the
Packit 3adb1e
 *    specific language governing permissions and limitations
Packit 3adb1e
 *    under the License.
Packit 3adb1e
 * ====================================================================
Packit 3adb1e
 */
Packit 3adb1e
Packit 3adb1e
#include <apr_pools.h>
Packit 3adb1e
#include <apr_poll.h>
Packit 3adb1e
#include <apr_version.h>
Packit 3adb1e
Packit 3adb1e
#include "serf.h"
Packit 3adb1e
#include "serf_bucket_util.h"
Packit 3adb1e
Packit 3adb1e
#include "serf_private.h"
Packit 3adb1e
Packit 3adb1e
static apr_status_t read_from_client(serf_incoming_t *client)
Packit 3adb1e
{
Packit 3adb1e
    return APR_ENOTIMPL;
Packit 3adb1e
}
Packit 3adb1e
Packit 3adb1e
static apr_status_t write_to_client(serf_incoming_t *client)
Packit 3adb1e
{
Packit 3adb1e
    return APR_ENOTIMPL;
Packit 3adb1e
}
Packit 3adb1e
Packit 3adb1e
apr_status_t serf__process_client(serf_incoming_t *client, apr_int16_t events)
Packit 3adb1e
{
Packit 3adb1e
    apr_status_t rv;
Packit 3adb1e
    if ((events & APR_POLLIN) != 0) {
Packit 3adb1e
        rv = read_from_client(client);
Packit 3adb1e
        if (rv) {
Packit 3adb1e
            return rv;
Packit 3adb1e
        }
Packit 3adb1e
    }
Packit 3adb1e
Packit 3adb1e
    if ((events & APR_POLLHUP) != 0) {
Packit 3adb1e
        return APR_ECONNRESET;
Packit 3adb1e
    }
Packit 3adb1e
Packit 3adb1e
    if ((events & APR_POLLERR) != 0) {
Packit 3adb1e
        return APR_EGENERAL;
Packit 3adb1e
    }
Packit 3adb1e
Packit 3adb1e
    if ((events & APR_POLLOUT) != 0) {
Packit 3adb1e
        rv = write_to_client(client);
Packit 3adb1e
        if (rv) {
Packit 3adb1e
            return rv;
Packit 3adb1e
        }
Packit 3adb1e
    }
Packit 3adb1e
Packit 3adb1e
    return APR_SUCCESS;
Packit 3adb1e
}
Packit 3adb1e
Packit 3adb1e
apr_status_t serf__process_listener(serf_listener_t *l)
Packit 3adb1e
{
Packit 3adb1e
    apr_status_t rv;
Packit 3adb1e
    apr_socket_t *in;
Packit 3adb1e
    apr_pool_t *p;
Packit 3adb1e
    /* THIS IS NOT OPTIMAL */
Packit 3adb1e
    apr_pool_create(&p, l->pool);
Packit 3adb1e
Packit 3adb1e
    rv = apr_socket_accept(&in, l->skt, p);
Packit 3adb1e
Packit 3adb1e
    if (rv) {
Packit 3adb1e
        apr_pool_destroy(p);
Packit 3adb1e
        return rv;
Packit 3adb1e
    }
Packit 3adb1e
Packit 3adb1e
    rv = l->accept_func(l->ctx, l, l->accept_baton, in, p);
Packit 3adb1e
Packit 3adb1e
    if (rv) {
Packit 3adb1e
        apr_pool_destroy(p);
Packit 3adb1e
        return rv;
Packit 3adb1e
    }
Packit 3adb1e
Packit 3adb1e
    return rv;
Packit 3adb1e
}
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
apr_status_t serf_incoming_create(
Packit 3adb1e
    serf_incoming_t **client,
Packit 3adb1e
    serf_context_t *ctx,
Packit 3adb1e
    apr_socket_t *insock,
Packit 3adb1e
    void *request_baton,
Packit 3adb1e
    serf_incoming_request_cb_t request,
Packit 3adb1e
    apr_pool_t *pool)
Packit 3adb1e
{
Packit 3adb1e
    apr_status_t rv;
Packit 3adb1e
    serf_incoming_t *ic = apr_palloc(pool, sizeof(*ic));
Packit 3adb1e
Packit 3adb1e
    ic->ctx = ctx;
Packit 3adb1e
    ic->baton.type = SERF_IO_CLIENT;
Packit 3adb1e
    ic->baton.u.client = ic;
Packit 3adb1e
    ic->request_baton =  request_baton;
Packit 3adb1e
    ic->request = request;
Packit 3adb1e
    ic->skt = insock;
Packit 3adb1e
    ic->desc.desc_type = APR_POLL_SOCKET;
Packit 3adb1e
    ic->desc.desc.s = ic->skt;
Packit 3adb1e
    ic->desc.reqevents = APR_POLLIN;
Packit 3adb1e
Packit 3adb1e
    rv = ctx->pollset_add(ctx->pollset_baton,
Packit 3adb1e
                         &ic->desc, &ic->baton);
Packit 3adb1e
    *client = ic;
Packit 3adb1e
Packit 3adb1e
    return rv;
Packit 3adb1e
}
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
apr_status_t serf_listener_create(
Packit 3adb1e
    serf_listener_t **listener,
Packit 3adb1e
    serf_context_t *ctx,
Packit 3adb1e
    const char *host,
Packit 3adb1e
    apr_uint16_t port,
Packit 3adb1e
    void *accept_baton,
Packit 3adb1e
    serf_accept_client_t accept,
Packit 3adb1e
    apr_pool_t *pool)
Packit 3adb1e
{
Packit 3adb1e
    apr_sockaddr_t *sa;
Packit 3adb1e
    apr_status_t rv;
Packit 3adb1e
    serf_listener_t *l = apr_palloc(pool, sizeof(*l));
Packit 3adb1e
Packit 3adb1e
    l->ctx = ctx;
Packit 3adb1e
    l->baton.type = SERF_IO_LISTENER;
Packit 3adb1e
    l->baton.u.listener = l;
Packit 3adb1e
    l->accept_func = accept;
Packit 3adb1e
    l->accept_baton = accept_baton;
Packit 3adb1e
Packit 3adb1e
    apr_pool_create(&l->pool, pool);
Packit 3adb1e
Packit 3adb1e
    rv = apr_sockaddr_info_get(&sa, host, APR_UNSPEC, port, 0, l->pool);
Packit 3adb1e
    if (rv)
Packit 3adb1e
        return rv;
Packit 3adb1e
Packit 3adb1e
    rv = apr_socket_create(&l->skt, sa->family,
Packit 3adb1e
                           SOCK_STREAM,
Packit 3adb1e
#if APR_MAJOR_VERSION > 0
Packit 3adb1e
                           APR_PROTO_TCP,
Packit 3adb1e
#endif
Packit 3adb1e
                           l->pool);
Packit 3adb1e
    if (rv)
Packit 3adb1e
        return rv;
Packit 3adb1e
Packit 3adb1e
    rv = apr_socket_opt_set(l->skt, APR_SO_REUSEADDR, 1);
Packit 3adb1e
    if (rv)
Packit 3adb1e
        return rv;
Packit 3adb1e
Packit 3adb1e
    rv = apr_socket_bind(l->skt, sa);
Packit 3adb1e
    if (rv)
Packit 3adb1e
        return rv;
Packit 3adb1e
Packit 3adb1e
    rv = apr_socket_listen(l->skt, 5);
Packit 3adb1e
    if (rv)
Packit 3adb1e
        return rv;
Packit 3adb1e
Packit 3adb1e
    l->desc.desc_type = APR_POLL_SOCKET;
Packit 3adb1e
    l->desc.desc.s = l->skt;
Packit 3adb1e
    l->desc.reqevents = APR_POLLIN;
Packit 3adb1e
Packit 3adb1e
    rv = ctx->pollset_add(ctx->pollset_baton,
Packit 3adb1e
                            &l->desc, &l->baton);
Packit 3adb1e
    if (rv)
Packit 3adb1e
        return rv;
Packit 3adb1e
Packit 3adb1e
    *listener = l;
Packit 3adb1e
Packit 3adb1e
    return APR_SUCCESS;
Packit 3adb1e
}