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);
結構ひっかかったとこなので、覚書も含めて書いておいた。
靴の写真があって、なかなかいい感じの体裁ですね。
プログラムとかばっかりだと、あまりにさびしい感じがしたので・・・^^;