モジュールのApache1.3からApache2.0への移植

自作モジュールをApache1.3からApache2.0へ移植してみました。
移植中はセグメントフォルト多発だったので皆さん気をつけましょう。


Apache2では、APIが大きく変更されています。
ハンドラの登録や実行順序の制御方法、関数名・型名いろいろと違います。
というわけなのでApache2にモジュールを移植する上で躓いたところをメモとして残しておきます。

ドキュメント

Apache2.0の詳細なドキュメント

移植に特化したドキュメントは「モジュールの Apache 1.3 から Apache 2.0 への移植」。(ちょっと情報が少ない)

なおリンクが張られている
http://docx.webperf.org/
http://lxr.webperf.org/
は、悲しいことにリンク切れです。

雛形作成

apxsで雛形作成、雛形がだいぶ変わっているの注意。

apxs -g -n hello

ハンドラの登録

  • ap_hook_handler・・・コンテンツハンドラを登録。
  • ap_hook_type_checker・・・find_typesと名前が似ているのできっとそうに違いない。
  • ap_hook_log_transaction・・・ログフェーズに違いない。

ログ用の関数

APLOG_MARKがないと言われた。
ap_log_errorに対応するものはなんだろうか。APIドキュメントの探し方が悪いのか見つからない。
Apache2のソースをダウンロードして、モジュールのソースを読んでみると、どうも引数が一つ増えている。
APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, 0, r->server
mod_proxyのソースを見ると0を入れているので、とりあえず0で。

さらにAPLOG_MARKは

#include "http_log.h"

のように明示的に include してやれば解決した。

名前の変更

pool -> apr_pool_t
ap_pstrcat -> apr_pstrcat
などなど。

ファイルAPI

ap_pfopen ->?
ap_pfclose ->?
廃止されたのかな?
srclib/apr/include/apr_file_io.hを見ると、ぜんぜん違うIFのAPIがあるけど、これに代わったのだろうか?
とりあえず fopen/fcloseとして保留。

LIBS=ライブラリ名が効いていない?

ldd mod_test.soしても、指定したライブラリを見ていない。
*.makファイルがincludeされているのをずっと辿っていくと
LDFLAGSが正解のようだ。

LDFLAGS+=-ltest

これで解決

続き:id:higepon:20050817:1124265060


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

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