Apache2の自作モジュールからで httpd.conf から値をとる

Apacheの設定は httpd.conf で行いますが独自のモジュールを作成した場合に、独自のディレクティブを定義し設定を読み込みたい場合があります。
モジュール固有のパラメータなどがサーバー毎に異なる場合などに利用できるでしょう。


Apache1.3系での方法は、Apacheモジュール プログラミングガイド (Advanced Server‐side programmingシリーズ)を読めばばっちり分かるのですが Apache2系に関しては情報が少ないのでまとめておきます。
なお今回はディレクトリ毎の設定ではなく、サーバー毎の設定である per-server-config を例にしていますので per-dir-config の場合は適宜読み替えてください。


やることは以下5つ

  1. 設定情報を保持する構造体を定義する
  2. configを作成する関数を用意する
  3. 各ディレクティブを取得して構造体にセットするための関数を用意する
  4. command_rec構造体に各ディレクティブの定義とセットするための関数等々をセットする
  5. module構造体にcommand_rec構造体、config作成関数をセットする

設定情報を保持する構造体を定義する

typedef struct {
    char* hoge;
    char* huga;
} modulename_server_config;

こんな感じで設定情報を保持する構造体を定義します。もちろん char* だけでなく int なども使えます。

configを作成する関数を用意する

static void* create_modulename_server_config(apr_pool_t* p, server_rec* s)
{
    modulename_server_config* conf = apr_palloc(p, sizeof(modulename_sever__config));
    conf->hoge = apr_pstrdup(p, "hogehoge"); // デフォルト値を入れておくとか
    return conf;
}

ディレクトリを取得して構造体にセットするための関数を用意する

static const char* modulename_set_hoge(cmd_parms* cmd, void* dummy, const char* arg)
{
    modulename_server_config* conf = ap_get_module_config(cmd->server->module_config, &modulename_module);
    conf->hoge = apr_pstrdup(cmd->pool, arg);
    return NULL;
}

ここで実際に hoge ディレクティブの値を構造体にセットします。
エラーチェックや数値への変換などはここで行います。

command_rec構造体に各ディレクティブの定義とセットするための関数等々をセットする

static const command_rec modulename_cmds[] = {
    AP_INIT_TAKE1("hoge", modulename_set_hoge, NULL, OR_ALL,
                  "help message for hoge"),
   {NULL}
};

ディレクティブ名・値をセットするための関数・httpd.confのどこのスコープ内で有効なものか?などをセットします。
AP_INIT_TAKE1 はディレクティブが引数をひとつとるということを意味します。
AP_INIT_TAKE1の第一引数の hoge がディレクティブ名になります。


つまり
httpd.confで

hoge somevalue

と書くことになります。

module構造体にcommand_rec構造体、config作成関数をセットする

module AP_MODULE_DECLARE_DATA modulename_module = {
    STANDARD20_MODULE_STUFF,
    NULL,                            /* create per-dir    config structures */
    NULL,                            /* merge  per-dir    config structures */
    create_modulename_server_config, /* create per-server config structures */
    NULL,                            /* merge  per-server config structures */
    modulename_cmd,                  /* table of config file commands       */
    modulename_register_hooks        /* register hooks                      */
};


ここが起点です。module構造体にcommand_rec構造体、config作成関数をセットします。
というわけで大分端折りましたがこんな感じで取れると思います。


細かいパラメータ等は

Apacheモジュール プログラミングガイド (Advanced Server‐side programmingシリーズ)

Apacheモジュール プログラミングガイド (Advanced Server‐side programmingシリーズ)

を読んでいただければ分かると思います。

やね師匠と会ってきた

やね師匠とはじめてオフラインで会ってきました。
早速id:yaneurao:20050907あたりでレビューしていただいていますが、ひげぽん目線で驚いた点をば。

意外と

渋谷駅で待ち合わせたのですが会ってみると、物腰が柔らかい&意外と若く、男前(?)でした。
日記やメッセンジャーでは !(`ω´)こんな感じだったので大分イメージが違う。

突然

待ち合わせ場所から移動し、店で飲み物の注文が終わったところで突然かばんからノートを取り出した。
何をするのかと思って見ていたら、筆記体でノートにコードを書き始めた(;´Д`)


ノートパソコンではなく、ノートですよ!しかも結構速い。
どうやら id:higepon:20050905:1125935988 で実装に迷った部分について教えてくれているようだ。
「解法が3つくらいあるんだよ」といって矢継ぎ早にたくさん説明してくれるのだが、その場では40%位しか理解できなかった。。。orz
これが実際のノートで裏表にびっしりといろいろ説明してくださいました。

名刺&サインもらった

名刺交換。
さらに美咲ちゃん本にサインをもらう。サインついでに美咲ちゃん本に隠された真実を知りびっくり。内容は書けませんが・・・
「この本をもっと早く読んでいれば、Monaのブートコードとかで苦労しなかったのに」と私が言うと。
「!(`ω´)コリャそれならもっと宣伝せんか!」と言われたので宣伝しておきます。

解析魔法少女 美咲ちゃん マジカル・オープン!

解析魔法少女 美咲ちゃん マジカル・オープン!


印象に残った話

メモを取ったら馬鹿になる
メモを取ることを全否定しているわけではなく、僕がどうも頭の容量が足りないんですと相談したところ。
コードを書く際には、頭に具体的なコードを浮かべてから書くようにする。
慣れるにしたがって、頭に浮かべるコードの行数を増やしていくと徐々に、覚えられる量が増える。
さらに、他人のコードを読んでも頭にすっと入るというアドバイスをいただきました。
昨日から、少しずつ実践しています。

やね師匠は、話の節々に出来る人の輝きがありうーんがんばらねばと考えさせられました。
とても楽しい時間をすごすことができました。ありがとうございました。>id:yaneuraoさん