Windows でパラメータ設定のある Apache モジュールを作る。

最終更新:2014/08/13

mod_myparams.c
/* 
**  mod_myparams.c
**  ○Apache モジュールのパラメータ設定を定義するサンプル
**  以下のパラメータを定義する:
**  ・MYPARAMSw:  スイッチ (ON/OFF)
**  ・MYPARAMStr: 文字列
**  ・MYPARAMNum: 整数値
**  ○ビルド
**  $ apxs -c -l libhttpd.lib -l libapr-1.lib mod_myparams.c
**  ○インストール
**  $ copy mod_myparams.so /your_httpd_path/modules
**  ○httpd.conf の編集。追加内容:
**  LoadModule myparams_module modules/mod_myparams.so
**  <Location /myparams>
**  SetHandler myparams
**  </Location>
**  MYPARAMSw On
**  MYPARAMStr hello
**  MYPARAMNum 123456
*/ 

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

// ServerRoot の値を保持するグローバル変数の参照
AP_DECLARE_DATA extern const char *ap_server_root;

module AP_MODULE_DECLARE_DATA myparams_module;

// パラメータ格納用構造体
typedef struct myparams_conf_t {
  int sw1; /* ON:1, OFF:0*/
  char *str1;
  int num1;
} myparams_conf_t;

// apr_table_do から使用されるコールバック関数
int print_table_cb (void *ctx, const char *key, const char *value) {
  request_rec *r = (request_rec*)ctx;
  ap_rprintf(r, "<li>[%s]=[%s]\n", key, value);
  return TRUE;/* TRUE:continue iteration. FALSE:stop iteration */
}

/* HTML を出力する関数 */
static int myparams_handler(request_rec *r)
{
  myparams_conf_t *ptr = (myparams_conf_t *) ap_get_module_config(
                         r->server->module_config, &myparams_module);

  if (strcmp(r->handler, "myparams")) {
    return DECLINED;
  }
  
  r->content_type = "text/html";

  if (!r->header_only) {
    ap_add_common_vars(r);
    ap_add_cgi_vars(r);
    ap_rprintf(r, "<html>\n<head>\n<title>mod_myparams</title>\n</head>\n");
    ap_rprintf(r, "<body>\n<ul>\n<li>ServerRoot: %s\n", ap_server_root);
    ap_rprintf(r, "<li>MYPARAMSwitch: %d\n", ptr->sw1);
    ap_rprintf(r, "<li>MYPARAMStr: %s\n", ptr->str1);
    ap_rprintf(r, "<li>MYPARAMNum: %d\n", ptr->num1);
    if (r->subprocess_env) {
      ap_rprintf(r, "<li>subprocess_env\n<ul>\n");
      apr_table_do(print_table_cb, r, r->subprocess_env, NULL);
      ap_rprintf(r, "</ul>\n");
    }
    ap_rprintf(r, "</ul></body></html>\n");
  }
  return OK;
}

// パラメータ格納用構造体を作成し初期化する関数
static void *myparams_create_sconfig(apr_pool_t *p, server_rec *s)
{
  myparams_conf_t *ptr = apr_pcalloc(p, sizeof *ptr);
  ptr->sw1 = 0;
  ptr->str1 = NULL;
  ptr->num1 = -1;
  return ptr;
}

static void myparams_register_hooks(apr_pool_t *p)
{
  ap_hook_handler(myparams_handler, NULL, NULL, APR_HOOK_MIDDLE);
}

// MYPARAMSw の値を構造体にセットする関数
static const char *myparams_set_sw(cmd_parms *cmd, void *dummy, int arg)
{
  myparams_conf_t *ptr = (myparams_conf_t *) ap_get_module_config(
                           cmd->server->module_config, &myparams_module);
  ptr->sw1 = arg;
  return NULL;
}

// MYPARAMStr の値を構造体にセットする関数
static const char *myparams_set_str(cmd_parms *cmd, void *dummy,
  const char *arg)
{
  char *str;
  myparams_conf_t *ptr = (myparams_conf_t *) ap_get_module_config(
                           cmd->server->module_config, &myparams_module);

  if ((str = ap_getword_conf(cmd->pool, &arg))) {
    ptr->str1 = str;
  } else {
    return "MYPARAMStr requires string value";
  }

  return NULL;
}

// MYPARAMNum の値を構造体にセットする関数
static const char *myparams_set_num(cmd_parms *cmd, void *dummy,
 const char *arg)
{
  char *str;
  myparams_conf_t *ptr = (myparams_conf_t *) ap_get_module_config(
                           cmd->server->module_config, &myparams_module);
  if ((str = ap_getword_conf(cmd->pool, &arg))) {
    ptr->num1 = atoi(str);
  } else {
    return "MYPARAMNum requires integer value";
  }
  return NULL;
}

// パラメータの定義
static const command_rec myparams_cmds[] = {
  AP_INIT_FLAG( "MYPARAMSw", myparams_set_sw, NULL, RSRC_CONF,
   "MYPARAMS Switch"),
  AP_INIT_TAKE1("MYPARAMStr", myparams_set_str, NULL, RSRC_CONF,
   "MYPARAMS String"),
  AP_INIT_TAKE1("MYPARAMNum", myparams_set_num, NULL, RSRC_CONF,
   "MYPARAMS Number"),
  { NULL }
};

/* Dispatch list for API hooks */
module AP_MODULE_DECLARE_DATA myparams_module = {
  STANDARD20_MODULE_STUFF, 
  NULL,          /* create per-dir  config structures */
  NULL,          /* merge  per-dir  config structures */
  myparams_create_sconfig, /* create per-server config structures */
  NULL,          /* merge  per-server config structures */
  myparams_cmds,          /* table of config file commands     */
  myparams_register_hooks  /* register hooks            */
};
コンフィグ例。
LoadModule myparams_module modules/mod_myparams.so
<IfModule myparams_module>
  <Location /myparams>
  SetHandler myparams
  </Location>
  MYPARAMSw On
  MYPARAMStr "Hello!"
  MYPARAMNum 12345
</IfModule>
実行例はこちら
Copyright (C) KAKU PROJECT (2014) KAKU PROJECT (2014)