[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]