Blame test/serf_server.c

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
}