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