ap_hook_translate_name() にフックをかける場合は http_request.h をインクルードしよう

  • Posted by: ちわ
  • 2009年8月11日 03:58

Apacheモジュールを開発する際にフックをかけるタイミングがたくさんありますが、そのフックの一覧と API が

[補足記事]Apache 2.0 の hook 一覧(apache module 開発事初め その3-3) - DSAS開発者の部屋
http://dsas.blog.klab.org/archives/50626863.html

にまとめられています。
リンク先の Apache のバージョンは 2.0.58 で最近の 2.2.x とは若干の違いがあるようですが本当に若干です。
ap_hook_monitor() が追加されていて、ap_hook_http_method() が ap_hook_http_scheme() に変更されているくらいでしょうか。

Downloading Apache - Japanized Apache Site から Apache のソースをダウンロードして展開したディレクトリを /path/to/httpd とすると /path/to/httpd/include 内で AP_DECLARE_HOOK を grep すればリンク先で紹介されている各種フックの説明と API が見つけられます。
どのヘッダにどのフックが宣言されているか以下にまとめます。

  • ap_mpm.h
    • ap_hook_fatal_exception()
  • http_config.h
    • ap_hook_header_parser()
    • ap_hook_pre_config()
    • ap_hook_test_config()
    • ap_hook_post_config()
    • ap_hook_open_logs()
    • ap_hook_child_init()
    • ap_hook_handler()
    • ap_hook_quick_handler()
    • ap_hook_optional_fn_retrieve()
  • http_connection.h
    • ap_hook_create_connection()
    • ap_hook_pre_connection()
    • ap_hook_process_connection()
  • http_core.h
    • ap_hook_get_mgmt_items()
  • http_log.h
    • ap_hook_error_log()
  • http_protocol.h
    • ap_hook_insert_error_filter()
    • ap_hook_post_read_request()
    • ap_hook_log_transaction()
    • ap_hook_http_scheme()
    • ap_hook_default_port()
  • http_request.h
    • ap_hook_create_request()
    • ap_hook_translate_name()
    • ap_hook_map_to_storage()
    • ap_hook_check_user_id()
    • ap_hook_fixups()
    • ap_hook_type_checker()
    • ap_hook_access_checker()
    • ap_hook_auth_checker()
    • ap_hook_insert_filter()
  • mpm_common.h
    • ap_hook_monitor()
  • scoreboard.h
    • ap_hook_pre_mpm()

コンフィグに関わるフックであれば http_config.h、コネクションに関するフックであれば http_connection.h とヘッダのファイル名でだいたいの当たりをつけることができるのではないでしょうか。中には当たりのつけづらいフックもありますが。

さて、ここまでが若干長い前置きです。
ap_hook_handler() くらいしか使わない単純なモジュールであれば特にヘッダを #include する必要はないですが、今回はリクエストされた URI をファイルシステムにマッピングするフェーズでちょっとやりたいことがあったので ap_hook_translate_name() にフックをかけようとしたら警告が出たんですね。

[travail@cabane]/home/public/git/thumb% sudo /usr/sbin/apxs -c -i mod_thumb.c
/usr/lib/apr-1/build/libtool --silent --mode=compile gcc -prefer-pic -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -fno-strict-aliasing  -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -pthread -I/usr/include/httpd  -I/usr/include/apr-1   -I/usr/include/apr-1   -c -o mod_thumb.lo mod_thumb.c && touch mod_thumb.slo
mod_thumb.c: In function 'thumb_register_hooks':
mod_thumb.c:189: warning: implicit declaration of function 'ap_hook_translate_name'
/usr/lib/apr-1/build/libtool --silent --mode=link gcc -o mod_thumb.la  -rpath /usr/lib/httpd/modules -module -avoid-version    mod_thumb.lo
/usr/lib/httpd/build/instdso.sh SH_LIBTOOL='/usr/lib/apr-1/build/libtool' mod_thumb.la /usr/lib/httpd/modules
/usr/lib/apr-1/build/libtool --mode=install cp mod_thumb.la /usr/lib/httpd/modules/
cp .libs/mod_thumb.so /usr/lib/httpd/modules/mod_thumb.so
cp .libs/mod_thumb.lai /usr/lib/httpd/modules/mod_thumb.la
cp .libs/mod_thumb.a /usr/lib/httpd/modules/mod_thumb.a
chmod 644 /usr/lib/httpd/modules/mod_thumb.a
ranlib /usr/lib/httpd/modules/mod_thumb.a
PATH="$PATH:/sbin" ldconfig -n /usr/lib/httpd/modules

--- SNIP ---

chmod 755 /usr/lib/httpd/modules/mod_thumb.so

3、4行目で「ap_hook_translate_name を明示的に宣言したらどうなんだい?」って言われてます。

mod_thumb.c: In function 'thumb_register_hooks':
mod_thumb.c:189: warning: implicit declaration of function 'ap_hook_translate_name'

コンパイルは完了するし Apache をリスタートしても動作に問題なさそうなんですけど、やっぱり警告は気持ち悪いので ap_hook_translate_name() が 宣言されている http_request.h を #include して警告なしにコンパイルが完了。
利用するフックによって /path/to/httpd/include 内のヘッダを #include しないと警告が出る場合がありますよというお話。

Comments:1

aiiiiin 2010年1月19日 23:51

てぃわさんの言葉にいつもやられちゃってまふ。。。
ずーーーーっと前にかいしゃで一緒だったです。はじめてコメントしちゃいました。
次の、更新たのしみにしてまぁふ。

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://hibinokoto.jp/mt/mt-tb.cgi/315
Listed below are links to weblogs that reference
ap_hook_translate_name() にフックをかける場合は http_request.h をインクルードしよう from 日々のこと

Home > ap_hook_translate_name() にフックをかける場合は http_request.h をインクルードしよう

Search
Feeds

Return to page top