補足: 『fml4と fml8 のコードの書き方はどのくらい違うか?』

コマンドの典型である『ファイルを送り返す』だけの help コマンドを例にとり、 相違点を説明しましょう。

fml4 では、適当な関数、たとえば myProcHelpFileSendBack を作り、 %LocalProcedure に書いておきます。

%LocalProcedure = (
                    'help',     'myProcHelpFileSendBack',
                );
myProcHelpFileSendBack をあえて書き下すと、つぎのようなものでしょう。
sub myProcHelpFileSendBack
{
    local($proc, *Fld, *e, *misc) = @_;
    my $UJA_FILE = "/some/where/help";
    &SendFile($Envelope{'Addr2Reply:'}, "UJA $ML_FN", $UJA_FILE);
}

一方、fml8 では help ファイルを送り返すコードの実体は FML::Command::User::help にあり、 FML::Process::Command クラスから (FML::Command の AUTOLOAD を経由して)呼び出されます。

Warning

全てのコマンドは FML::Command::User::コマンドもしくは FML::Command::Admin::コマンドクラスとして実装されています。なお makefml や CGI は FML::Command::Admin::コマンド を使います。コマンドメー ルは User や Admin を権限に応じて適宜使い分けます。

help コマンドの実体は FML::Command::User::help の process() 関数です。

sub process
{
    my ($self, $curproc, $optargs) = @_;
    my $config    = $curproc->{ config };
    my $charset   = $config->{ report_mail_charset_ja };
    my $help_file = $config->{ help_file };

    # template substitution: kanji code, $varname expansion et. al.
    my $params = {
        src         => $help_file,
        charset_out => $charset,
    };
    my $help_template = $curproc->reply_message_prepare_template( $params );

    if (-f $help_template) {
        $curproc->reply_message( {
            type        => "text/plain; charset=$charset",
            path        => $help_template,
            filename    => "help",
            disposition => "help",
        });
    }
    else {
        croak("no help file ($help_template)\n");
    }
}
ここで $curproc はハッシュリファレンスで、fml4 の %Envelope に概ね相 当します。名前の通り、UNIX カーネルでおなじみの current process 構造体 へのポインタのようなもので、プロセスに関連するいろいろなデータ構造やオ ブジェクトへのリファレンスを含んでいます。

変数ですが、fml4 では全てグローバルです。一方 fml8 では $config オ ブジェクトを通じてアクセスできる設定変数空間の中にあります。

reply_message_prepare_template() はメッセージテンプレートの中にある変 数の展開や文字コード変換を適宜行ないます。

$curproc->reply_message() は引数によって振舞いがことなりますが、 いずれにせよ、メッセージをメッセージキューに入れるメソッドです。

メッセージキューに入れられたメッセージ群は、プロセスの終了直前に受信者 ごとにメッセージがまとめられ一通のメールとして組み立てなおされます。メッ セージキューの種類がファイルとメッセージが混在している場合は適宜 MIME マルチパートのメッセージが生成されます。

Mail::Delivery クラスが送信処理を担当するモジュールです。生成されたメー ルは最終的に Mail::Delivery クラスへ渡され送信処理が行なわれます。

この仕組みは fml4 の Notify() と同様ですが、あらゆるメッセージがキュー に入れられ、最後に一気に処理されるという点で大きく異なります。

なお get コマンドなども同じキューイングの仕組みを使っています。つまり fml4 の Notify() 相当部分が(通常の記事配送以外の)あらゆる送信機能を 担当し、かつキューイングのみをしています。そしてキューイングされたメッ セージは最後に一気に処理されます。この点において、送信のキューイングの メカニズムは fml4 と大きく異なっています。

fml 8.0 (fml-devel) project homepage is www.fml.org/software/fml8/.
fml 4.0 project homepage is www.fml.org/fml/menu.ja.html.
about one floppy bsd routers, see www.bsdrouter.org/.
other free softwares are found at www.fml.org/software/.

author's homepage is www.fml.org/home/fukachan/.
Also, visit nuinui's world :) at www.nuinui.net.

For questions about FML, e-mail <fml-bugs@fml.org>.