1362181Sdim/* ==================================================================== 2362181Sdim * Licensed to the Apache Software Foundation (ASF) under one 3362181Sdim * or more contributor license agreements. See the NOTICE file 4362181Sdim * distributed with this work for additional information 5362181Sdim * regarding copyright ownership. The ASF licenses this file 6362181Sdim * to you under the Apache License, Version 2.0 (the 7362181Sdim * "License"); you may not use this file except in compliance 8362181Sdim * with the License. You may obtain a copy of the License at 9251877Speter * 10362181Sdim * http://www.apache.org/licenses/LICENSE-2.0 11251877Speter * 12362181Sdim * Unless required by applicable law or agreed to in writing, 13362181Sdim * software distributed under the License is distributed on an 14362181Sdim * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15362181Sdim * KIND, either express or implied. See the License for the 16362181Sdim * specific language governing permissions and limitations 17362181Sdim * under the License. 18362181Sdim * ==================================================================== 19251877Speter */ 20251877Speter 21251877Speter#include <apr_pools.h> 22251877Speter#include <apr_poll.h> 23251877Speter#include <apr_version.h> 24251877Speter 25251877Speter#include "serf.h" 26251877Speter#include "serf_bucket_util.h" 27251877Speter 28251877Speter#include "serf_private.h" 29251877Speter 30251877Speterstatic apr_status_t read_from_client(serf_incoming_t *client) 31251877Speter{ 32251877Speter return APR_ENOTIMPL; 33251877Speter} 34251877Speter 35251877Speterstatic apr_status_t write_to_client(serf_incoming_t *client) 36251877Speter{ 37251877Speter return APR_ENOTIMPL; 38251877Speter} 39251877Speter 40251877Speterapr_status_t serf__process_client(serf_incoming_t *client, apr_int16_t events) 41251877Speter{ 42251877Speter apr_status_t rv; 43251877Speter if ((events & APR_POLLIN) != 0) { 44251877Speter rv = read_from_client(client); 45251877Speter if (rv) { 46251877Speter return rv; 47251877Speter } 48251877Speter } 49251877Speter 50251877Speter if ((events & APR_POLLHUP) != 0) { 51251877Speter return APR_ECONNRESET; 52251877Speter } 53251877Speter 54251877Speter if ((events & APR_POLLERR) != 0) { 55251877Speter return APR_EGENERAL; 56251877Speter } 57251877Speter 58251877Speter if ((events & APR_POLLOUT) != 0) { 59251877Speter rv = write_to_client(client); 60251877Speter if (rv) { 61251877Speter return rv; 62251877Speter } 63251877Speter } 64251877Speter 65251877Speter return APR_SUCCESS; 66251877Speter} 67251877Speter 68251877Speterapr_status_t serf__process_listener(serf_listener_t *l) 69251877Speter{ 70251877Speter apr_status_t rv; 71251877Speter apr_socket_t *in; 72251877Speter apr_pool_t *p; 73251877Speter /* THIS IS NOT OPTIMAL */ 74251877Speter apr_pool_create(&p, l->pool); 75251877Speter 76251877Speter rv = apr_socket_accept(&in, l->skt, p); 77251877Speter 78251877Speter if (rv) { 79251877Speter apr_pool_destroy(p); 80251877Speter return rv; 81251877Speter } 82251877Speter 83251877Speter rv = l->accept_func(l->ctx, l, l->accept_baton, in, p); 84251877Speter 85251877Speter if (rv) { 86251877Speter apr_pool_destroy(p); 87251877Speter return rv; 88251877Speter } 89251877Speter 90251877Speter return rv; 91251877Speter} 92251877Speter 93251877Speter 94251877Speterapr_status_t serf_incoming_create( 95251877Speter serf_incoming_t **client, 96251877Speter serf_context_t *ctx, 97251877Speter apr_socket_t *insock, 98251877Speter void *request_baton, 99251877Speter serf_incoming_request_cb_t request, 100251877Speter apr_pool_t *pool) 101251877Speter{ 102251877Speter apr_status_t rv; 103251877Speter serf_incoming_t *ic = apr_palloc(pool, sizeof(*ic)); 104251877Speter 105251877Speter ic->ctx = ctx; 106251877Speter ic->baton.type = SERF_IO_CLIENT; 107251877Speter ic->baton.u.client = ic; 108251877Speter ic->request_baton = request_baton; 109251877Speter ic->request = request; 110251877Speter ic->skt = insock; 111251877Speter ic->desc.desc_type = APR_POLL_SOCKET; 112251877Speter ic->desc.desc.s = ic->skt; 113251877Speter ic->desc.reqevents = APR_POLLIN; 114251877Speter 115251877Speter rv = ctx->pollset_add(ctx->pollset_baton, 116251877Speter &ic->desc, &ic->baton); 117251877Speter *client = ic; 118251877Speter 119251877Speter return rv; 120251877Speter} 121251877Speter 122251877Speter 123251877Speterapr_status_t serf_listener_create( 124251877Speter serf_listener_t **listener, 125251877Speter serf_context_t *ctx, 126251877Speter const char *host, 127251877Speter apr_uint16_t port, 128251877Speter void *accept_baton, 129251877Speter serf_accept_client_t accept, 130251877Speter apr_pool_t *pool) 131251877Speter{ 132251877Speter apr_sockaddr_t *sa; 133251877Speter apr_status_t rv; 134251877Speter serf_listener_t *l = apr_palloc(pool, sizeof(*l)); 135251877Speter 136251877Speter l->ctx = ctx; 137251877Speter l->baton.type = SERF_IO_LISTENER; 138251877Speter l->baton.u.listener = l; 139251877Speter l->accept_func = accept; 140251877Speter l->accept_baton = accept_baton; 141251877Speter 142251877Speter apr_pool_create(&l->pool, pool); 143251877Speter 144251877Speter rv = apr_sockaddr_info_get(&sa, host, APR_UNSPEC, port, 0, l->pool); 145251877Speter if (rv) 146251877Speter return rv; 147251877Speter 148251877Speter rv = apr_socket_create(&l->skt, sa->family, 149251877Speter SOCK_STREAM, 150251877Speter#if APR_MAJOR_VERSION > 0 151251877Speter APR_PROTO_TCP, 152251877Speter#endif 153251877Speter l->pool); 154251877Speter if (rv) 155251877Speter return rv; 156251877Speter 157251877Speter rv = apr_socket_opt_set(l->skt, APR_SO_REUSEADDR, 1); 158251877Speter if (rv) 159251877Speter return rv; 160253895Speter 161251877Speter rv = apr_socket_bind(l->skt, sa); 162251877Speter if (rv) 163251877Speter return rv; 164251877Speter 165251877Speter rv = apr_socket_listen(l->skt, 5); 166251877Speter if (rv) 167251877Speter return rv; 168251877Speter 169251877Speter l->desc.desc_type = APR_POLL_SOCKET; 170251877Speter l->desc.desc.s = l->skt; 171251877Speter l->desc.reqevents = APR_POLLIN; 172251877Speter 173251877Speter rv = ctx->pollset_add(ctx->pollset_baton, 174251877Speter &l->desc, &l->baton); 175251877Speter if (rv) 176251877Speter return rv; 177251877Speter 178251877Speter *listener = l; 179251877Speter 180251877Speter return APR_SUCCESS; 181251877Speter} 182