Apache 2.x での設定部分の実装

http://module.jp/book/table_of_contents.html
「第5章 設定ファイルのカスタマイズ」のsimple_confをApache 2.xで。結構時間かかかったヨ。

#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
#include "ap_config.h"

module AP_MODULE_DECLARE_DATA simple_conf_module;

typedef struct {
    char *message;
} simple_dir_config ;

static void *create_per_dir_config(apr_pool_t *p, char *arg ) {
    simple_dir_config *conf;
    conf = apr_pcalloc( p , sizeof(simple_dir_config) );
    conf->message = apr_pstrdup(p , "default" );
    return (void *)conf;
}

static const char *cmd_set_message(cmd_parms *parms ,void *mconfig, char *arg ){
    simple_dir_config *conf;

    if( strlen(arg) > 256 ) {
        return "message is too long >_<";
    }

    conf = mconfig;
    conf->message = apr_pstrdup( parms->pool ,arg );
    return NULL;
}

static const command_rec cmds[] = {
    AP_INIT_TAKE1( "SetMessage", cmd_set_message, NULL, OR_ALL, "Set Message"),
    { NULL }
};

static int simple_conf_handler( request_rec *r ) {
    simple_dir_config *conf;

    if (strcmp(r->handler, "simple_conf")) {
        return DECLINED;
    }

    conf = ap_get_module_config( r->per_dir_config , &simple_conf_module );

    r->content_type = "text/html";

    if( !r->header_only ) {
        ap_rputs(conf->message, r);
    }
    return OK;

}

static void simple_conf_register_hooks(apr_pool_t *p)
{
    ap_hook_handler(simple_conf_handler, NULL, NULL, APR_HOOK_MIDDLE);
}

module AP_MODULE_DECLARE_DATA simple_conf_module = {
    STANDARD20_MODULE_STUFF,
    create_per_dir_config,      /* create per-dir    config structures */
    NULL,                       /* merge  per-dir    config structures */
    NULL,                       /* create per-server config structures */
    NULL,                       /* merge  per-server config structures */
    cmds,                       /* table of config file commands       */
    simple_conf_register_hooks  /* register hooks                      */
};

これは良い本だなぁ。