[PREVIOUS CHAPTER]
[NEXT CHAPTER]
7 FML 内部におけるデータ構造
ここでは fml 内部処理におけるデータ構造について解説します。これらの知
識は改造する上で必須の事柄でしょうが、単に変数を 1 or 0 にセットするだ
けしか設定 (config.ph) をいじらないなら読む必要はないでしょう。
7.1 変数名の naming convention
○ 大文字([A-Z0-9_]+)だけの塊はユーザーのカスタマイズで使う目的の
Global 変数です。
Example: $MAIL_LIST
○ "1単語の先頭一文字が大文字、残りは小文字"の塊からなる単語はメー
ル本体やヘッダをSubroutine間で渡しあうための Global 変数です。
$MailBody $Reply_to
%Envelope *_cf
例外: *_cf は システム情報をもっている名前空間です。
(_cfはほとんど使われていません。将来は消去すべきです)
%Envelope は最も重要な変数です。
しかしながら、こういうグローバル変数は本来出来るだけ少なくするべきです。
また、@Fld にように現在グローバルとして使われていないのに名残として
残ってしまっているものもあります。
が、これはもぉこのまま使うしかないようです。
注意:
$debug だけは全部小文字でグローバル変数という例外です。
便利だからというのと、歴史的にそうなっているというだけなので
今後そういう変数名は作られることはありません。
また、昔ユーザ定義で今は内部変数扱いになった $ML_MEMBER_CHECK も
例外です。
○ 小文字は基本的にlocal variableで、大抵はsubroutineの先頭でlocal宣言
されています。
○ 補足
なお、Directory を定義する $*_DIR タイプの変数には
$*_DIR $DIR からの相対パス
$FP_*_DIR 絶対パス
の2種類があります。 $FP_*_DIR タイプの変数は自動的に変換され定義され
ます。基本的には絶対パスが使われます。$FP_ の変数は fml.pl の初期化で
自動的に補正されつつ設定されます。ほとんど全ての場面で絶対パスを用いま
す。
$FP_TMP_DIR
$FP_VARDB_DIR
$FP_VARLOG_DIR
$FP_VARRUN_DIR
$FP_VAR_DIR
$FP_SPOOL_DIR
7.2 関数名の Naming Convention
一部の例外を除いて”1単語の先頭一文字が大文字、残りは小文字”の塊から
なる単語です。基本的に subroutine の名前はX11風だったりします。最近の
はlisp風味も混ざってます:-) #おおむねX11風ですね
○ fml 1.5 以降では若干例外があります。
ファイル操作をする関数で
変換インターフェイスとしての f_関数 名
#いつか、なくなるだろう
と
そのモードのコンストラクタ Cnstr_関数 名
そのモードのディストラクタ Destr_関数 名
が例外です。「将来 replace するべきです」と当時言ったまま replace され
ないままですが:-)
7.3 %Envelope (ハッシュテーブル)
%Envelope には今 fml を起動したメールの内容(ヘッダ、ヘッダの各フィール
ド、本文等)が格納されます。また、そのメールに対しどういうMETHODでREPLY
を返すべきか?や、sendmailとの通信等の設定に関しての付加情報も
%Envelope を通じて渡されます。それはこのメールに対する METHOD の定義と
みなしているからです。
sendmail の struct envelope e; に対応するものです。
しかし、perl 4 を本来ターゲットにしているため
$Envelope->$Header->$From = "uja@domain";
のような使い方はしません(できない)。これと同様のことを意図したシンタッ
クスが
$Envelope{"h:From:"} = "uja@domain";
で表現されています。 h = header で From: はわざと Field だとわかりやす
いように : まで含めています。
以下 %EnvelopeのKEYについて説明します。
#ハッシュなので、KEY => VALUE が $Envelope{KEY} の値が VALUE です
h: ではじまるものKEYは「ヘッダの各フィールドのデータ」です。
h:Capital: 補正されたデータ e.g. h:Subject:
h:lower-case: 元メールのデータ e.g. h:subject:
それ以外に その Envelope のメールをどういうモードで処理するか?
や、そのメールへのREPLY、エラーレポート処理をどうするか?
というMETHODの指定等の付加情報も付け加えることもあります。
[ヘッダ関係]
h:field: 上述のヘッダ:フィールド:設定値
fh:field: field(小文字) は fml.pl がある値を強制する
例: fh:to: は To: を $Envelope{'fh:to:'} の値にする
oh:field: field は original のヘッダフィールドを使う
GH:field: コマンドの結果を返すメールは GenerateHeader() という
ルーチンでメールヘッダを生成する。
そこでの値を変更したいならこのKEYを使う。
Addr2Reply: コマンドの結果の返事を返すアドレス
reply-to: > From:
[メールが呼び出すべきモードやメソッドのConfig]
macro:x x は sendmail の $x に対応する内容を保存
mode:x モード設定値
mci:mailer mci は Mail Connection Information (MCI)
mci:mailer は ipc(SMTP) か prog(exec sendmail)
のどちらかである
[内部表現]
Header 元メールのヘッダ
Body 元メールのメール本文
Hdr 送り出すメールのヘッダ(&Smtpの直前に生成される)
message メールをサーバへ送ったユーザへのメッセージ
error 管理者への(エラー)メッセージ
MIME ISO-2022-JP is detected (toggle Flag)
UnixFrom Unix From
Hdr2add $SUPERFLUOUS_HEADER の時につかうバッファ
nclines # command の行数
nlines メール本文の行数
preamble メール本文の前につける文章
trailer メール本文の後につける文章
tmp:x temporary used
例: Subject:
$Envelope{'h:subject:'} は来たメールそのもの
$Envelope{'h:Subject:'} は来たメールの Re: をとり
必要なら [Elena 100] のようなものを処理したもの
のような違いがある。配送されるヘッダと大文字ではじまる単語は次のように
対応する。
配送メールのヘッダ: %Envelope
Field key in %Envelope
---------------------------------------
Date: h:Date:
From: h:From:
To: h:To:
Subject: h:Subject:
7.4 データ構造の初期化
各データの初期化は次の順序で行なわれる。
$DIR $LIBDIR @INC の初期化
&InitConfig
&SetDefaults
%Envelope
DNS, @HdrFieldsOrder, and others
&LoadConfig
$DIR/config.ph
sitedef.ph
&SetOpts
command line options
COMPATIBILITY CODE
&Parse
%Envelope へ Header Body 等の元々の内容を保存
&GetFieldsFromHeader
%Envelope へ h:field: および h:Field: をセット
&FixHeaderFields
h:Field: への各種補正を行なう
&CheckCurrentProc
%Envelope による設定、動作モードチェック
この後各種フックがそれぞれの場所で評価される。
Example:
$START_HOOK
$SMTP_OPEN_HOOK
$FML_EXIT_HOOK
この後ロックされ、ロック下でクリティカルな作業が行なわれる。作業が終る
まで alarm(3) による割り込み以外ではこのロックははずれない。
7.5 ディレクトリ変数
6.0
起動時の一番最初の段階では $DIR $LIBDIR @INC という変数の設定を筆頭に
各種変数の初期化が行なわれます(上述)。$DIR $LIBDIR @INC が起動時にどう
評価され使われているかは「fml の基本動作と起動オプション…」の章を見る
と分かるでしょう。
6.0
以下では DIRECTORY 一覧を示します。
@INC (参考)
これは Perl の include file の search path
$DIR @INC(original) $LIBDIR ...
の順番に探される。
$DIR
config.phのある場所、いわゆるMLのHOME
@INC の先頭に設定される
$SPOOL_DIR $DIR/spool
MLの記事を格納する場所
[$DIRからの相対パスで設定されるもの]
[FULL PATH 化された変数]
$FP_TMP_DIR $DIR/$TMP_DIR
$FP_VARDB_DIR $DIR/$VARDB_DIR
$FP_VARLOG_DIR $DIR/$VARLOG_DIR
$FP_VARRUN_DIR $DIR/$VARRUN_DIR
$FP_VAR_DIR $DIR/$VAR_DIR
$FP_SPOOL_DIR $DIR/$SPOOL_DIR
7.6 $TMP_DIR について
MLサーバの作業エリアにはデフォールトでは $DIR/tmp (つまり $TMP_DIR =
'./tmp';) を使います。変更したい場合は $TMP_DIR を変更して下さい。
/tmp とか /usr/tmp とかは万が一ファイルが残ると嫌なので使いません。
private communication のファイルを public な場所にファイルを残すことは
しないためです。
その他にも 4.4BSD 風の directory 構造の中に各種のログやキャッシュが保
存されます。
7.7 設定ファイル群
8.0
[メンバーのリスト関係]
$MEMBER_LIST $DIR/members
8.0
メンバーリスト(認証のみに使う)
$ACTIVE_LIST $DIR/actives
8.0
MLの配送リスト
$REJECT_ADDR_LIST $DIR/spamlist
../filter 2.14
投稿/コマンド/自動登録をはじめとして全ての場合について、弾きた
いアドレスのリスト。自動的に登録する機能もある。
[各種の説明、ご案内関係のファイル]
$OBJECTIVE_FILE $DIR/objective
MLの目的を書いたファイル
$GUIDE_FILE $DIR/guide
MLの一般向けご案内(ガイド)
$HELP_FILE $DIR/help
MLのHELP、コマンドの解説等
$DENY_FILE $DIR/deny
MLがメンバーチェックをしている時
メンバー以外からメールが来た時に返す断りの文章
$WELCOME_FILE $DIR/guide
../how_to_subscribe 4.0
MLが自動登録の時、登録時に送ってあげる文章
$CONFIRMATION_FILE $DIR/confirm
../how_to_subscribe 4.9
自動登録で confirmation モードの際 reply を返す
confirmation の説明のファイル
[ログファイル関係]
$LOGFILE $DIR/log
ログ
$MGET_LOGFILE $DIR/log
5.0
mgetのログ。デフォールトでは↑ログファイルと同じ
$SMTPLOG $VARLOG_DIR/_smtplog
プロセス間通信(SMTP)のログ(デバッグの役に立つ)
$SUMMARY_FILE $DIR/summary
MLの記事のサマリ
$SEQUENCE_FILE $DIR/seq
MLの記事番号
$MSEND_RC $VARLOG_DIR/msendrc
../digest 2.0
まとめおくりの制御ファイル
$LOCK_FILE $VARRUN_DIR/lockfile.v7
flock() を使わない時のロックで使うファイル
$LOG_MESSAGE_ID $VARRUN_DIR/msgidcache
message-id cache ファイル
(ML自身での無限ループを防ぐためのキャッシュ)
$MESSAGE_ID_CACHE_BUFSIZE
Message-ID cache ファイルサイズ
$INDEX_FILE $DIR/index
このファイルはなくても構わない。indexコマンドで表示したい内容
を書く。このファイルがない場合はその場でMLのHOME内容を調べて返
す。
7.8 単に便利なためにある変数
$DO_NOTHING
何もしないという分岐をするための変数。特殊なサーバを作る時や
特別なHOOKをかけたりする場合に有用である。
$NULL
ダミー:-) # 別にこんな変数いらない
#define null (char *)0 みたいなものだと思ってもらえば良い
$FML
カーネル内のプロセステーブルを書き変える際に使う変数
$FACE_MARK
(単なる愛敬:-)。各種リクエストの結果を返す時にお別れの文章の腋につける
e.g. P(^^)
Be seeing you P(^^)
のようになる。
$INCLUDE_SIM_PATH
Simulation で使う。気にしないで下さい:)
$UNISTD
Declare "Unix Standard" flag. undefined on Windows NT4
$LOCKFILE
lock file variable in some libraries. It may be uncontrolled
by a user.
%MAKE_FML
config.ph に現れるハッシュ %MAKE_FML は makefml で使うためのものです。
makefml 以外では使われません。現在では使われていません、無視して下さい。
○ 古い変数として他の名前に置き換えられたもの
$GUIDE_REQUEST -> $GuideRequest
$RPG_ML_FORM_FLAG -> $COMMAND_SYNTAX_EXTENSION
○ obsolete なもの
$NON_PORTABILITY
7.9 内部で使われている変数を調べるには?
config.ph で
$DUMPVAR = 1;
やコマンドラインで
fml.pl --DUMPVAR 引数
として fml を呼び出すと全ての変数を dump します。この場合はPerlについ
てくる dumpvar.pl ライブラリを利用し、名前空間から変数リストを引っ張り
出しています。
ちなみに fmlserv.pl は同様のやり方で名前空間の switch を利用して複数の
MLを疑似的に実行しています。
[PREVIOUS CHAPTER]
[NEXT CHAPTER]