NONE TITLE 7.html
Keywords: NONE TITLE,fml, flexible mailing list manager, not listserv style but fmlserv emulates listserv or majordomo style

[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 	絶対パス

    の２種類があります。 $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

    一部の例外を除いて”１単語の先頭一文字が大文字、残りは小文字”の塊から
    なる単語です。基本的に 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 の先頭に設定される

    	$LIBDIR
    		fml.pl や libsmtp.pl 等の置き場所。
    		$DIR と同じでも良いし、別の場所で保守されていてもよい。
    		もともと複数のＭＬを扱うためにスプールと *.pl ファイル
    		群の置き場所をわけるために導入された。@INC の最後に入る。

    		なおコマンドラインに出てくるdirectoryはすべて @INC に
    		設定されるが、$DIR の直後の directory が $LIBDIR に設
    		定される。

    		@LIBDIR にも入っている

        	$SPOOL_DIR		$DIR/spool
    		ＭＬの記事を格納する場所

    	[$DIRからの相対パスで設定されるもの]

    	$TMP_DIR		tmp (temporary)	4.4BSD の /tmp
    	$VARDB_DIR		4.4BSD の /var/db (データベース)
    	$VARLOG_DIR		4.4BSD の /var/log に対応 ログが置かれる
    				backward compat のため
    				log 等のデフォールトは $DIR/log のままである
    				(本来は $VARLOG_DIR/log が望ましいだろうが)
    	$VARRUN_DIR		4.4BSD の /var/run pid-file 等はここ
    				なお cache もここにおいている。
    	$VAR_DIR		4.4BSD の /var

    	[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 について

    ＭＬサーバの作業エリアにはデフォールトでは $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

    	ＭＬの配送リスト

    	$REJECT_ADDR_LIST	$DIR/spamlist
    ../filter 2.13

    	投稿/コマンド/自動登録をはじめとして全ての場合について、弾きた
    	いアドレスのリスト。自動的に登録する機能もある。

    [各種の説明、ご案内関係のファイル]

    	$OBJECTIVE_FILE	 	$DIR/objective

    	ＭＬの目的を書いたファイル

    	$GUIDE_FILE		$DIR/guide

    	ＭＬの一般向けご案内（ガイド）

    	$HELP_FILE	 	$DIR/help

    	ＭＬのHELP、コマンドの解説等

    	$DENY_FILE	 	$DIR/deny

    	ＭＬがメンバーチェックをしている時
    	メンバー以外からメールが来た時に返す断りの文章

    	$WELCOME_FILE	 	$DIR/guide
    ../how_to_subscribe 4.0

    	ＭＬが自動登録の時、登録時に送ってあげる文章

    	$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 を利用して複数の
    ＭＬを疑似的に実行しています。

[PREVIOUS CHAPTER] [NEXT CHAPTER]