blob: 4d8a0c6181cc10aa07dc16e019f10b67009efc9c [file] [log] [blame]
/* Copyright 2002-2004 Justin Erenkrantz and Greg Stein
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdlib.h>
#include <apr.h>
#include <apr_uri.h>
#include <apr_strings.h>
#include <apr_atomic.h>
#include <apr_base64.h>
#include <apr_getopt.h>
#include <apr_version.h>
#include "serf.h"
typedef struct {
int foo;
} app_baton_t;
static apr_status_t incoming_request(serf_context_t *ctx,
serf_incoming_request_t *req,
void *request_baton,
apr_pool_t *pool)
{
printf("INCOMING REQUEST\n");
return APR_SUCCESS;
}
static apr_status_t accept_fn(serf_context_t *ctx,
serf_listener_t *l,
void *baton,
apr_socket_t *insock,
apr_pool_t *pool)
{
serf_incoming_t *client = NULL;
printf("new connection from \n");
return serf_incoming_create(&client, ctx, insock, baton, incoming_request, pool);
}
static void print_usage(apr_pool_t *pool)
{
puts("serf_server [options] listen_address:listen_port");
puts("-h\tDisplay this help");
puts("-v\tDisplay version");
}
int main(int argc, const char **argv)
{
apr_status_t rv;
apr_pool_t *pool;
serf_context_t *context;
serf_listener_t *listener;
app_baton_t app_ctx;
const char *listen_spec;
char *addr = NULL;
char *scope_id = NULL;
apr_port_t port;
apr_getopt_t *opt;
char opt_c;
const char *opt_arg;
apr_initialize();
atexit(apr_terminate);
apr_pool_create(&pool, NULL);
apr_getopt_init(&opt, pool, argc, argv);
while ((rv = apr_getopt(opt, "hv", &opt_c, &opt_arg)) ==
APR_SUCCESS) {
switch (opt_c) {
case 'h':
print_usage(pool);
exit(0);
break;
case 'v':
puts("Serf version: " SERF_VERSION_STRING);
exit(0);
default:
break;
}
}
if (opt->ind != opt->argc - 1) {
print_usage(pool);
exit(-1);
}
listen_spec = argv[opt->ind];
rv = apr_parse_addr_port(&addr, &scope_id, &port, listen_spec, pool);
if (rv) {
printf("Error parsing listen address: %d\n", rv);
exit(1);
}
if (!addr) {
addr = "0.0.0.0";
}
if (port == 0) {
port = 8080;
}
context = serf_context_create(pool);
/* TODO.... stuff */
app_ctx.foo = 1;
rv = serf_listener_create(&listener, context, addr, port,
&app_ctx, accept_fn, pool);
if (rv) {
printf("Error parsing listener: %d\n", rv);
exit(1);
}
while (1) {
rv = serf_context_run(context, SERF_DURATION_FOREVER, pool);
if (APR_STATUS_IS_TIMEUP(rv))
continue;
if (rv) {
char buf[200];
printf("Error running context: (%d) %s\n", rv,
apr_strerror(rv, buf, sizeof(buf)));
apr_pool_destroy(pool);
exit(1);
}
}
apr_pool_destroy(pool);
return 0;
}