apacheモジュールでconfigをcreateする時の注意する事

apacheモジュールで必須のconfig構造体を作成する作業。

これは、通常1.3系ではモジュール読み込み構造体(MODULE_VAR_EXPORT等)の3番目にディレクトリ毎のconfig、5番目にserver毎のconfigを作成する関数指定する。

2系の場合は、モジュール読み込み構造体(AP_MODULE_DECLARE_DATA等)の2番目にディレクトリ毎のconfig、4番目にserver毎のconfigを作成する関数指定する。

ここで注意しなければならないのが、configを作成した後、command_rec構造体から具体的なconfの値を設定していく時の扱い方。

ディレクトリ毎に使用するconfigは、command_recに登録されている関数でそのconfigの構造体を引き継ぐには以下のように実装する。

static const char *
set_sample_dir_config(cmd_parms *cmd, void *dir_config_fmt, char *arg)
{
    SAMPLE_D_CONF *pSampleDirConf = (SAMPLE_D_CONF *)dir_config_fmt;

上記のように実装することで、configをcreateする関数で作成したconfig保存用の構造体を引き継ぐことができるが、serverのconfigは引継ぎ方が違う。

以下のように、引き継ぐ。

static const char *
set_sample_server_config(cmd_parms *cmd, void *server_config_fmt, char *arg1)
{
    SAMPLE_S_CONF *pSampleServerConf;
    pSampleServerConf =
        (SAMPLE_S_CONF *)ap_get_module_config(cmd->server->module_config, &sample_module);

このように、「ap_get_module_config」を使って構造体を引き継ぐ必要がある。

なお、実際にrequest_recに対して処理するhook関数やhandler等では、ディレクトリ毎とサーバ毎のcommand_recで具体的な値を設定した後の構造体を「ap_get_module_config」を使って読み込む。

例えば、access_checkerの場合だと以下のようになる。

static int sample_access_checker(request_rec *r)
{
    SAMPLE_S_CONF *pSampleServerConf;
    SAMPLE_D_CONF *pSampleDirConf;

    pSampleServerConf =
        (SAMPLE_S_CONF *)ap_get_module_config(r->server->module_config, &sample_module);

    pSampleDirConf =
        (SAMPLE_D_CONF *)ap_get_module_config(r->per_dir_config, &sample_module);

結構ひっかかったとこなので、覚書も含めて書いておいた。

「apacheモジュールでconfigをcreateする時の注意する事」への2件のフィードバック

コメントは受け付けていません。