[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.13
	投稿/コマンド/自動登録をはじめとして全ての場合について、弾きた
	いアドレスのリスト。自動的に登録する機能もある。
[各種の説明、ご案内関係のファイル]
	$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 5.0
	MLが自動登録の時、登録時に送ってあげる文章
	$CONFIRMATION_FILE       $DIR/confirm
../how_to_subscribe 5.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]