特定のモジュールの機能に依存していたり、他のモジュールの設定値を参照したい場合は、対象のモジュールがApacheにロードされているかをチェックする必要がある。
名前を指定して調べる
特定のモジュールが組み込まれているか否かを調べる場合、関数ap_find_linked_module()にモジュールのファイル名("mod_example.c"など)を与えて調べる事ができる。module *linked_module; linked_module = ap_find_linked_module("mod_auth.c"); if (linked_module == NULL) { /* "mod_auth.c"は組み込まれていない */ }関数ap_find_linked_module()はhttp_core.cモジュールのIfModuleコンテナの実装や、mod_rewrite.cモジュールでProxyを利用する際にmod_proxy.cモジュールが組み込まれているか否かのチェックなどに利用されている。
実装については $APACHE_SRC/main/http_config.c を参照してください。
組み込み済みモジュールの一覧を得る
モジュール名を直接指定して存在するか否かは判るとして、「今現在Apacheに組み込まれているモジュールの一覧が欲しい」なんてときはどうするか。その場合は組み込み済みモジュールのリンクリストの先頭を指しているApacheのグローバル変数top_moduleを参照します。extern module *top_module; module *m; for (m = top_module; m; m = m->next) { char *module_name; /* ap_find_module_nameはmodule構造体のポインタから、 */ /* モジュール名を取り出す。 */ module_name = ap_find_module_name(m); }module構造体ポインタのグローバル変数top_moduleは、LoadModuleやAddModuleディレクティブで最後に追加されたモジュールをポイントし、そのリンクリストの終端は http_core.cモジュールを指しています。
関数ap_find_module_name()は引数で与えたmodule構造体ポインタが保持しているモジュール名を返す関数ですが、この実装は単純にmodule構造体のnameフィールドを参照しているだけです。
これだけ見てると
httpd -l で組み込み済みモジュール一覧でるじゃんとか言われそうな気もしますが、その場合出力されるのはスタティックリンクされたモジュールだけで、ダイナミックリンクされたモジュールはhttpd.confを見ないとわかりません。稼働中のApacheに組み込まれているモジュール一覧を出力する管理用Web I/Fとか色々使えると思います。