2006年07月27日

[補足記事]ディレクティブ処理関数登録マクロ一覧 (apache module 開発事初め その3-2)

はてなブックマークに登録

前回の記事で後回しにした AP_INIT_XXX() シリーズの一覧です.


AP_INIT_XXX() マクロに対する引数は全て共通で,つぎのようになります.


AP_INIT_XXX("directive", function, info, where, help)

引数の意味はそれぞれ

directive
設定ファイル中で用いるディレクティブの名前.char *型.大文字小文字は無視されます.

function
ディレクティブ処理用の関数を指定すします.関数の型は,AP_INIT_XXX の種類によって変わります.


info
function() を呼び出す時に渡す情報.void *型.特に渡すものがなければ NULL を指定します.

where
このディレクティブが現れてよい場所の指定.int型.指定できる値のようなものがあります.

OR_LIMIT
httpd.conf内の <Directory><Location> の中か, AllowOverride Limit が指定されていれば .htaccess の中.このタイプのディレクティブの例として,AllowDeny があります.


OR_OPTIONS
httpd.conf の中か,AllowOverride Options が指定されていれば .htaccess の中.このタイプのディレクティブの例として,XBitHackCheckSpelling があります.

OR_FILEINFO
httpd.conf の中か,AllowOverride FileInfo が指定されていれば .htaccess の中.このタイプのディレクティブの例として,SetEnvIfHeader があります.


OR_AUTHCFG
httpd.conf 内の <Directory><Location> の中か,AllowOverride AuthConfig が指定されていれば .htaccess の中.このタイプのディレクティブの例として,AuthNameAuthDigestFile があります.


OR_INDEXES
httpd.conf の中か,AllowOverride Indexes が指定されていれば .htaccess の中.

OR_ALL
OR_XXX の条件の内いずれかを満たしている箇所.

ACCESS_CONF
httpd.conf 内の <Directory><Location> の中.


RSRC_CONF
httpd.conf 内の <Directory> 及び <Location> の外.

EXEC_ON_READ
httpd.conf の内容を実質的に変更するようなディレクティブの場合指定します.このタイプのディレクティブの例として,IFModuleIfVersion があります.




help
このディレクティブに関する説明.char *型.ディレクティブ使用時に書式が間違っていた場合に表示されます.



次に,AP_INIT_XXX() とそれに対するディレクティブ処理関数のプロトタイプについてそれぞれ説明します.



AP_INIT_NO_ARGS()


static const char *proc_NO_ARGS(cmd_parms *cmd, void *mconfig);

引数を取らないディレクティブ用.


AP_INIT_RAW_ARGS()


static const char *proc_RAW_ARGS(cmd_parms *cmd, void *mconfig,
const char *args);

引数を生の形で受け取るディレクティブ用.

ディレクティブへの引数が,そのままの形で渡される.


AP_INIT_FLAG()


static const char *proc_FLAG(cmd_parms *cmd, void *mconfig, int bool);


On/Off のみを引数に取るディレクティブ用.

フラグは int 型の bool 値で引き渡され,Off の場合は 0On の場合は 0 以外になる.


AP_INIT_TAKE1()


static const char *proc_TAKE1(cmd_parms *cmd, void *mconfig,
char *word1);

引数を一つだけ取るディレクティブ用.


AP_INIT_TAKE2()


static const char *proc_TAKE2(cmd_parms *cmd, void *mconfig,
char *word1, char *word2);

引数を二つとるディレクティブ用.引数が2つ無いとエラーになる.


AP_INIT_TAKE3()


static const char *proc_TAKE3(cmd_parms *cmd, void *mconfig,
char *word1, char *word2, char *word3);

引数を3つとるディレクティブ用.引数が3つ無いとエラーになる.


AP_INIT_TAKE12()


static const char *proc_TAKE12(cmd_parms *cmd, void *mconfig,
char *word1, char *word2);

引数を 1つか2つとるディレクティブ用.

ディレクティブへの引数が一つだけの場合,word2 には NULL が渡される.


AP_INIT_TAKE123()


static const char *proc_TAKE123(cmd_parms *cmd, void *mconfig,
char *word1, char *word2, char *word3);

引数を1つから3つとるディレクティブ用.
引数が1つだけの場合,word2word3 には NULL が渡される.

引数が2つだけの場合,word3 には NULL が渡される.


AP_INIT_TAKE13()


static const char *proc_TAKE13(cmd_parms *cmd, void *mconfig,
char *word1, char *word2, char *word3);

引数を1つあるいは3つとるディレクティブ用.引数が2つの場合エラーになる.

引数が1つだけの場合,word2word3 には NULL が渡される.


AP_INIT_TAKE23()


static const char *proc_TAKE23(cmd_parms *cmd, void *mconfig,
char *word1, char *word2, char *word3);

引数を2つあるいは3つとるディレクティブ用.

引数が2つだけの場合,word3 には NULL が渡される.


AP_INIT_ITERATE()


static const char *proc_ITERATE(cmd_parms *cmd, void *mconfig,
char *word1);

引数の数は無制限で,それらを一つずつ処理するディレクティブ用.

一つの引数に対して一度,指定したディレクティブ処理関数が呼び出される.


AP_INIT_ITERATE2()


static const char *proc_ITERATE2(cmd_parms *cmd, void *mconfig,
char *word1, char *word2);

引数の数は無制限で,それらを一つずつ処理するディレクティブ用.

二つめ以降の引数一つずつに対して一度,指定したディレクティブ処理関数が呼び出される.一つめの引数は呼び出しの度に渡される(word1).

このタイプのディレクティブの例として,Allow がある.
Allow ディレクティブの場合,それに続く 'from' キーワードが word1 に渡され,'from' に続くアクセス元の指定が一つずつ切り出されて word2 に渡される.


ディレクティブ処理関数の引数の内 cmd と mconfig の意味はそれぞれ,

cmd_parms *cmd

ディレクティブ処理関数が処理する上で必要となる様々な変数が詰まった cmd_parms 構造体の変数です.cmd_parms 構造体のメンバには,apr_pool_t 型のポインタ(cmd->pool)や,処理するディレクティブが記述されたファイルの情報を表すメンバがあります.AP_INIT_XXX() マクロでディレクティブを登録するときにセットする info 引数は,この構造体の info メンバ変数(cmd->info) に入っています.

void *mconfig

ディレクトリ設定データ初期化関数(create_dir_config())で確保したデータ領域のポインタが渡されます.




klab_gijutsu2 at 17:09│Comments(0)TrackBack(0)apache | 開発

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント