|
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 <stdlib.h>
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
#include <apr.h>
|
|
Packit |
3adb1e |
#include <apr_uri.h>
|
|
Packit |
3adb1e |
#include <apr_strings.h>
|
|
Packit |
3adb1e |
#include <apr_atomic.h>
|
|
Packit |
3adb1e |
#include <apr_base64.h>
|
|
Packit |
3adb1e |
#include <apr_getopt.h>
|
|
Packit |
3adb1e |
#include <apr_version.h>
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
#include "serf.h"
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
typedef struct {
|
|
Packit |
3adb1e |
int foo;
|
|
Packit |
3adb1e |
} app_baton_t;
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
static apr_status_t incoming_request(serf_context_t *ctx,
|
|
Packit |
3adb1e |
serf_incoming_request_t *req,
|
|
Packit |
3adb1e |
void *request_baton,
|
|
Packit |
3adb1e |
apr_pool_t *pool)
|
|
Packit |
3adb1e |
{
|
|
Packit |
3adb1e |
printf("INCOMING REQUEST\n");
|
|
Packit |
3adb1e |
return APR_SUCCESS;
|
|
Packit |
3adb1e |
}
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
static apr_status_t accept_fn(serf_context_t *ctx,
|
|
Packit |
3adb1e |
serf_listener_t *l,
|
|
Packit |
3adb1e |
void *baton,
|
|
Packit |
3adb1e |
apr_socket_t *insock,
|
|
Packit |
3adb1e |
apr_pool_t *pool)
|
|
Packit |
3adb1e |
{
|
|
Packit |
3adb1e |
serf_incoming_t *client = NULL;
|
|
Packit |
3adb1e |
printf("new connection from \n");
|
|
Packit |
3adb1e |
return serf_incoming_create(&client, ctx, insock, baton, incoming_request, pool);
|
|
Packit |
3adb1e |
}
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
static void print_usage(apr_pool_t *pool)
|
|
Packit |
3adb1e |
{
|
|
Packit |
3adb1e |
puts("serf_server [options] listen_address:listen_port");
|
|
Packit |
3adb1e |
puts("-h\tDisplay this help");
|
|
Packit |
3adb1e |
puts("-v\tDisplay version");
|
|
Packit |
3adb1e |
}
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
int main(int argc, const char **argv)
|
|
Packit |
3adb1e |
{
|
|
Packit |
3adb1e |
apr_status_t rv;
|
|
Packit |
3adb1e |
apr_pool_t *pool;
|
|
Packit |
3adb1e |
serf_context_t *context;
|
|
Packit |
3adb1e |
serf_listener_t *listener;
|
|
Packit |
3adb1e |
app_baton_t app_ctx;
|
|
Packit |
3adb1e |
const char *listen_spec;
|
|
Packit |
3adb1e |
char *addr = NULL;
|
|
Packit |
3adb1e |
char *scope_id = NULL;
|
|
Packit |
3adb1e |
apr_port_t port;
|
|
Packit |
3adb1e |
apr_getopt_t *opt;
|
|
Packit |
3adb1e |
char opt_c;
|
|
Packit |
3adb1e |
const char *opt_arg;
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
apr_initialize();
|
|
Packit |
3adb1e |
atexit(apr_terminate);
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
apr_pool_create(&pool, NULL);
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
apr_getopt_init(&opt, pool, argc, argv);
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
while ((rv = apr_getopt(opt, "hv", &opt_c, &opt_arg)) ==
|
|
Packit |
3adb1e |
APR_SUCCESS) {
|
|
Packit |
3adb1e |
switch (opt_c) {
|
|
Packit |
3adb1e |
case 'h':
|
|
Packit |
3adb1e |
print_usage(pool);
|
|
Packit |
3adb1e |
exit(0);
|
|
Packit |
3adb1e |
break;
|
|
Packit |
3adb1e |
case 'v':
|
|
Packit |
3adb1e |
puts("Serf version: " SERF_VERSION_STRING);
|
|
Packit |
3adb1e |
exit(0);
|
|
Packit |
3adb1e |
default:
|
|
Packit |
3adb1e |
break;
|
|
Packit |
3adb1e |
}
|
|
Packit |
3adb1e |
}
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
if (opt->ind != opt->argc - 1) {
|
|
Packit |
3adb1e |
print_usage(pool);
|
|
Packit |
3adb1e |
exit(-1);
|
|
Packit |
3adb1e |
}
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
listen_spec = argv[opt->ind];
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
rv = apr_parse_addr_port(&addr, &scope_id, &port, listen_spec, pool);
|
|
Packit |
3adb1e |
if (rv) {
|
|
Packit |
3adb1e |
printf("Error parsing listen address: %d\n", rv);
|
|
Packit |
3adb1e |
exit(1);
|
|
Packit |
3adb1e |
}
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
if (!addr) {
|
|
Packit |
3adb1e |
addr = "0.0.0.0";
|
|
Packit |
3adb1e |
}
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
if (port == 0) {
|
|
Packit |
3adb1e |
port = 8080;
|
|
Packit |
3adb1e |
}
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
context = serf_context_create(pool);
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
/* TODO.... stuff */
|
|
Packit |
3adb1e |
app_ctx.foo = 1;
|
|
Packit |
3adb1e |
rv = serf_listener_create(&listener, context, addr, port,
|
|
Packit |
3adb1e |
&app_ctx, accept_fn, pool);
|
|
Packit |
3adb1e |
if (rv) {
|
|
Packit |
3adb1e |
printf("Error parsing listener: %d\n", rv);
|
|
Packit |
3adb1e |
exit(1);
|
|
Packit |
3adb1e |
}
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
while (1) {
|
|
Packit |
3adb1e |
rv = serf_context_run(context, SERF_DURATION_FOREVER, pool);
|
|
Packit |
3adb1e |
if (APR_STATUS_IS_TIMEUP(rv))
|
|
Packit |
3adb1e |
continue;
|
|
Packit |
3adb1e |
if (rv) {
|
|
Packit |
3adb1e |
char buf[200];
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
printf("Error running context: (%d) %s\n", rv,
|
|
Packit |
3adb1e |
apr_strerror(rv, buf, sizeof(buf)));
|
|
Packit |
3adb1e |
apr_pool_destroy(pool);
|
|
Packit |
3adb1e |
exit(1);
|
|
Packit |
3adb1e |
}
|
|
Packit |
3adb1e |
}
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
apr_pool_destroy(pool);
|
|
Packit |
3adb1e |
return 0;
|
|
Packit |
3adb1e |
}
|