diff options
Diffstat (limited to 'test/serf_server.c')
-rw-r--r-- | test/serf_server.c | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/test/serf_server.c b/test/serf_server.c new file mode 100644 index 0000000..4d8a0c6 --- /dev/null +++ b/test/serf_server.c @@ -0,0 +1,147 @@ +/* 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; +} |