summaryrefslogtreecommitdiff
path: root/fml
diff options
context:
space:
mode:
authorfukachan <fukachan>2004-03-16 12:58:20 +0000
committerfukachan <fukachan>2004-03-16 12:58:20 +0000
commit04754dbac1da4f0d8877e56398033e6c62eb0e91 (patch)
tree6f43dc98056e0b4ced68b01437dd13becf5215c8 /fml
parentd7308cc59ef1f6806001dd1fba4d2c94da7730d1 (diff)
downloadfml8-snap-20040316.tar.gz
fml8-snap-20040316.tar.bz2
fml8-snap-20040316.zip
import basic implementation of config file merging system from fml4 to fml8.snap-20040316
Diffstat (limited to 'fml')
-rw-r--r--fml/lib/FML/Merge.pm238
-rw-r--r--fml/lib/FML/Merge/FML4/Config.pm266
-rw-r--r--fml/lib/FML/Merge/FML4/List.pm188
-rw-r--r--fml/lib/FML/Merge/FML4/config.txt2826
-rw-r--r--fml/lib/FML/Merge/FML4/config_ph.pm61
-rw-r--r--fml/lib/FML/Merge/Utils.pm61
6 files changed, 3640 insertions, 0 deletions
diff --git a/fml/lib/FML/Merge.pm b/fml/lib/FML/Merge.pm
new file mode 100644
index 00000000..dcc8d649
--- /dev/null
+++ b/fml/lib/FML/Merge.pm
@@ -0,0 +1,238 @@
+#-*- perl -*-
+#
+# Copyright (C) 2004 Ken'ichi Fukamachi
+# All rights reserved. This program is free software; you can
+# redistribute it and/or modify it under the same terms as Perl itself.
+#
+# $FML: @template.pm,v 1.8 2004/01/01 07:29:27 fukachan Exp $
+#
+
+package FML::Merge;
+use strict;
+use vars qw(@ISA @EXPORT @EXPORT_OK $AUTOLOAD);
+use Carp;
+
+use FML::Merge::Utils;
+push(@INC, qw(FML::Merge::Utils));
+
+
+=head1 NAME
+
+FML::Merge - merge other system configurations to fml8 ones.
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+=cut
+
+
+
+# Descriptions: constructor.
+# Arguments: OBJ($self) OBJ($curproc) HASH_REF($params)
+# Side Effects: none
+# Return Value: OBJ
+sub new
+{
+ my ($self, $curproc, $params) = @_;
+ my ($type) = ref($self) || $self;
+ my $me = {
+ _curproc => $curproc,
+ _params => $params,
+ };
+
+ # import variables: ml_* ...
+ for my $x (keys %$params) {
+ $me->{ "_$x" } = $params->{ $x } if defined $params->{ $x };
+ };
+
+ # back up to $ml_home_dir/.fml4rc/ directory.
+ use File::Spec;
+ my $ml_home_dir = $params->{ ml_home_dir } || '';
+ if ($ml_home_dir) {
+ my $x_dir = File::Spec->catfile($ml_home_dir, ".fml4rc");
+ $me->{ _backup_dir } = $x_dir;
+ $curproc->mkdir($x_dir, "mode=private") unless -d $x_dir;
+ }
+ else {
+ croak("specify \$ml_home_dir");
+ }
+
+ return bless $me, $type;
+}
+
+
+# Descriptions: specify target system.
+# Arguments: OBJ($self) STR($system)
+# Side Effects: none
+# Return Value: none
+sub set_target_system
+{
+ my ($self, $system) = @_;
+
+ # dummy yet.
+}
+
+
+=head1 BACK UP CONFIGURATION FILES
+
+=cut
+
+
+# Descriptions: back up old configuration files.
+# Arguments: OBJ($self)
+# Side Effects: move or copy files.
+# Return Value: none
+sub backup_old_config_files
+{
+ my ($self) = @_;
+
+ use FML::Merge::FML4::Config;
+ my $config = new FML::Merge::FML4::Config;
+ my $files = $config->get_old_config_files();
+ for my $f (@$files) {
+ my $mode = $self->_need_copy() ? "copy" : $config->backup_mode($f);
+ my $src = $self->old_file_path($f);
+ my $dst = $self->backup_file_path($f);
+
+ if ($mode eq 'move') {
+ printf STDERR "mv %-30s %-30s\n", $src, $dst;
+ }
+ elsif ($mode eq 'copy') {
+ printf STDERR "cp %-30s %-30s\n", $src, $dst;
+ }
+ else {
+ print STDERR "unknown mode (DO NOTHING).\n";
+ }
+ }
+}
+
+
+# Descriptions: check if we always need copy files to back up dir.
+# Arguments: OBJ($self)
+# Side Effects: none
+# Return Value: NUM(1 or 0)
+sub _need_copy
+{
+ my ($self) = @_;
+ my $old_home_dir = $self->{ _src_dir };
+ my $ml_home_dir = $self->{ _ml_home_dir };
+
+ if ($old_home_dir ne $ml_home_dir) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+}
+
+
+=head1 DISABLE INCLUDE FILES
+
+To cause temporary failure, disable old include* files by changing it
+to "exit 75".
+
+Code 75 depends on the value of EX_TEMPFAIL of your system. See
+/usr/include/sysexit.h for more details.
+
+For example, the value of NetBSD follows.
+
+ EX_TEMPFAIL -- temporary failure, indicating something that
+ is not really an error. In sendmail, this means
+ that a mailer (e.g.) could not create a connection,
+ and the request should be reattempted later.
+
+=cut
+
+
+sub disable_include_files
+{
+ my ($self) = @_;
+
+ use FML::Merge::FML4::Config;
+ my $config = new FML::Merge::FML4::Config;
+ my $files = $config->get_old_include_files();
+
+ for my $f (@$files) {
+ my $file = $self->old_file_path($f);
+ print STDERR "disable $file\n";
+ }
+}
+
+
+=head1
+
+=cut
+
+
+sub convert_list_files
+{
+ my ($self) = @_;
+ my $curproc = $self->{ _curproc };
+ my $params = $self->{ _params } || {};
+
+ use FML::Merge::FML4::List;
+ my $list = new FML::Merge::FML4::List $curproc, $params;
+ $list->convert();
+}
+
+
+=head1 UTILITIES
+
+=cut
+
+
+sub old_file_path
+{
+ my ($self, $file) = @_;
+ my $old_home_dir = $self->{ _src_dir };
+
+ use File::Spec;
+ return File::Spec->catfile($old_home_dir, $file);
+}
+
+
+sub new_file_path
+{
+ my ($self, $file) = @_;
+ my $ml_home_dir = $self->{ _ml_home_dir };
+
+ use File::Spec;
+ return File::Spec->catfile($ml_home_dir, $file);
+}
+
+
+sub backup_file_path
+{
+ my ($self, $file) = @_;
+ my $back_up_dir = $self->{ _backup_dir };
+
+ use File::Spec;
+ return File::Spec->catfile($back_up_dir, $file);
+}
+
+
+=head1 CODING STYLE
+
+See C<http://www.fml.org/software/FNF/> on fml coding style guide.
+
+=head1 AUTHOR
+
+Ken'ichi Fukamachi
+
+=head1 COPYRIGHT
+
+Copyright (C) 2004 Ken'ichi Fukamachi
+
+All rights reserved. This program is free software; you can
+redistribute it and/or modify it under the same terms as Perl itself.
+
+=head1 HISTORY
+
+FML::Merge appeared in fml8 mailing list driver package.
+See C<http://www.fml.org/> for more details.
+
+=cut
+
+
+1;
diff --git a/fml/lib/FML/Merge/FML4/Config.pm b/fml/lib/FML/Merge/FML4/Config.pm
new file mode 100644
index 00000000..0ccaaf70
--- /dev/null
+++ b/fml/lib/FML/Merge/FML4/Config.pm
@@ -0,0 +1,266 @@
+#-*- perl -*-
+#
+# Copyright (C) 2004 Ken'ichi Fukamachi
+# All rights reserved. This program is free software; you can
+# redistribute it and/or modify it under the same terms as Perl itself.
+#
+# $FML: @template.pm,v 1.8 2004/01/01 07:29:27 fukachan Exp $
+#
+
+package FML::Merge::FML4::Config;
+use strict;
+use vars qw(@ISA @EXPORT @EXPORT_OK $AUTOLOAD);
+use Carp;
+
+
+=head1 NAME
+
+FML::Merge::FML4::Config - what files we need to merge
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+=head1 METHODS
+
+=head2 C<new()>
+
+=cut
+
+
+# Descriptions: constructor.
+# Arguments: OBJ($self) OBJ($curproc) HASH_REF($config)
+# Side Effects: none
+# Return Value: OBJ
+sub new
+{
+ my ($self, $curproc, $config) = @_;
+ my ($type) = ref($self) || $self;
+ my $me = {};
+ return bless $me, $type;
+}
+
+
+# target files to back up.
+my $ml_home_dir_backup_target_files = {
+
+ #
+ # main configuration files
+ #
+ 'cf' => {
+ 'backup_mode' => 'move',
+ },
+
+ 'config.ph' => {
+ 'backup_mode' => 'copy',
+ },
+
+
+ #
+ # system
+ #
+ 'aliases' => {
+ 'backup_mode' => 'move',
+ },
+
+ 'crontab' => {
+ 'backup_mode' => 'move',
+ },
+
+ 'fmlwrapper.c' => {
+ 'backup_mode' => 'move',
+ },
+
+ 'fmlwrapper.h' => {
+ 'backup_mode' => 'move',
+ },
+
+
+ #
+ # message files
+ #
+ 'confirm' => {
+ 'backup_mode' => 'move',
+ },
+
+ 'deny' => {
+ 'backup_mode' => 'move',
+ },
+
+ 'guide' => {
+ 'backup_mode' => 'copy',
+ },
+
+ 'help' => {
+ 'backup_mode' => 'move',
+ },
+
+ 'help-admin' => {
+ 'backup_mode' => 'move',
+ },
+
+ 'objective' => {
+ 'backup_mode' => 'move',
+ },
+
+ 'welcome' => {
+ 'backup_mode' => 'move',
+ },
+
+
+ #
+ # include*
+ #
+ 'include' => {
+ 'backup_mode' => 'copy',
+ 'type' => 'include',
+ },
+
+ 'include-ctl' => {
+ 'backup_mode' => 'copy',
+ 'type' => 'include',
+ },
+
+ 'include-mead' => {
+ 'backup_mode' => 'copy',
+ 'type' => 'include',
+ },
+
+
+ #
+ # list files
+ #
+
+ # member list files
+ 'actives' => {
+ 'backup_mode' => 'move',
+ 'type' => 'list',
+ },
+
+ 'members' => {
+ 'backup_mode' => 'copy',
+ 'type' => 'list',
+ },
+
+ # admin member list files
+ 'members-admin' => {
+ 'backup_mode' => 'copy',
+ 'type' => 'list',
+ },
+
+ # moderators
+ 'moderators' => {
+ 'backup_mode' => 'copy',
+ 'type' => 'list',
+ },
+
+
+ #
+ # password files
+ #
+ 'etc/passwd' => {
+ 'backup_mode' => 'move',
+ 'type' => 'list',
+ },
+
+
+ #
+ # misc
+ #
+ 'Makefile' => {
+ 'backup_mode' => 'move',
+ },
+};
+
+
+# Descriptions: return files to back up.
+# Arguments: OBJ($self)
+# Side Effects: none
+# Return Value: ARRAY_REF
+sub get_old_config_files
+{
+ my ($self) = @_;
+
+ my (@files) = keys %$ml_home_dir_backup_target_files;
+ return \@files
+}
+
+
+# Descriptions: return list of include* files.
+# Arguments: OBJ($self)
+# Side Effects: none
+# Return Value: ARRAY_REF
+sub get_old_include_files
+{
+ my ($self) = @_;
+ my (@files) = ();
+
+ for my $f (keys %$ml_home_dir_backup_target_files) {
+ my $type = $ml_home_dir_backup_target_files->{ $f }->{ type } || '';
+ if ($type eq 'include') {
+ push(@files, $f);
+ }
+ }
+
+ return \@files
+}
+
+
+# Descriptions: return list of list* files.
+# Arguments: OBJ($self)
+# Side Effects: none
+# Return Value: ARRAY_REF
+sub get_old_list_files
+{
+ my ($self) = @_;
+ my (@files) = ();
+
+ for my $f (keys %$ml_home_dir_backup_target_files) {
+ my $type = $ml_home_dir_backup_target_files->{ $f }->{ type } || '';
+ if ($type eq 'list') {
+ push(@files, $f);
+ }
+ }
+
+ return \@files
+}
+
+
+sub backup_mode
+{
+ my ($self, $file) = @_;
+
+ if (defined $ml_home_dir_backup_target_files->{$file}->{backup_mode}) {
+ my $mode = $ml_home_dir_backup_target_files->{$file}->{backup_mode};
+ return $mode;
+ }
+ else {
+ return 'unknown';
+ }
+}
+
+
+=head1 CODING STYLE
+
+See C<http://www.fml.org/software/FNF/> on fml coding style guide.
+
+=head1 AUTHOR
+
+Ken'ichi Fukamachi
+
+=head1 COPYRIGHT
+
+Copyright (C) 2004 Ken'ichi Fukamachi
+
+All rights reserved. This program is free software; you can
+redistribute it and/or modify it under the same terms as Perl itself.
+
+=head1 HISTORY
+
+FML::Merge::FML4::Config appeared in fml8 mailing list driver package.
+See C<http://www.fml.org/> for more details.
+
+=cut
+
+
+1;
diff --git a/fml/lib/FML/Merge/FML4/List.pm b/fml/lib/FML/Merge/FML4/List.pm
new file mode 100644
index 00000000..52f59b09
--- /dev/null
+++ b/fml/lib/FML/Merge/FML4/List.pm
@@ -0,0 +1,188 @@
+#-*- perl -*-
+#
+# Copyright (C) 2004 Ken'ichi Fukamachi
+# All rights reserved. This program is free software; you can
+# redistribute it and/or modify it under the same terms as Perl itself.
+#
+# $FML: @template.pm,v 1.8 2004/01/01 07:29:27 fukachan Exp $
+#
+
+package FML::Merge::FML4::List;
+use strict;
+use vars qw(@ISA @EXPORT @EXPORT_OK $AUTOLOAD);
+use Carp;
+
+=head1 NAME
+
+FML::Merge::FML4::List - convert member list files.
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+=head1 METHODS
+
+=head2 C<new()>
+
+=cut
+
+
+sub new
+{
+ my ($self, $curproc, $params) = @_;
+ my ($type) = ref($self) || $self;
+ my $me = {
+ _curproc => $curproc,
+ _params => $params,
+ };
+
+ return bless $me, $type;
+}
+
+
+sub convert
+{
+ my ($self) = @_;
+ my $curproc = $self->{ _curproc };
+ my $params = $self->{ _params } || {};
+
+ use FML::Merge;
+ my $merge = new FML::Merge $curproc, $params;
+
+ use FML::Merge::FML4::Config;
+ my $config = new FML::Merge::FML4::Config;
+ my $files = $config->get_old_list_files();
+ my $fp;
+
+ for my $file (@$files) {
+ $fp = "_convert_$file";
+ $fp =~ s/-/_/g;
+ $fp =~ s@/@_@g;
+ if ($self->can($fp)) {
+ $self->$fp($merge);
+ }
+ else {
+ croak("cannot convert $file");
+ }
+ }
+}
+
+
+sub _convert_actives
+{
+ my ($self, $merge) = @_;
+ my $src = $merge->backup_file_path('actives');
+ my $dst = $merge->new_file_path('recipients');
+
+ $self->_write_without_comment($src, $dst);
+}
+
+
+sub _convert_members
+{
+ my ($self, $merge) = @_;
+ my $src = $merge->backup_file_path('members');
+ my $dst = $merge->new_file_path('members');
+
+ $self->_write_without_comment($src, $dst);
+}
+
+
+sub _convert_members_admin
+{
+ my ($self, $merge) = @_;
+ my $src = $merge->backup_file_path('members-admin');
+ my $dst = $merge->new_file_path('members-admin');
+
+ $self->_write_without_comment($src, $dst);
+
+ $dst = $merge->new_file_path('recipients-admin');
+ $self->_write_without_comment($src, $dst);
+}
+
+
+sub _convert_moderators
+{
+ my ($self, $merge) = @_;
+ my $src = $merge->backup_file_path('moderators');
+ my $dst = $merge->new_file_path('members-moderator');
+
+ $self->_write_without_comment($src, $dst);
+
+ $dst = $merge->new_file_path('recipients-moderator');
+ $self->_write_without_comment($src, $dst);
+}
+
+
+sub _convert_etc_passwd
+{
+ my ($self, $merge) = @_;
+ my $src = $merge->backup_file_path('etc/passwd');
+ my $dst = $merge->new_file_path('etc/passwd-admin');
+
+ print STDERR "warning: etc/passwrd conversion not yet implemented\n";
+}
+
+
+sub _write_without_comment
+{
+ my ($self, $src, $dst) = @_;
+ my $tmp = sprintf("%s.new.%s", $dst, $$);
+
+ unless (-f $src) {
+ print STDERR "ignore $src -> $dst\n";
+ return;
+ }
+
+ print STDERR "cat $src > $dst\n";
+ return;
+
+ use FileHandle;
+ my $rh = new FileHandle $src;
+ my $wh = new FileHandle "> $tmp";
+ if (defined $rh && defined $wh) {
+ my $buf;
+
+ LINE:
+ while ($buf = <$rh>) {
+ next LINE if $buf =~ /^\#/o;
+ print $wh $buf;
+ }
+ $wh->close();
+ $rh->close();
+
+ unless (rename($tmp, $dst)) {
+ croak("cannot rename $tmp $dst");
+ }
+ }
+ else {
+ croak("cannot open $src") unless defined $rh;
+ croak("cannot open $tmp") unless defined $wh;
+ }
+}
+
+
+=head1 CODING STYLE
+
+See C<http://www.fml.org/software/FNF/> on fml coding style guide.
+
+=head1 AUTHOR
+
+Ken'ichi Fukamachi
+
+=head1 COPYRIGHT
+
+Copyright (C) 2004 Ken'ichi Fukamachi
+
+All rights reserved. This program is free software; you can
+redistribute it and/or modify it under the same terms as Perl itself.
+
+=head1 HISTORY
+
+FML::Merge::FML4::List appeared in fml8 mailing list driver package.
+See C<http://www.fml.org/> for more details.
+
+=cut
+
+
+1;
diff --git a/fml/lib/FML/Merge/FML4/config.txt b/fml/lib/FML/Merge/FML4/config.txt
new file mode 100644
index 00000000..27248096
--- /dev/null
+++ b/fml/lib/FML/Merge/FML4/config.txt
@@ -0,0 +1,2826 @@
+#
+# $FML$
+# BASED ON fml/cf/MANIFEST 1.104
+#
+# .use そのまま使う
+# .auto fml8 で自動設定される値を使う
+# .convert よろしく変換して頑張る
+# .fml8_default fml8 のデフォルトと同じ、気にするな
+# .not_yet_implemented まだ、実装されてない
+# .not_yet_configurable まだ、設定変更できない
+# .unavailable 対応するものがない、実装予定もない
+# .ignore 実装方式が違うので、変換が無意味
+#
+
+
+#########################################################################
+##### Section: Fundamental Configuration (CF Version, debug, Language) ##
+# # config.ph configuration version
+# # define 5.0 for fml 3.0.
+# # define 6.0 for fml 3.0 + fukui-newconfig.
+# CFVersion: 6.1
+.if CFVersion
+ .unavailable
+
+
+# # global debug option. if non-nil, debug mode.
+# # In debug mode, fml does not distribute posted articles.
+# # value: 1/0
+# debug: 0
+
+
+# # fml 3.0 generates template files, $DIR/{help,welcome} in $LANGUAGE
+# # in "makefml newml". You define this variable in installation.
+# # The value is controlled by /usr/local/fml/.fml/system.
+# # value: Japanese/English
+# LANGUAGE: Japanese
+.if LANGUAGE == Japanese
+
+ language_preference_order = ja en
+
+.if LANGUAGE == English
+
+ language_preference_order = en ja
+
+
+# # Error message language fml returns.
+# # If $MESSAGE_LANGUAGE is not defined, fml 3.0 uses $LANGUAGE.
+# # &Mesg() tries to translate the given message to this language.
+# # value: Japanese/English
+# MESSAGE_LANGUAGE:
+.if MESSAGE_LANGUAGE == Japanese
+
+ language_preference_order = ja en
+
+.if MESSAGE_LANGUAGE == English
+
+ language_preference_order = en ja
+
+
+# # ## Sub Section: DNS ##
+# # fml automatically set up DNS for this host, but check it again by yourself.
+# #
+# # DOMAINNAME the domain name e.g. fml.org
+# # FQDN Fully Qualified Domain Name e.g. beth.fml.org
+# #
+# # value: string
+# DOMAINNAME: &fix:dn phys.titech.ac.jp
+.if DOMAINNAME
+ .auto
+
+
+# FQDN: &fix:fqdn axion.phys.titech.ac.jp
+.if FQDN
+ .auto
+
+
+#########################################################################
+##### Section: Mailing List Policy (for Post, Commands), Maintainer ###
+# #
+# # $MAIL_LIST is the address for post. For example 'elena@fml.org'.
+# #
+# # $PERMIT_POST_FROM is one of "anyone", "members_only" and "moderator".
+# # It defines who can post to this ML.
+# # When post from not a member is rejected,
+# # fml calls $REJECT_POST_HANDLER.
+# # $REJECT_POST_HANDLER is one of "reject", "auto_subscribe" and "ignore".
+# # HISTORY: you can use "auto_regist" used in fml 2.x.
+# #
+# # value: string
+# MAIL_LIST:
+# PERMIT_POST_FROM: members_only
+# REJECT_POST_HANDLER: reject
+
+.if MAIL_LIST
+
+ .convert (article_post_address = MAIL_LIST)
+
+
+.if PERMIT_POST_FROM == anyone
+
+ article_post_restrictions = reject_system_special_accounts permit_anyone
+
+.if PERMIT_POST_FROM == members_only
+
+ .if REJECT_POST_HANDLER == reject
+
+ article_post_restrictions = reject_system_special_accounts permit_member_maps reject
+
+ .if REJECT_POST_HANDLER == auto_subscribe
+ .unavailable
+
+ .if REJECT_POST_HANDLER == ignore
+ .unavailable
+
+.if PERMIT_POST_FROM == moderator
+ .not_yet_implemented
+
+
+
+# # $CONTROL_ADDRESS is the address you send a command request to.
+# # For example 'elena-ctl@fml.org'.
+# #
+# # $PERMIT_COMMAND_FROM is one of "anyone", "members_only" and "moderator".
+# # It defines who can post to this ML.
+# # When command request from not a member is rejected,
+# # fml calls $REJECT_COMMAND_HANDLER.
+# #
+# # $REJECT_COMMAND_HANDLER is one of "reject", "auto_subscribe" and "ignore".
+# # HISTORY: you can use "auto_regist" used in fml 2.x.
+# #
+# # Typical Configuration is
+# #
+# # (default)
+# # $PERMIT_COMMAND_FROM = "members_only";
+# # $REJECT_COMMAND_HANDLER = "reject";
+# #
+# # (automatic subscribe: fml automatically handles subscribe request)
+# # $PERMIT_COMMAND_FROM = "members_only";
+# # $REJECT_COMMAND_HANDLER = "auto_subscribe";
+# #
+# # value: string
+# CONTROL_ADDRESS:
+# PERMIT_COMMAND_FROM: members_only
+# REJECT_COMMAND_HANDLER: reject
+
+.if CONTROL_ADDRESS
+
+ .convert (command_mail_address = CONTROL_ADDRESS)
+
+
+.if PERMIT_COMMAND_FROM == anyone
+
+ command_mail_restrictions = reject_system_special_accounts permit_anyone
+
+
+.if PERMIT_COMMAND_FROM == members_only
+
+ .if REJECT_COMMAND_HANDLER == reject
+ .not_yet_implemented
+
+ .if REJECT_COMMAND_HANDLER == auto_subscribe
+ .fml8_default
+
+ .if REJECT_COMMAND_HANDLER == ignore
+ .not_yet_implemented
+
+
+.if PERMIT_COMMAND_FROM == moderator
+ .not_yet_implemented
+
+
+
+# # obsolete (though you can use it)
+# # When $MAIL_LIST_ACCEPT_COMMAND = 1,
+# # both $MAIL_LIST and $CONTROL_ADDRESS accept commands
+# # which format is "# command".
+# # value: 1/0
+# MAIL_LIST_ACCEPT_COMMAND:
+.if MAIL_LIST_ACCEPT_COMMAND
+ .unavailable
+
+
+# # ## Sub Section: Maintainer ##
+# # mailing list maintainer/administrator address e.g. 'elena-admin@fml.org'.
+# # $MAINTAINER != $MAIL_LIST IS REQUIRED AGAINST MAIL LOOP!
+# # value: string
+# MAINTAINER:
+.if MAINTAINER
+
+ .convert (maintainer = MAINTAINER)
+
+
+# MAINTAINER_SIGNATURE:
+.if MAINTAINER_SIGNATURE
+ .unavailable
+
+
+# # ## Sub Section: ML_FN ##
+# # obsolete
+# #
+# # You can enforce To: field of posted article by rewriting it.
+# # To: $MAIL_LIST $ML_FN => To: Elena@fml.org (Elena Lolabrigita ML)
+# #
+# # value: string
+# ML_FN:
+.if ML_FN
+ .unavailable
+
+
+
+#########################################################################
+## ### Section: Directory ###
+## $*DIR variable is relative under $DIR (defined in fml initialization phase).
+## $FP*DIR is fully pathed directory name for each $*DIR variable.
+
+# # article spool
+# # value: directory string
+# SPOOL_DIR: spool
+.if SPOOL_DIR == spool
+
+ spool_dir = SPOOL_DIR
+
+
+# # tmp, after chdir, under DIR
+# # value: directory string
+# TMP_DIR: tmp
+.if TMP_DIR == tmp
+ .auto
+
+
+# # multi-purpose log, temporary, transient, and spool files (4.4BSD style)
+# # $LOGFILE and $SPOOL_DIR is exceptional but others is under var/.
+# # value: directory string
+# VAR_DIR: var
+.if VAR_DIR == var
+ .auto
+
+
+# VARLOG_DIR: var/log
+.if VARLOG_DIR == var/log
+ .ignore
+
+
+# VARRUN_DIR: var/run
+.if VARRUN_DIR == var/run
+ .ignore
+
+
+# VARDB_DIR: var/db
+.if VARDB_DIR == var/db
+ .auto
+
+
+
+#########################################################################
+##### Section: Manual Registration ###
+# #
+# # Term "Manual Registration" may be ambiguous but it implies
+# # ML maintainer needs to do some action to add a new member.
+# # When the maintainer receives subscribe request, he/she
+# # 1. remote login to the fml host and edit actives/members
+# # 2. remote login to the fml host and run "makefml add ML address"
+# # 3. send a command to add an address e.g. "admin add address".
+# # You need to enable remote administration function to do it.
+# # See "remote administration" section for more details.
+# #
+# # On contrary, "automatic registration" is fml does everything
+# # to add a new member except for some error cases.
+# #
+# # only support 'confirmation' or 'forward_to_admin'
+# # In "confirmation", fml confirms the subscribe request is valid to
+# # avoid a tricky attack.
+# # If "forward_to_admin" is selected, subscribe request is forwarded
+# # to $MAINTAINER without further check.
+# #
+# # value: confirmation/forward_to_admin
+# MANUAL_REGISTRATION_TYPE: confirmation
+.if MANUAL_REGISTRATION_TYPE == confirmation
+ .not_yet_implemented
+
+.if MANUAL_REGISTRATION_TYPE == forward_to_admin
+ .not_yet_implemented
+
+
+# # value: directory string
+# MANUAL_REGISTRATION_CONFIRMATION_FILE: $DIR/confirm.msub
+.if MANUAL_REGISTRATION_CONFIRMATION_FILE == $DIR/confirm.msub
+ .not_yet_implemented
+
+
+#########################################################################
+##### Section: Automatic Registration ###
+# #
+# # When REJECT_{POST,COMMAND}_HANDLER is "auto_subscribe" or
+# # "auto_regist", fml does everything to add a new member except for some
+# # error cases. The subscription request type is as follows.
+#
+# # value: confirmation/subject/body/no-keyword
+# AUTO_REGISTRATION_TYPE: confirmation
+.if AUTO_REGISTRATION_TYPE == confirmation
+ .fml8_default
+
+.if AUTO_REGISTRATION_TYPE == subject
+ .not_yet_implemented
+
+.if AUTO_REGISTRATION_TYPE == body
+ .not_yet_implemented
+
+.if AUTO_REGISTRATION_TYPE == no-keyword
+ .not_yet_implemented
+
+
+# # keyword of subscribe request
+# # $REQUIRE_SUBSCRIBE (CFVersion 2) => $AUTO_REGISTRATION_KEYWORD
+# # value: string
+# AUTO_REGISTRATION_KEYWORD: subscribe
+.if AUTO_REGISTRATION_KEYWORD == subscribe
+ .fml8_default
+
+.if AUTO_REGISTRATION_KEYWORD != subscribe
+ .unavailable
+
+
+# # when automatic registration,
+# # we apply $AUTO_REGISTRATION_DEFAULT_MODE e.g. "m=3mp s=1" to the address.
+# # Please see "file operation" in doc/tutorial for more details.
+# # value: string
+# AUTO_REGISTRATION_DEFAULT_MODE:
+.if AUTO_REGISTRATION_DEFAULT_MODE
+ .ignore
+
+
+# # "confirmation" (default) mode configurations
+# # please see doc/tutorial for the detail of "confirmation"
+# # value: string
+# CONFIRMATION_ADDRESS:
+.if CONFIRMATION_ADDRESS == CONTROL_ADDRESS
+ .fml8_default
+
+.if CONFIRMATION_ADDRESS != CONTROL_ADDRESS
+ .unavailable
+
+
+# CONFIRMATION_SUBSCRIBE: subscribe
+.if CONFIRMATION_SUBSCRIBE == subscribe
+ .fml8_default
+
+.if CONFIRMATION_SUBSCRIBE != subscribe
+ .unavailable
+
+
+# CONFIRMATION_KEYWORD: confirm
+.if CONFIRMATION_KEYWORD == confirm
+ .fml8_default
+
+.if CONFIRMATION_KEYWORD != confirm
+ .unavailable
+
+
+# CONFIRMATION_WELCOME_STATEMENT:
+.if CONFIRMATION_WELCOME_STATEMENT
+ .unavailable
+
+
+# # "subscribe" needs no YOUR NAME.
+# # value: 1/0
+# CONFIRMATION_SUBSCRIBE_NEED_YOUR_NAME: 1
+.if CONFIRMATION_SUBSCRIBE_NEED_YOUR_NAME
+ .unavailable
+
+
+# # file to send back "what is confirmation?" with "confirmation request"
+# # reply mail in "confirmation" mode.
+# # value: filename string
+# CONFIRMATION_FILE: $DIR/confirm
+.if CONFIRMATION_FILE
+ .unavailable
+
+
+# # Expire of request queue. The unit is "hour". (default, 168 == 7*24)
+# # value: number
+# CONFIRMATION_EXPIRE: 168
+.if CONFIRMATION_EXPIRE == 168
+ .not_yet_configurable
+
+
+# # confirmation request queue (you should not manually edit it)
+# # value: filename string
+# CONFIRMATION_LIST:
+.if CONFIRMATION_LIST
+ .auto
+
+
+# # In fact, obsolete.
+# # default keyword for trap
+# # value: string
+# DEFAULT_SUBSCRIBE: subscribe
+.if DEFAULT_SUBSCRIBE == subscribe
+ .fml8_default
+
+.if DEFAULT_SUBSCRIBE != subscribe
+ .unavailable
+
+
+# # In adding a new member, fml sends $WELCOME_FILE to him/her.
+# # ML maintainer should set up this file as a guide of mailing list.
+# # This function works in automatic registration.
+# # value: filename string
+# WELCOME_FILE: $DIR/welcome
+.if WELCOME_FILE
+ .unavailable
+
+
+# # subject of mail ($WELCOME_FILE) sent to a new member
+# # value: string
+# WELCOME_STATEMENT:Welcome to our $ML_FN\n You are added automatically
+.if WELCOME_STATEMENT == Welcome to our $ML_FN\n You are added automatically
+ .unavailable
+
+
+# # Enforce file to add a new member address for some purposes.
+# # In default fml adds it to both $ACTIVE_LIST and $MEMBER_LIST.
+# # value: filename string
+# FILE_TO_REGIST:
+.if FILE_TO_REGIST
+
+ primary_member_map = FILE_TO_REGIST
+
+ primary_recipient_map = FILE_TO_REGIST
+
+
+# # obsolete in fact.
+# #
+# # In default if body lines > $AUTO_REGISTRATION_LINES_LIMIT,
+# # we forward this mail to $MAIL_LIST. If $AUTO_REGISTERED_UNDELIVER_P is set,
+# # we ALWAYS DO NOT Forward it to $MAIL_LIST.
+# # value: 1/0
+# AUTO_REGISTERED_UNDELIVER_P: 1
+.if AUTO_REGISTERED_UNDELIVER_P == 1
+ .unavailable
+
+.if AUTO_REGISTERED_UNDELIVER_P == 0
+ .unavailable
+
+
+# AUTO_REGISTRATION_LINES_LIMIT: 0
+.if AUTO_REGISTRATION_LINES_LIMIT == 0
+ .unavailable
+
+.if AUTO_REGISTRATION_LINES_LIMIT > 0
+ .unavailable
+
+
+
+#########################################################################
+##### Section: Confirmd ###
+# # confirmd
+# # value: filename string
+# CONFIRMD_ACK_REQ_FILE: $DIR/confirmd.ackreq
+.if CONFIRMD_ACK_REQ_FILE == $DIR/confirmd.ackreq
+ .not_yet_implemented
+
+# CONFIRMD_ACK_LOGFILE: $VARLOG_DIR/confirmd.ack
+.if CONFIRMD_ACK_LOGFILE == $VARLOG_DIR/confirmd.ack
+ .not_yet_implemented
+
+
+# # value: number / ( number + month/week/day )
+# CONFIRMD_ACK_EXPIRE_UNIT: 1month
+.if CONFIRMD_ACK_EXPIRE_UNIT == 1month
+ .not_yet_implemented
+
+
+# CONFIRMD_ACK_WAIT_UNIT: 2weeks
+.if CONFIRMD_ACK_WAIT_UNIT == 2weeks
+ .not_yet_implemented
+
+
+
+#########################################################################
+##### Section: Remote Administration ###
+# #
+# # For security, I do not recommend you use remote control of fml.
+# # If $REMOTE_ADMINISTRATION is set, you can control FML by sending
+# # a command mail from remote host.
+# # Another choice from remote host is CGI interface but fml 3.0 does not
+# # provide it. CGI development is underway.
+# #
+# # value: 1/0
+# REMOTE_ADMINISTRATION: 0
+.if REMOTE_ADMINISTRATION == 0
+
+ use_admin_command_mail_fucntion = no
+
+.if REMOTE_ADMINISTRATION == 1
+
+ use_admin_command_mail_fucntion = yes
+
+
+
+# # Of course, the remote control requires some kind of authentication.
+# # The choice of authentication is $REMOTE_ADMINISTRATION_AUTH_TYPE,
+# # which is one of
+# # address From: field
+# # crypt From: field + password (e.g. "#admin pass PASSWORD")
+# # md5 From: field + password (e.g. "#admin pass PASSWORD")
+# # pgp PGP(Pretty Good Privacy) signature
+# #
+# # The difference of "crypt" and "md5" is $PASSWD_FILE format.
+# # HISTORY: $REMOTE_ADMINISTRATION_REQUIRE_PASSWORD <=> "crypt"
+# #
+# # value: crypt/address/md5/pgp/pgp2/pgp5/gpgp
+# REMOTE_ADMINISTRATION_AUTH_TYPE: crypt
+.if REMOTE_ADMINISTRATION_AUTH_TYPE == crypt
+ .fml8_default
+ (admin_command_mail_restrictions += check_admin_member_password)
+
+.if REMOTE_ADMINISTRATION_AUTH_TYPE == address
+ .not_yet_implemented
+
+.if REMOTE_ADMINISTRATION_AUTH_TYPE == md5
+ .not_yet_implemented
+
+.if REMOTE_ADMINISTRATION_AUTH_TYPE == pgp
+ .not_yet_implemented
+
+.if REMOTE_ADMINISTRATION_AUTH_TYPE == pgp2
+ .not_yet_implemented
+
+.if REMOTE_ADMINISTRATION_AUTH_TYPE == pgp5
+ .not_yet_implemented
+
+.if REMOTE_ADMINISTRATION_AUTH_TYPE == gpg
+ .not_yet_implemented
+
+
+# # address list of members who can send a command mail from remote
+# # value: filename string
+# ADMIN_MEMBER_LIST: $DIR/members-admin
+.if ADMIN_MEMBER_LIST
+ .convert
+
+
+# # help file of admin commands
+# # value: filename string
+# ADMIN_HELP_FILE: $DIR/help-admin
+.if ADMIN_HELP_FILE
+ .unavailable
+
+
+# # password file to authenticate members
+# # The format is "address encrypted-password" and uses one line for one address.
+# # value: filename string
+# PASSWD_FILE: $DIR/etc/passwd
+.if PASSWD_FILE
+ .convert
+
+
+# # "admin add" to add an address to a member list. If it succeeds, fml
+# # sends back $WELCOME_FILE if this variable is defined. In default fml
+# # does not do it, so the maintainer needs to send the success of subscribe
+# # and guide to the new member.
+# # value: 1/0
+# ADMIN_ADD_SEND_WELCOME_FILE: 0
+.if ADMIN_ADD_SEND_WELCOME_FILE == 0
+ .fml8_default
+
+.if ADMIN_ADD_SEND_WELCOME_FILE == 1
+ .not_yet_implemented
+
+
+# # N, the number of lines, of "tail -N $LOGFILE".
+# # "admin log" is "tail -100 log" in default to avoid too big mail.
+# # value: number
+# ADMIN_LOG_DEFAULT_LINE_LIMIT: 100
+.if ADMIN_LOG_DEFAULT_LINE_LIMIT
+
+ $log_command_tail_starting_location = ADMIN_LOG_DEFAULT_LINE_LIMIT
+
+
+# # PGP directory path (obsolete in fml 4.0)
+# # value: filename string
+# PGP_PATH: $DIR/etc/pgp
+.if PGP_PATH == $DIR/etc/pgp
+ .not_yet_implemented
+
+
+# # If you enforce the following *KEYRING_DIR in $CFVersion < 6.1,
+# # set this variable on.
+# # value: 1/0
+# USE_FML40_PGP_PATH: 1
+.if USE_FML40_PGP_PATH == 1
+ .not_yet_implemented
+
+
+# # fml 4.0
+# # value: directory string
+# DIST_AUTH_KEYRING_DIR: $DIR/etc/dist-auth
+.if DIST_AUTH_KEYRING_DIR == $DIR/etc/dist-auth
+ .not_yet_implemented
+
+
+# DIST_ENCRYPT_KEYRING_DIR: $DIR/etc/dist-encrypt
+.if DIST_ENCRYPT_KEYRING_DIR == $DIR/etc/dist-encrypt
+ .not_yet_implemented
+
+
+# ADMIN_AUTH_KEYRING_DIR: $DIR/etc/admin-auth
+.if ADMIN_AUTH_KEYRING_DIR == $DIR/etc/admin-auth
+ .not_yet_implemented
+
+
+# ADMIN_ENCRYPT_KEYRING_DIR: $DIR/etc/admin-encrypt
+.if ADMIN_ENCRYPT_KEYRING_DIR == $DIR/etc/admin-encrypt
+ .not_yet_implemented
+
+
+
+#########################################################################
+##### Section: Moderations; moderators check posted articles ###
+
+# # "moderator" certification type
+# # value: 1/2/3
+# MODERATOR_FORWARD_TYPE: 2
+.if MODERATOR_FORWARD_TYPE == 2
+ .not_yet_implemented
+
+
+# # member list who receives submitted article.
+# # If this file does not exist, it is forwarded to only $MAINTAINER.
+# # A moderator who certificate submitted articles and permit the post
+# # to mailing list.
+# #
+# # fml does not check moderator's addresses. fml check only "moderators
+# # knows passwords or identifiers (one time password)".
+# #
+# # value: filename string
+# MODERATOR_MEMBER_LIST: $DIR/moderators
+.if MODERATOR_MEMBER_LIST
+ .not_yet_implemented
+
+
+# # expire old submitted but not certified articles
+# # default: 2 weeks
+# # value: number
+# MODERATOR_EXPIRE_LIMIT: 14
+.if MODERATOR_EXPIRE_LIMIT == 14
+ .not_yet_implemented
+
+
+
+#########################################################################
+##### Section: Security ###
+
+# # We reject $REJECT_ADDR@ARBITRARY.DOM.AIN since these are clearly NOT
+# # individuals. It also may be effective to avoid mail loop since
+# # some error or automatic reply comes from not individual addresses.
+# # This restriction is stronger than $PERMIT_*_FROM variable.
+# # For example, if $PERMIT_POST_FROM is "anyone", fml does not permit
+# # post from root@some.domain. If you permit it, please define $REJECT_ADDR.
+# #
+# # XXX This variable name is ambiguous. It should be $REJECT_ACCOUNT?
+# #
+# # value: regexp string
+# REJECT_ADDR: root|postmaster|MAILER-DAEMON|msgs|nobody|news|majordomo|listserv|listproc|\S+\-help|\S+\-subscribe|\S+\-unsubscribe
+.if REJECT_ADDR
+ .convert
+
+
+# # list of addresses fml should reject. fml checks From: field for this but
+# # it may be ineffective since SMTP has no general authentication method.
+# # value: filename string
+# REJECT_ADDR_LIST: $DIR/spamlist
+.if REJECT_ADDR_LIST
+ .not_yet_implemented
+
+
+# # check UNIX from to avoid mail loop. check in default.
+# # value: 1/0
+# NOT_USE_UNIX_FROM_LOOP_CHECK: 0
+.if NOT_USE_UNIX_FROM_LOOP_CHECK == 0
+ .unavailable
+
+
+.if NOT_USE_UNIX_FROM_LOOP_CHECK == 1
+ .unavailable
+
+
+# # check Message-Id: duplication to avoid mail loop
+# # value: 1/0
+# CHECK_MESSAGE_ID: 1
+.if CHECK_MESSAGE_ID == 1
+ .fml8_default
+
+.if CHECK_MESSAGE_ID == 0
+
+ incoming_mail_header_loop_check_rules -= check_message_id
+
+
+# # check mail body content md5 checksum to avoid mail loop
+# # do not check it in default.
+# # value: 1/0
+# CHECK_MAILBODY_CKSUM: 0
+.if CHECK_MAILBODY_CKSUM
+ .not_yet_implemented
+
+
+# # obsolete today
+# # Logs the getpeername()
+# # value: 1/0
+# LOG_CONNECTION: 0
+.if LOG_CONNECTION
+ .unavailable
+
+
+# # address check levels, which level is the tree depth from the root.
+# # For example
+# # fukachan@phys.titech.ac.jp
+# # fukachan@axion.phys.titech.ac.jp
+# #
+# # fml checks $ADDR_CHECK_MAX level from the name space root. That is
+# # compare "jp" -> compare "ac" -> titech -> phys -> axion ...
+# #
+# # When $ADDR_CHECK_MAX = 3, fml regards these two are the same.
+# # When $ADDR_CHECK_MAX = 4, fml regards these two are the same.
+# # When $ADDR_CHECK_MAX = 5, fml regards these two are DIFFERENT!
+# #
+# # value: number
+# ADDR_CHECK_MAX: 3
+.if ADDR_CHECK_MAX == 3
+ .fml8_default
+
+.if ADDR_CHECK_MAX != 3
+ .not_yet_configurable
+
+
+# # fml reject too big mail.
+# # In-coming mail size > $INCOMING_MAIL_SIZE_LIMIT, fml discards it
+# # and send a warning only to the maintainer.
+# # 0 (default) implies infinite (no limit)
+# # value: number
+# INCOMING_MAIL_SIZE_LIMIT:
+.if INCOMING_MAIL_SIZE_LIMIT == 0
+ .unavailable
+
+.if INCOMING_MAIL_SIZE_LIMIT != 0
+ .auto
+
+
+# # When fml reject too big mail,
+# # if $NOTIFY_MAIL_SIZE_OVERFLOW is set, notify the rejection to the sender.
+# # value: 1/0
+# NOTIFY_MAIL_SIZE_OVERFLOW: 1
+.if NOTIFY_MAIL_SIZE_OVERFLOW == 1
+ .fml8_default
+
+.if NOTIFY_MAIL_SIZE_OVERFLOW == 0
+ .not_yet_configurable
+
+
+# # When fml reject too big mail,
+# # if $ANNOUNCE_MAIL_SIZE_OVERFLOW is set, announce "too big mail from someone"
+# # to mailing list (SARASHIMONO:-).
+# # value: 1/0
+# ANNOUNCE_MAIL_SIZE_OVERFLOW: 0
+.if ANNOUNCE_MAIL_SIZE_OVERFLOW == 0
+ .not_yet_implemented
+
+.if ANNOUNCE_MAIL_SIZE_OVERFLOW == 1
+ .not_yet_implemented
+
+
+
+# # Resource Limit (useful for ISP ?): (default 0 == not check this limit)
+# # the maximum of ML delivery members when auto registration routine works.
+# #
+# # If member > $MAX_MEMBER_LIMIT, auto registration rejects the request.
+# # We check actives to permit aliases of post-able addresses.
+# # We check @ACTIVE_LIST effective members, not @MEMBER_LIST.
+# # value: number
+# MAX_MEMBER_LIMIT:
+.if MAX_MEMBER_LIMIT
+ .not_yet_implemented
+
+
+# # Filter of posted article.
+# # &EnvelopeFilter is called in the top of &Distribute if you set
+# # $USE_DISTRIBUTE_FILTER = 1;
+# # value: 1/0
+# USE_DISTRIBUTE_FILTER:
+.if USE_DISTRIBUTE_FILTER == 1
+
+ use_article_filter = yes
+
+.if USE_DISTRIBUTE_FILTER == 0
+
+ use_article_filter = no
+
+
+# # Filter of posted article.
+# # You can use $DISTRIBUTE_FILTER_HOOK for advanced customizes.
+# # value: string
+# DISTRIBUTE_FILTER_HOOK:
+.if DISTRIBUTE_FILTER_HOOK
+ .ignore
+
+
+# # $FILTER_NOTIFY_REJECTION enables fml.pl notifies the rejection to
+# # the sender.
+# # value: 1/0
+# FILTER_NOTIFY_REJECTION:
+.if FILTER_NOTIFY_REJECTION == 1
+ .fml8_default
+
+.if FILTER_NOTIFY_REJECTION == 0
+ .not_yet_configurable
+
+
+
+# # Attribute of filter of posted article
+# # value: 1/0
+# FILTER_ATTR_REJECT_NULL_BODY: 1
+.if FILTER_ATTR_REJECT_NULL_BODY == 1
+
+ article_text_plain_filter_rules += reject_null_mail_body
+
+.if FILTER_ATTR_REJECT_NULL_BODY == 0
+
+ article_text_plain_filter_rules -= reject_null_mail_body
+
+
+
+# # Attribute of filter of posted article
+# # When $FILTER_ATTR_REJECT_COMMAND is 1 under distribution mode,
+# # rejects "# command" syntax just before distribution (&Distribute;)
+# # value: 1/0
+# FILTER_ATTR_REJECT_COMMAND:
+.if FILTER_ATTR_REJECT_COMMAND == 1
+
+ article_text_plain_filter_rules += reject_old_fml_command_syntax
+
+.if FILTER_ATTR_REJECT_COMMAND == 0
+
+ article_text_plain_filter_rules -= reject_old_fml_command_syntax
+
+
+
+# # Attribute of filter of posted article
+# # reject Japanese "2byes English words"
+# # value: 1/0
+# FILTER_ATTR_REJECT_2BYTES_COMMAND:
+.if FILTER_ATTR_REJECT_2BYTES_COMMAND == 1
+
+ article_text_plain_filter_rules += reject_japanese_command_syntax
+
+.if FILTER_ATTR_REJECT_2BYTES_COMMAND == 0
+
+ article_text_plain_filter_rules -= reject_japanese_command_syntax
+
+
+
+
+# # Attribute of filter of posted article
+# # reject command mail sent to the address for posting.
+# # value: 1/0
+# FILTER_ATTR_REJECT_INVALID_COMMAND: 1
+.if FILTER_ATTR_REJECT_INVALID_COMMAND == 1
+
+ article_text_plain_filter_rules += reject_invalid_fml_command_syntax
+
+.if FILTER_ATTR_REJECT_INVALID_COMMAND == 0
+
+ article_text_plain_filter_rules -= reject_invalid_fml_command_syntax
+
+
+# # Attribute of filter of posted article
+# # reject a mail with "one line" mail body (must be invalid command mail)
+# # one line means the input mail has one line in the first paragraph
+# # except for signature (last paragraph).
+# # Even if it has one line, the paragraph ends with period '.'
+# # it must be an effective paragraph. So we should not reject it.
+# # value: 1/0
+# FILTER_ATTR_REJECT_ONE_LINE_BODY: 1
+.if FILTER_ATTR_REJECT_ONE_LINE_BODY == 1
+
+ article_text_plain_filter_rules += reject_one_line_message
+
+
+.if FILTER_ATTR_REJECT_ONE_LINE_BODY == 0
+
+ article_text_plain_filter_rules -= reject_one_line_message
+
+
+# # Attribute of filter of posted article
+# # reject MIME/multipart mails with Microsoft GUID within it,
+# # We intend to reject "Melissa virus" family by it.
+# # value: 1/0
+# FILTER_ATTR_REJECT_MS_GUID: 1
+.if FILTER_ATTR_REJECT_MS_GUID == 1
+
+ article_text_plain_filter_rules += reject_ms_guid
+
+.if FILTER_ATTR_REJECT_MS_GUID == 0
+
+ article_text_plain_filter_rules -= reject_ms_guid
+
+
+# # reject not ascii nor ISO-2022-JP
+# # value: 1/0
+# FILTER_ATTR_REJECT_INVALID_JAPANESE: 0
+.if FILTER_ATTR_REJECT_INVALID_JAPANESE == 0
+
+ article_text_plain_filter_rules -= reject_not_iso2022jp_japanese_string
+
+.if FILTER_ATTR_REJECT_INVALID_JAPANESE == 1
+
+ article_text_plain_filter_rules += reject_not_iso2022jp_japanese_string
+
+
+# # cutoff empty message.
+# # value: 1/0
+# CONTENT_HANDLER_CUTOFF_EMPTY_MESSAGE: 0
+.if CONTENT_HANDLER_CUTOFF_EMPTY_MESSAGE
+ .use_other_file
+
+
+# # reject empty message after cut off process.
+# # value: 1/0
+# CONTENT_HANDLER_REJECT_EMPTY_MESSAGE: 0
+.if CONTENT_HANDLER_REJECT_EMPTY_MESSAGE
+ .use_other_file
+
+
+# # try to convert Japanese HANKAKU chars in the mail body to ZENAKKU
+# # value: 1/0
+# USE_HANKAKU_CONVERTER: 0
+.if USE_HANKAKU_CONVERTER == 0
+ .not_yet_implemented
+
+.if USE_HANKAKU_CONVERTER == 1
+ .not_yet_implemented
+
+
+# # reject HTML mails that the same content exist in the form of both
+# # plain and html. e.g. some versions of M$ outlook, netscape mail
+# # "AGAINST_HTML_MAIL: 1/0" is old style, which works for compatibility though.
+# # NULL (default) is "pass through a html mail".
+# # value: "strip" / "reject" / ""
+# HTML_MAIL_DEFAULT_HANDLER:
+.if HTML_MAIL_DEFAULT_HANDLER
+ .use_other_file
+
+
+# # Traffic Monitoring Mechanism within fml
+# # Mail Traffic Information: internal traffic monitor
+# # value: 1/0
+# USE_MTI:
+.if USE_MTI
+ .not_yet_implemented
+
+
+# # MIT warning (mail bomb report) negative cache interval
+# # to avoid mail bomb of "mail bomb attack report" itself.
+# # value: number
+# MTI_WARN_INTERVAL: 3600
+.if MTI_WARN_INTERVAL
+ .not_yet_implemented
+
+
+# # value: filename string
+# MTI_WARN_LASTLOG:
+.if MTI_WARN_LASTLOG
+ .not_yet_implemented
+
+
+# # garbage collection
+# # how old data (cache) to remove in clean up
+# # value: number
+# MTI_EXPIRE_UNIT: 3600
+.if MTI_EXPIRE_UNIT
+
+
+
+# # low water mark
+# # value: number
+# MTI_BURST_SOFT_LIMIT: 1
+.if MTI_BURST_SOFT_LIMIT
+ .not_yet_implemented
+
+
+# # high water mark
+# # value: number
+# MTI_BURST_HARD_LIMIT: 2
+.if MTI_BURST_HARD_LIMIT
+ .not_yet_implemented
+
+
+# # function name to evaluate the current traffic load
+# # value: funtion string
+# MTI_COST_EVAL_FUNCTION: MTISimpleBomberP
+.if MTI_COST_EVAL_FUNCTION
+ .not_yet_implemented
+
+
+# # cache of spammer candidates
+# # value: filename string
+# MTI_MAIL_FROM_HINT_LIST: $DIR/mti_mailfrom.hints
+.if MTI_MAIL_FROM_HINT_LIST
+ .not_yet_implemented
+
+
+# # how to announce the new comer if $AUTO_REGISTERED_UNDELIVER_P is 0.
+# # value: raw / prepend_info
+# SUBSCRIBE_ANNOUNCE_FORWARD_TYPE: prepend_info
+.if SUBSCRIBE_ANNOUNCE_FORWARD_TYPE == prepend_info
+ .not_yet_implemented
+
+.if SUBSCRIBE_ANNOUNCE_FORWARD_TYPE == raw
+ .not_yet_implemented
+
+
+
+# # Optional. If UNSUBSCRIBE_AUTH_TYPE is 'confirmation', fml sends back
+# # confirmation against a fake. In default, FML does not do confirmation.
+# # available type is "confirmation" only.
+# # value: confirmation
+# UNSUBSCRIBE_AUTH_TYPE:
+.if UNSUBSCRIBE_AUTH_TYPE == confirmation
+ .fml8_default
+
+.if UNSUBSCRIBE_AUTH_TYPE != confirmation
+ .not_yet_implemented
+
+
+# # chaddr checks confirmation
+# # value: confirmation / ""
+# CHADDR_AUTH_TYPE:
+.if CHADDR_AUTH_TYPE == confirmation
+ .fml8_default
+
+.if CHADDR_AUTH_TYPE != confirmation
+ .not_yet_implemented
+
+
+# # LOGGING THE LATEST IN-COMING MAILS
+# # Logs an in-coming mail to $LOG_MAIL_DIR/$id
+# # where ($id = `cat $LOG_MAIL_SEQ`; $id = $id % $NUM_LOG_MAIL; $id++).
+# # Latest $NUM_LOG_MAIL files are stored in $LOG_MAIL_DIR and
+# # the message size of each file except for the header
+# # is limited up to $LOG_MAIL_FILE_SIZE_MAX bytes to save disk.
+# # value: 1/0
+# USE_LOG_MAIL: 0
+.if USE_LOG_MAIL == 0
+
+ use_incoming_mail_cache = no
+
+.if USE_LOG_MAIL == 1
+
+ use_incoming_mail_cache = yes
+
+
+# # value: filename string
+# LOG_MAIL_DIR: $VAR_DIR/Mail
+.if LOG_MAIL_DIR
+ .auto
+
+# LOG_MAIL_SEQ: $LOG_MAIL_DIR/.seq
+.if LOG_MAIL_SEQ
+ .auto
+
+
+# # value: number
+# NUM_LOG_MAIL: 100
+.if NUM_LOG_MAIL
+ .not_yet_configurable
+
+# LOG_MAIL_FILE_SIZE_MAX: 2048
+.if LOG_MAIL_FILE_SIZE_MAX
+ .not_yet_configurable
+
+
+# # PGP Encrypted ML
+# # value: 1/0
+# USE_ENCRYPTED_DISTRIBUTION:
+.if USE_ENCRYPTED_DISTRIBUTION
+ .not_yet_implemented
+
+
+# # value: pgp / pgp2 / pgp5 / gpgp
+# ENCRYPTED_DISTRIBUTION_TYPE: pgp2
+.if ENCRYPTED_DISTRIBUTION_TYPE == pgp2
+ .not_yet_implemented
+
+
+# # obosolete in fml 4.0
+# # value: 2/5/6
+# # PGP_VERSION: 2
+
+
+#########################################################################
+##### Section: Header Customization ###
+# # In general, you can control fields in header in the following:
+# #
+# # @HdrFieldsOrder Fields Order In Header
+# #
+# # &DEFINE_FIELD_ORIGINAL('field'); Conserve Original
+# # &DEFINE_FIELD_FORCED('field', "contents"); Overwrite
+# #
+# # In default, we discard fields not shown in @HdrFieldsOrder.
+
+# # Date: definition ("makefml config" can control this)
+# # 1 original-date Date:
+# # * Date: == when distribute() works
+# # 2 distribute-date+posted Date: + Posted:
+# # 3 distribute-date+x-posted Date: + X-Posted:
+# # 4 distribute-date+x-original-date Date: + X-Original-Date:
+# # * Date: == when fml.pl receives or is kicked off.
+# # 5 received-date+posted Date: + Posted:
+# # 6 received-date+x-posted Date: + X-Posted:
+# # 7 received-date+x-original-date Date: + X-Original-Date:
+# # value: original-date/distribute-date+posted/distribute-date+x-posted
+# # /distribute-date+x-original-date/received-date+posted
+# # /received-date+x-posted/received-date+x-original-date
+# DATE_TYPE: original-date
+.if DATE_TYPE == original-date
+ .fml8_default
+
+.if DATE_TYPE != original-date
+ .not_yet_implemented
+
+
+# # In article header, fml adds following header fields.
+# #
+# # $XMLNAME
+# # $XMLCOUNT: sequence-number
+# #
+# # e.g.
+# # X-ML-Name: Elena
+# # X-Mail-Count: 00007
+# #
+# # value: string
+# XMLNAME: X-ML-Name: Elena
+.if XMLNAME == X-ML-Name: Elena
+ .convert
+
+# XMLCOUNT: X-Mail-Count
+.if XMLCOUNT == X-Mail-Count
+
+ article_header_rewrite_rules += add_fml_traditional_article_id
+
+.if XMLCOUNT != X-Mail-Count
+ .not_yet_configurable
+
+
+# # In default subject tag does not exist to show more and more effective
+# # subject and body. Client Interface SHOULD CONTROL subject descriptions.
+# #
+# # The available type is [:] [,] [ ] (:) (,) ( ).
+# # e.g. [:] => [Elena:00100] format (here $BRACKET is "Elena").
+# # But you can customize SUBJECT_FREE_* series variables.
+# # Please see doc/tutorial for the detail
+# #
+# # value: (:) / [:] / () / [] / (,) / [,] / () / [] / (ID) / [ID] / ""
+# SUBJECT_TAG_TYPE:
+.if SUBJECT_TAG_TYPE
+ .convert
+
+
+# # BRACKET of "Subject: [BRACKET:ID] ..." form
+# # value: string
+# BRACKET: Elena
+.if BRACKET == Elena
+ .convert
+
+
+# # obsolete
+# # We strip off e.g. [ML:fukachan] form in Subject
+# # but this operations depends on special forms, so not functional.
+# # You do not expect a lot on this option.
+# STRIP_BRACKETS: 0
+.if STRIP_BRACKETS == 0
+ .ignore
+
+
+# # You can customize your own bracket by these variables.
+# # See doc/tutorial and libtagdef.pl on examples.
+# # value: regexp string
+# BRACKET_SEPARATOR:
+.if BRACKET_SEPARATOR
+ .convert
+
+
+# SUBJECT_FREE_FORM:
+.if SUBJECT_FREE_FORM
+ .convert
+
+
+# SUBJECT_FREE_FORM_REGEXP:
+.if SUBJECT_FREE_FORM_REGEXP
+ .convert
+
+
+# SUBJECT_FORM_LONG_ID:
+.if SUBJECT_FORM_LONG_ID
+ .convert
+
+
+# # obsolete based on RFC1123
+# # value: 1/0
+# USE_ERRORS_TO:
+.if USE_ERRORS_TO == 1
+
+ article_header_rewrite_rules += rewrite_errors_to
+
+.if USE_ERRORS_TO == 0
+
+ article_header_rewrite_rules -= rewrite_errors_to
+
+
+# # obsolete based on RFC1123
+# # value: string
+# ERRORS_TO:
+.if ERRORS_TO
+ .not_yet_configurable
+
+
+# # Message-Id: use original Message-Id or Server Defined Message-Id ?
+# # if 1, original and
+# # if 0, fml generates a message-id like $day.FMLAAA.$pid.$MAIL_LIST
+# # value: 1/0
+# USE_ORIGINAL_MESSAGE_ID: 1
+.if USE_ORIGINAL_MESSAGE_ID == 1
+ .fml8_default
+
+.if USE_ORIGINAL_MESSAGE_ID == 0
+ .not_yet_implemented
+
+
+# # Precedence: field;
+# # value: string
+# PRECEDENCE: bulk
+.if PRECEDENCE == bulk
+ .not_yet_implemented
+
+.if PRECEDENCE != bulk
+ .not_yet_implemented
+
+
+# # append STARTREK stardate :-) in article.
+# # Stardate calculation algorithm is ambiguous.
+# # X-Stardate: field
+# # value: 1/0
+# APPEND_STARDATE:
+.if APPEND_STARDATE == 1
+ .not_yet_implemented
+
+.if APPEND_STARDATE == 0
+ .not_yet_implemented
+
+
+# # RFC2369 e.g. list-post: ..
+# # value: 1/0
+# USE_RFC2369: 1
+.if USE_RFC2369 == 1
+
+ article_header_rewrite_rules += add_rfc2369
+
+.if USE_RFC2369 == 0
+
+ article_header_rewrite_rules -= add_rfc2369
+
+
+# # List-*
+# LIST_SOFTWARE:
+.if LIST_SOFTWARE
+ .not_yet_configurable
+
+# LIST_POST:
+.if LIST_POST
+ .not_yet_configurable
+
+# LIST_OWNER:
+.if LIST_OWNER
+ .not_yet_configurable
+
+# LIST_HELP:
+.if LIST_HELP
+ .not_yet_configurable
+
+# LIST_SUBSCRIBE:
+.if LIST_SUBSCRIBE
+ .not_yet_configurable
+
+# LIST_UNSUBSCRIBE:
+.if LIST_UNSUBSCRIBE
+ .not_yet_configurable
+
+# LIST_ID:
+.if LIST_ID
+ .not_yet_configurable
+
+
+
+# # obsolete in fml 3.0
+# # We should force "To: $MAIL_LIST" form "For Eye" or NOT?
+# # default is "NO".
+# #
+# # 0 Pass the original field To:
+# # 1 We rewrite "To: $MAIL_LIST, original-to-fields".
+# # 2 Force "To: $MAIL_LIST".
+#
+# # REWRITE_TO = 1 if NOT_REWRITE_TO == 0 (2.1 Release)
+# # value: 0/1/2
+# REWRITE_TO:
+.if REWRITE_TO == 2
+ .not_yet_implemented
+
+.if REWRITE_TO == 1
+ .not_yet_implemented
+
+.if REWRITE_TO == 0
+ .fml8_default
+
+
+# # Default values if no value (no field) is given.
+# # value: string
+# Subject:
+.if Subject
+ .ignore
+
+# From_address: not.found
+.if From_address == not.found
+ .ignore
+
+# User: not.found
+.if User == not.found
+ .ignore
+
+# Date: not.found
+.if Date == not.found
+ .ignore
+
+
+# # TIME ZONE; +0900 is RFC822 syntax (I like JST but ... ;-)
+# # value: +\d{4} / -\d{4}
+# TZone: +0900
+.if TZone == +0900
+ .auto
+
+
+# # time zone within summer time if you use summer time.
+# # thank HIROSHIMA Naoki <naoki@bcrossing.com> on this idea
+# TZONE_DST:
+.if TZONE_DST
+ .auto
+
+
+# # ## Sub Section: Pass All Header ? ##
+# # In some cases you need to pass only defined fields of the header
+# # which is defined in @HdrFieldsOrder (see "sub SetDefaults" in fml.pl).
+# # All files except $SKIP_FIELDS is passed through
+# # when $PASS_ALL_FIELDS_IN_HEADER is set.
+# # The old variable name is $SUPERFLUOUS_HEADERS.
+# # value: 1/0
+# PASS_ALL_FIELDS_IN_HEADER: 1
+.if PASS_ALL_FIELDS_IN_HEADER == 1
+ .fml8_default
+
+
+# # ignore header field irrespective of @HdrFieldsOrder and
+# # $PASS_ALL_FIELDS_IN_HEADER setting
+# # value: regexp string
+# SKIP_FIELDS: Return-Receipt-To
+.if SKIP_FIELDS == Return-Receipt-To
+
+ unsafe_header_fields = SKIP_FIELDS
+
+
+# # correct a wrong input
+# # value: 1/0
+# ALLOW_WRONG_LINES_IN_HEADER: 1
+.if ALLOW_WRONG_LINES_IN_HEADER == 1
+ .ignore
+
+
+
+#########################################################################
+##### Section: Commands, Command Traps, File Operations (e.g. mget) ###
+
+# # obsolete
+# # COMMAND format is "#help" == "# help" if $COMMAND_SYNTAX_EXTENSION is set.
+# # value: 1/0
+# COMMAND_SYNTAX_EXTENSION: 1
+.if COMMAND_SYNTAX_EXTENSION == 1
+ .ignore
+
+
+# # "Subject: # commands" is available?
+# # value: 1/0
+# USE_SUBJECT_AS_COMMANDS: 0
+.if USE_SUBJECT_AS_COMMANDS == 0
+ .ignore
+
+
+# # obsolete
+# # If NOT "# command" syntax commands is given, ignore or warn to the user?
+# # Our default is not, since most such cases are "signature".
+# # value: 1/0
+# USE_WARNING: 0
+.if USE_WARNING == 0
+ .fml8_default
+
+.if USE_WARNING == 1
+ .ignore
+
+
+# # obsolete: since this is the same as --ctladdr.
+# # value: 1/0
+# COMMAND_ONLY_SERVER: 0
+.if COMMAND_ONLY_SERVER == 0
+ .ignore
+
+
+# # **ATTENTION**
+# # $PROHIBIT_COMMAND_FOR_STRANGER is obsoletes since
+# # $PROHIBIT_COMMAND_FOR_STRANGER equals $PERMIT_COMMAND_FROM = "anyone";
+
+# # ## Sub Section: traps ##
+# # obsolete
+# # when $MAIL_LIST == $CONTROL_ADDRESS,
+# # the first $COMMAND_CHECK_LIMIT lines is checked for commands mail or not?
+# # $GUIDE_CHECK_LIMIT is the same kind of variable but for "# guide" trap.
+# # $GUIDE_KEYWORD determines "guide" of "$ guide" trap.
+# # value: number
+# COMMAND_CHECK_LIMIT: 3
+.if COMMAND_CHECK_LIMIT == 3
+ .ignore
+
+
+# # obsolete
+# # value: number
+# GUIDE_CHECK_LIMIT: 3
+.if GUIDE_CHECK_LIMIT == 3
+ .ignore
+
+
+# # obsolete
+# # value: string
+# GUIDE_KEYWORD: guide
+.if GUIDE_KEYWORD == guide
+ .ignore
+
+
+
+# # The maximum length for each command. 128 bytes by default.
+# # value: number
+# MAXLEN_COMMAND_INPUT: 128
+.if MAXLEN_COMMAND_INPUT == 128
+
+ command_mail_line_length_limit = MAXLEN_COMMAND_INPUT
+
+
+# # The maximum number of commands in one command mail.
+# # The variable \$MAXNUM_COMMAND_INPUT controls this.
+# # If the value is 3, fml permits 3 commands in one command mail.
+# # 0 or NULL implies infinite (default).
+# # value: number
+# MAXNUM_COMMAND_INPUT:
+.if MAXNUM_COMMAND_INPUT
+
+ command_mail_valid_command_limit = MAXNUM_COMMAND_INPUT
+
+
+# # "# chaddr" command name aliases
+# # value: regexp string
+# CHADDR_KEYWORD: chaddr|change\-address|change
+.if CHADDR_KEYWORD == chaddr|change\-address|change
+ .auto
+
+
+# # choise of addresses to return for "chaddr" command reply
+# # value: newaddr curaddr maintainer
+# CHADDR_REPLY_TO: newaddr curaddr
+.if CHADDR_REPLY_TO == newaddr curaddr
+ .not_yet_configurable
+
+
+# # choise of addresses to return for "admin chaddr" command reply
+# # value: newaddr curaddr maintainer
+# ADMIN_CHADDR_REPLY_TO: newaddr curaddr
+.if ADMIN_CHADDR_REPLY_TO == newaddr curaddr
+ .not_yet_configurable
+
+
+# # ## Sub Section: mget ##
+# # The default mode of "mget" without mode (default is "tar.gz" form).
+# # $MGET_TEXT_MODE_DEFAULT is used by &SendFileBySplit
+# # value: mode string
+# MGET_MODE_DEFAULT:
+.if MGET_MODE_DEFAULT
+ .ignore
+
+
+# MGET_TEXT_MODE_DEFAULT:
+.if MGET_TEXT_MODE_DEFAULT
+ .ignore
+
+
+# # The reply for "mget" commands sends long reply mails as splitten mails
+# # by the unit $MAIL_LENGTH_LIMIT lines once at $SLEEPTIME secs..
+# # value: number
+# MAIL_LENGTH_LIMIT: 1000
+.if MAIL_LENGTH_LIMIT == 1000
+ .not_yet_implemented
+
+
+# SLEEPTIME: 60
+.if SLEEPTIME == 60
+ .ignore
+
+
+# # almost obsolete
+# # special case of "mget" routine uses these variables.
+# # It is not user defined variable.
+# # See doc/tutorial and libfop.pl for the detail.
+# # You change MIME/Multipart default.
+# # value: string
+# MIME_VERSION:
+.if MIME_VERSION
+ .ignore
+
+# MIME_CONTENT_TYPE:
+.if MIME_CONTENT_TYPE
+ .ignore
+
+# MIME_MULTIPART_BOUNDARY:
+.if MIME_MULTIPART_BOUNDARY
+ .ignore
+
+# MIME_MULTIPART_CLOSE_DELIMITER:
+.if MIME_MULTIPART_CLOSE_DELIMITER
+ .ignore
+
+# MIME_MULTIPART_DELIMITER:
+.if MIME_MULTIPART_DELIMITER
+ .ignore
+
+# MIME_MULTIPART_PREAMBLE:
+.if MIME_MULTIPART_PREAMBLE
+ .ignore
+
+# MIME_MULTIPART_TRAILER:
+.if MIME_MULTIPART_TRAILER
+ .ignore
+
+
+# # Japanese specific
+# # sjis conversion in "mget ish" mode.
+# # value: 1/0
+# USE_SJIS_IN_ISH:
+.if USE_SJIS_IN_ISH
+ .ignore
+
+
+# # RFC1153 configurations; see doc/tutorial for the detail
+# # value: number
+# RFC1153_ISSUE:
+.if RFC1153_ISSUE
+ .ignore
+
+
+# # value: number / string
+# RFC1153_VOL:
+.if RFC1153_VOL
+ .ignore
+
+
+# # value: filename string
+# RFC1153_SEQUENCE_FILE:
+.if RFC1153_SEQUENCE_FILE
+ .ignore
+
+
+# # ## Sub Section: MTA specific ##
+# # qmail specific extension
+# # To send "get 1" to ml-ctl@domain is equivalent to that
+# # send anything to ml-get-1@domain if this variable is defined.
+# # value: 1/0
+# USE_DOT_QMAIL_EXT: 0
+.if USE_DOT_QMAIL_EXT == 0
+ .not_yet_implemented
+
+
+# # ## Sub Section: Headers of reply from FML ##
+# # obsolete
+# # For the reply for commands from fml,
+# # we force Reply-To: $FORCE_COMMAND_REPLY_TO ?(default is $CONTROL_ADDRESS)
+# # value: string
+# FORCE_COMMAND_REPLY_TO:
+.if FORCE_COMMAND_REPLY_TO
+ .not_yet_implemented
+
+
+# # Subject template in "mget" reply.
+# # automatic substitute is done before send the reply; For example,
+# # Subject: result for mget [last:3 tar + gzip] (1/1) (Elena Lolabrigita ML)
+# #
+# # _DOC_MODE_ <=> [last:10 tar + gzip]
+# # _PART_ <=> (1/4)
+# # _ML_FN_ <=> $ML_FN (here is "(Elena Lolabrigita ML)")
+# #
+# # $NOT_SHOW_DOCMODE is obsolete, it equals you discard _PART_.
+# #
+# # value: string
+# MGET_SUBJECT_TEMPLATE: result for mget _DOC_MODE_ _PART_ _ML_FN_
+.if MGET_SUBJECT_TEMPLATE == result for mget _DOC_MODE_ _PART_ _ML_FN_
+ .not_yet_implemented
+
+
+# # send error message to Reply-To: ? or From: ?
+# # (Of course From: if Reply-To: is not defined).
+# # If $MESSAGE_RETURN_ADDR_POLICY is null,
+# # it implies we prefer Reply-To: (by default).
+# # value: from / reply-to
+# MESSAGE_RETURN_ADDR_POLICY: reply-to
+.if MESSAGE_RETURN_ADDR_POLICY == reply-to
+ .not_yet_implemented
+
+
+#########################################################################
+##### Section: Digest/Matome Okuri Configurations ###
+# #
+# # $MSEND_MODE_DEFAULT is the default of msend (when e.g. m=3)
+# # and the format is the same as $MGET_MODE_DEFAULT.
+# # which is "tar.gz" format.
+
+# # Subject template in Digest/matome okuri.
+# # automatic substitute is done before send the reply; For example,
+# # Digest -Matome Okuri- Article 768 [last:10 tar + gzip] (1/1) (Elena ML)
+# #
+# # _ARTICLE_RANGE_ <=> Article 768
+# # _DOC_MODE_ <=> [last:10 tar + gzip]
+# # _PART_ <=> (1/4)
+# # _ML_FN_ <=> $ML_FN (here is "(Elena ML)")
+# #
+# # $NOT_SHOW_DOCMODE is obsolete, it equals you discard _PART_.
+# #
+# # value: string
+# MSEND_SUBJECT_TEMPLATE: Digest _ARTICLE_RANGE_ _PART_ _ML_FN_
+.if MSEND_SUBJECT_TEMPLATE == Digest _ARTICLE_RANGE_ _PART_ _ML_FN_
+ .not_yet_implemented
+
+
+# # Digest/Matome Okuri rc file
+# # value: filename string
+# MSEND_RC: $VARLOG_DIR/msendrc
+.if MSEND_RC == $VARLOG_DIR/msendrc
+ .convert
+
+
+# # rfc1153 or rfc934
+# # obsoletes $USE_RFC1153, $USE_RFC1153_DIGEST, $USE_RFC934
+# # value: mode string
+# MSEND_MODE_DEFAULT:
+.if MSEND_MODE_DEFAULT
+ .ignore
+
+
+# # Subject:
+# # value: string
+# MSEND_DEFAULT_SUBJECT:
+.if MSEND_DEFAULT_SUBJECT
+ .ignore
+
+
+# # If no articles to send, we send "no traffic" to the member of $MAIL_LIST
+# # with the subject $MSEND_NOTIFICATION_SUBJECT if $MSEND_NOTIFICATION is set.
+# # value: 1/0
+# MSEND_NOTIFICATION:
+.if MSEND_NOTIFICATION
+ .not_yet_implemented
+
+
+# # value: string
+# MSEND_NOTIFICATION_SUBJECT:
+.if MSEND_NOTIFICATION_SUBJECT
+ .not_yet_implemented
+
+
+# # not require X-ML-Info: in the "mget";
+# # value: 1/0
+# MSEND_NOT_USE_X_ML_INFO:
+.if MSEND_NOT_USE_X_ML_INFO
+ .not_yet_implemented
+
+
+# # not do newsyslog in the Sundays morning. $NOT_USE_NEWSYSLOG (CFVersion 2)
+# # value: 1/0
+# MSEND_NOT_USE_NEWSYSLOG:
+.if MSEND_NOT_USE_NEWSYSLOG
+ .not_yet_implemented
+
+
+
+#########################################################################
+##### Section: Other Files for Configurations and Logs ###
+
+# # cache file of Message-ID: loop check
+# # value: filename string
+# LOG_MESSAGE_ID: $VARRUN_DIR/msgidcache
+.if LOG_MESSAGE_ID == $VARRUN_DIR/msgidcache
+ .auto
+
+
+# # cache size of Message-ID: negative cache
+# # value: number
+# MESSAGE_ID_CACHE_BUFSIZE: 6000
+.if MESSAGE_ID_CACHE_BUFSIZE == 6000
+ .auto
+
+
+# # cache file of mailbody cksum mail loop check
+# # value: filename string
+# LOG_MAILBODY_CKSUM: $VARRUN_DIR/bodycksumcache
+.if LOG_MAILBODY_CKSUM == $VARRUN_DIR/bodycksumcache
+ .auto
+
+
+# # $MEMBER_LIST member who can post and use commands
+# # $ACTIVE_LIST delivery list
+# # value: filename string
+# MEMBER_LIST: $DIR/members
+.if MEMBER_LIST == $DIR/members
+ .convert
+
+
+# ACTIVE_LIST: $DIR/actives
+.if ACTIVE_LIST == $DIR/actives
+ .convert
+
+
+
+# # ATTENTION: only "guide" is also send to strangers
+# #
+# # $GUIDE_FILE sent by "# guide" command,
+# # $OBJECTIVE_FILE sent by "# objective" command
+# # $HELP_FILE sent by "# help" command
+# # value: filename string
+# GUIDE_FILE: $DIR/guide
+.if GUIDE_FILE == $DIR/guide
+ .convert
+
+
+# OBJECTIVE_FILE: $DIR/objective
+.if OBJECTIVE_FILE == $DIR/objective
+ .convert
+
+
+# HELP_FILE: $DIR/help
+.if HELP_FILE == $DIR/help
+ .ignore
+
+
+# # When fml rejects mail from someone, fml sends back this file to the sender.
+# # value: filename string
+# DENY_FILE: $DIR/deny
+.if DENY_FILE == $DIR/deny
+ .ignore
+
+
+# # $LOGFILE log file
+# # $MGET_LOGFILE log file for mget routine, $LOGFILE in default.
+# # value: filename string
+# LOGFILE: $DIR/log
+.if LOGFILE == $DIR/log
+ .use
+
+
+# MGET_LOGFILE: $DIR/log
+.if MGET_LOGFILE == $DIR/log
+ .ignore
+
+
+# # suffix extension if defined. For example log.2000
+# # For example $LOGFILE_SUFFIX = ".%C%y", file name is "log.2000".
+# # See UNIX manual "strftime(3)" for more details on format.
+# # value: srtings
+# LOGFILE_SUFFIX:
+.if LOGFILE_SUFFIX
+ .ignore
+
+
+# # when -d2 ($debug = 2), logs this file for convenience.
+# # value: filename string
+# DEBUG_LOGFILE: $DIR/log.debug
+.if DEBUG_LOGFILE == $DIR/log.debug
+ .ignore
+
+
+# # article summary file
+# # value: filename string
+# SUMMARY_FILE: $DIR/summary
+.if SUMMARY_FILE == $DIR/summary
+ .use
+
+
+# # sequence number file
+# # value: filename string
+# SEQUENCE_FILE: $DIR/seq
+.if SEQUENCE_FILE == $DIR/seq
+ .use
+
+
+# # rename(2) lock (liblock.pl)
+# # value: filename string
+# LOCK_FILE: $VARRUN_DIR/lockfile.v7
+.if LOCK_FILE == $VARRUN_DIR/lockfile.v7
+ .ignore
+
+
+
+#########################################################################
+##### Section: SMTP and Delivery ###
+# #
+# # fml sends mail via SMTP to mail server $HOST:$PORT/tcp.
+# # The default host is one fml runs on itself.
+# # $HOST is an arbitrary host (if you can access it) which runs MTA
+# # (e.g. sendmail). If the Mailing List Server machine is week,
+# # you can use the sendmail of another powerful host(host).
+
+# # always try IPv6 connection by default
+# # value: 1/0
+# USE_INET6: 1
+.if USE_INET6 == 1
+ .fml8_default
+
+.if USE_INET6 == 0
+ .unavailable
+
+
+# # value: string
+# HOST: localhost
+.if HOST == localhost
+ .convert
+
+
+# # value: number
+# PORT: 25
+.if PORT == 25
+ .convert
+
+
+# # enforce MAIL FROM:<$SMTP_SENDER> if defined
+# # value: address
+# SMTP_SENDER:
+.if SMTP_SENDER
+ ?
+
+
+# # IF $NOT_TRACE_SMTP IS 1 (default 0), we log the SMTP session to $SMTP_LOG
+# # value: filename string
+# SMTP_LOG: $VARLOG_DIR/_smtplog
+.if SMTP_LOG == $VARLOG_DIR/_smtplog
+ .auto
+
+
+# # rotate use of var/log/_smtplog.$i (where $i is the number)
+# # value: 1/0
+# USE_SMTP_LOG_ROTATE: 1
+.if USE_SMTP_LOG_ROTATE == 1
+ .auto
+
+
+# # expire how old _smtplog.$date
+# # value: number
+# SMTP_LOG_ROTATE_EXPIRE_LIMIT: 90
+.if SMTP_LOG_ROTATE_EXPIRE_LIMIT == 90
+ .auto
+
+
+# # the number of var/log/_smtplog.$i files. This is the value of modulus.
+# # value: number
+# NUM_SMTP_LOG_ROTATE: 8
+.if NUM_SMTP_LOG_ROTATE == 8
+ .auto
+
+
+# # type of suffix for _smtplog
+# # value: number / day
+# SMTP_LOG_ROTATE_TYPE: number
+.if SMTP_LOG_ROTATE_TYPE == number
+ .auto
+
+
+
+# # IF $NOT_TRACE_SMTP IS 1 (default 0), we log the SMTP session to $SMTP_LOG
+# # IF $TRACE_SMTP_DELAY IS 1, we log the delay of response between SMTP server.
+# # value: 1/0
+# NOT_TRACE_SMTP: 0
+.if NOT_TRACE_SMTP == 0
+ .fml8_default
+
+.if NOT_TRACE_SMTP == 1
+ .unavailable
+
+
+# TRACE_SMTP_DELAY:
+.if TRACE_SMTP_DELAY
+ .unavailable
+
+
+# # smtp profile for debug
+# # value: 1/0
+# USE_SMTP_PROFILE: 0
+.if USE_SMTP_PROFILE == 0
+ .unavailable
+
+
+# # You can use plural MTA for parallel delivery.
+# # $MCI_SMTP_HOSTS is the number of hosts you use.
+# # @HOSTS is the array of hosts you use.
+# # value: number
+# MCI_SMTP_HOSTS:
+.if MCI_SMTP_HOSTS
+ .auto
+
+
+# # obsolete today
+# # value: string
+# DEFAULT_RELAY_SERVER:
+.if DEFAULT_RELAY_SERVER
+ .unavailable
+
+
+# # obsolete today
+# # CF (by motonori@wide.ad.jp) base relay control if $RELEY_HACK is on.
+# # with %RELAY_GW, %RELAY_NGW, %RELAY_NGW_DOM (set in librelayhack.pl)
+# # $CF_DEF is CF's configuration files;
+# # **ATTENTION**; we do not use sendmail.cf but CF's configuration.
+# # value: 1/0
+# RELAY_HACK:
+.if RELAY_HACK
+ .unavailable
+
+
+# # obsolete today
+# # value: filename string
+# CF_DEF:
+.if CF_DEF
+ .unavailable
+
+
+# # list-outgoing@domain is a real distribution address. Fml does not
+# # sends article to all recipient list to MTA but only this address.
+# # MTA expands address list and distribute article.
+# # In default fml does not use this but effective for poor machine like
+# # 486 16M ;-)
+# #
+# # fml -> list-outgoing -> expanded and distributed to $ACTIVE_LIST members
+# #
+# # XXX dedicated to minmin sama:D
+# #
+# # value: 1/0
+# USE_OUTGOING_ADDRESS:
+.if USE_OUTGOING_ADDRESS
+ .not_yet_implemented
+
+
+# # list-outgoing@domain is a real distribution address. Fml does not
+# # sends article to all recipient list to MTA but only this address.
+# # MTA expands address list and distribute article.
+# # In default fml does not use this but effective for poor machine like
+# # 486 16M ;-)
+# #
+# # fml -> list-outgoing -> expanded and distributed to $ACTIVE_LIST members
+# #
+# # value: string
+# OUTGOING_ADDRESS:
+.if OUTGOING_ADDRESS
+ .not_yet_implemented
+
+
+# # VERPs: Variable Envelope Return Paths. See qmail documents for more details.
+# # XXX you need additional configuration so that MTA receives VERPs addresses.
+# #
+# # value: 1/0
+# USE_VERP:
+.if USE_VERP
+ .not_yet_implemented
+
+
+# # postfix $verp_delimiters
+# # value: string
+# POSTFIX_VERP_DELIMITERS: +=
+.if POSTFIX_VERP_DELIMITERS == +=
+
+ postfix_verp_delimiters = POSTFIX_VERP_DELIMITERS
+
+
+# # try VERPs once a day for efficient delivery.
+# # value: 1/0
+# TRY_VERP_PER_DAY:
+.if TRY_VERP_PER_DAY
+ .not_yet_implemented
+
+
+# # we use ESMTP pipelining mechanism by default.
+# # value: 1/0
+# NOT_USE_ESMTP_PIPELINING: 0
+.if NOT_USE_ESMTP_PIPELINING == 0
+ .not_yet_implemented
+
+
+# # smtpfeed special option which provides VERPs like error track trick.
+# # value: 1/0
+# USE_SMTPFEED_F_OPTION:
+.if USE_SMTPFEED_F_OPTION
+ .not_yet_implemented
+
+
+#########################################################################
+##### Section: MISC ###
+
+# # ## Sub Section: MIME ##
+# # Mime Decode On if $USE_MIME for ISO-2022-JP statements.
+# # e.g. Decode $SUMMARY_FILE subject and so on.
+# # default 1 from 2.1C#13
+# # value: 1/0
+# USE_MIME: 1
+.if USE_MIME == 1
+ .fml8_default
+
+.if USE_MIME == 0
+ .unavailable
+
+
+# # special hack to treat broken MIME ending (e.g. by MacOS X)
+# # value: 1/0
+# MIME_BROKEN_ENCODING_FIXUP: 0
+.if MIME_BROKEN_ENCODING_FIXUP == 0
+ .not_yet_implemented
+
+
+# # obsolete and Japanese specific
+# # NOT RECOMMENDED OPTION:
+# # articles in the spool are MIME-DECODED for poor environment users.
+# # These articles may be insane in strict MIME oriented mail interfaces.
+# # value: 1/0
+# MIME_DECODED_ARTICLE:
+.if MIME_DECODED_ARTICLE
+ .unavailable
+
+
+
+# # ## Sub Section: Preamble and Trailer for Mail Body ##
+# # FOR COMMAND RESULT MAIL,
+# # you always append some message in the command reply mail body.
+# # For example, the mail body becomes
+# #
+# # $PREAMBLE_MAILBODY
+# # original body
+# # $TRAILER_MAILBODY
+# #
+# # If you use the article distributed in ML, you must use some hooks.
+# # For example, append this in the last of config.ph (but before 1;)
+# # $SMTP_OPEN_HOOK = q
+# # $e{'Body'} = $PREAMBLE_MAILBODY. $e{'Body'} .$TRAILER_MAILBODY;
+# # #;
+# # Please see doc/tutorial for our policy behind this.
+# #
+# # value: string
+# PREAMBLE_MAILBODY:
+.if PREAMBLE_MAILBODY
+ .ignore
+
+# TRAILER_MAILBODY:
+.if TRAILER_MAILBODY
+ .ignore
+
+
+
+# # ## Sub Section: Reply Configurations ##
+# # In the last of e.g. "command status report", we add
+# # "$GOOD_BYE_PHRASE $FACE_MARK" :-) in the last of the reply.
+# # So the standard form is
+# #
+# # message
+# # FYI message generated by the function $PROC_GEN_INFO.
+# # $GOOD_BYE_PHRASE $FACE_MARK
+# # for example, " --$MAIL_LIST, Be Seeing You!"
+# #
+# # value: string
+# GOOD_BYE_PHRASE:
+.if GOOD_BYE_PHRASE
+ .not_yet_implemented
+
+# FACE_MARK:
+.if FACE_MARK
+ .not_yet_implemented
+
+
+# # value: function name string
+# PROC_GEN_INFO: GenInfo
+.if PROC_GEN_INFO
+ .not_yet_implemented
+
+
+
+# # ## Sub Section: Lock Algorithm ##
+# # use flock for lock algorithm if $USE_FLOCK is on.
+# # see flock(2), alarm(3). If not, we rename(2) base lock.
+# # The timeout of rename(2) lock is rand(3) * $MAX_TIMEOUT secs.
+# # value: 1/0
+# USE_FLOCK: 1
+.if USE_FLOCK == 1
+ .fml8_default
+
+.if USE_FLOCK == 0
+ .unavailable
+
+
+# # In rename(2) base lock case,
+# # the timeout of rename(2) lock is rand(3) * $MAX_TIMEOUT secs.
+# # value: number
+# MAX_TIMEOUT: 200
+.if MAX_TIMEOUT == 200
+ .unavailable
+
+
+
+# # ## Sub Section: misc ##
+# # Not spooling of articles (default is "spooling")
+# # It may be used for some secret ML, ML on diskless machihe;-), ISP services
+# # value: 1/0
+# NOT_USE_SPOOL:
+.if NOT_USE_SPOOL == 1
+
+ use_spool = no
+
+.if NOT_USE_SPOOL == 0
+
+ use_spool = yes
+
+
+# # "$CFVersion < 2" equals "$COMPAT_FML15 = 1;"
+# # value: 1/0
+# COMPAT_FML15: 0
+.if COMPAT_FML15 == 0
+ .unavailable
+
+
+# # newsyslog library maximum number. default is 4.
+# # log.4 is removed and
+# # log.3 -> log.4, log.2 -> log.3, log.1 -> log.2, log.0 -> log.1, log -> log.0
+# # value: number
+# NEWSYSLOG_MAX: 4
+.if NEWSYSLOG_MAX == 4
+ .not_yet_implemented
+
+
+# # not used generally. This is "cron of fml package" configuration.
+# # $CRONTAB configuratoin file
+# # $CRON_PIDFILE pid file
+# # value: filename string
+# CRONTAB: etc/crontab
+.if CRONTAB == etc/crontab
+ .unavailable
+
+# CRON_PIDFILE: var/run/cron.pid
+.if CRON_PIDFILE == var/run/cron.pid
+ .unavailable
+
+
+# # not used generally. This is "cron of fml package" configuration.
+# # cron notifies what is done to $MAINTAINER.
+# # value: 1/0
+# CRON_NOTIFY: 1
+.if CRON_NOTIFY == 1
+ .unavailable
+
+
+# # cross operations
+# # value: 1/0
+# USE_CROSSPOST:
+.if USE_CROSSPOST
+ .unavailable
+
+
+# # Under $USE_MEMBER_NAME is set, commands on member lists
+# # are with Gecos Fields which are extracted from From: field
+# # in the time of auto registration.
+# # Author: Masayuki FUKUI <fukui@sonic.nm.fujitsu.co.jp>
+# # value: 1/0
+# USE_MEMBER_NAME:
+.if USE_MEMBER_NAME
+ .not_yet_implemented
+
+
+
+#########################################################################
+##### Section: Expire and Archive ###
+
+# # If $USE_EXPIRE is set, we do expire articles in $SPOOL_DIR.
+# # The default is "no". You need to remove articles if you do so.
+#
+# # Expiration limit is $EXPIRE_LIMIT, which syntax is
+# # e.g. 7days(days) or 100 (articles left in spool)
+# # If you re-generate $SUMMARY_FILE, set $EXPIRE_SUMMARY
+# #
+# # value: 1/0
+# USE_EXPIRE: 0
+.if USE_EXPIRE == 0
+ .not_yet_implemented
+
+
+# # expire summary file when $USE_EXPIRE is enabled.
+# # value: 1/0
+# EXPIRE_SUMMARY:
+.if EXPIRE_SUMMARY
+ .not_yet_implemented
+
+
+# # expire how old articles
+# # value: number / ( number + day/week/month )
+# EXPIRE_LIMIT: 7days
+.if EXPIRE_LIMIT == 7days
+ .not_yet_implemented
+
+
+# # If $USE_ARCHIVE is on, we do automatically archive, which is
+# # spool/articles is aggregated to e.g. "$ARCHIVE_DIR/100.tar.gz"
+# # by the unit $ARCHIVE_UNIT.
+# #
+# # the location of store (when $USE_ARCHIVE on): $ARCHIVE_DIR
+# # the search path order : $ARCHIVE_DIR @ARCHIVE_DIR
+# #
+# # If @ARCHIVE_DIR is set and $ARCHIVE_DIR is not set,
+# # we use $ARCHIVE_DIR[0] as the $ARCHIVE_DIR.
+# #
+# # value: 1/0
+# USE_ARCHIVE: 0
+.if USE_ARCHIVE == 0
+ .unavailable
+
+
+# # spool/articles is aggregated to "$ARCHIVE_DIR/100.tar.gz"
+# # by the unit $ARCHIVE_UNIT.
+# # value: number
+# ARCHIVE_UNIT: 100
+.if ARCHIVE_UNIT == 100
+ .unavailable
+
+
+# DEFAULT_ARCHIVE_UNIT: 100
+.if DEFAULT_ARCHIVE_UNIT == 100
+ .unavailable
+
+
+# # spool/articles is aggregated to "$ARCHIVE_DIR/100.tar.gz"
+# # value: directory string
+# ARCHIVE_DIR: var/archive
+.if ARCHIVE_DIR == var/archive
+ .unavailable
+
+
+# # "index" command
+# # In default we scan spool and archives and reports, but
+# # send back $INDEX_FILE if $INDEX_FILE exists.
+# # value: filename string
+# INDEX_FILE: $DIR/index
+.if INDEX_FILE == $DIR/index
+ .unavailable
+
+
+# # show directory name in "index" command result? default is "no".
+# # value: 1/0
+# INDEX_SHOW_DIRNAME: 0
+.if INDEX_SHOW_DIRNAME == 0
+ .unavailable
+
+
+
+##### Section: Library Commands ###
+# #
+# # "library" command is a small mailing list within mailing list.
+# # It is useful to exchange some files.
+# # You can put and get files by "library" commands.
+# #
+# # In default, @DenyProcedure = ('library'); So 'library' command is disabled;
+# # Set @DenyProcedure = ('') in LOCAL CONFIG part (the last of config.ph).
+# #
+# # value: directory string
+# LIBRARY_DIR: var/library
+.if LIBRARY_DIR == var/library
+ .unavailable
+
+
+# LIBRARY_ARCHIVE_DIR: archive
+.if LIBRARY_ARCHIVE_DIR == archive
+ .unavailable
+
+
+# # ## Sub Section: newsyslog(8) ##
+# # to turn over \$DIR/log
+# # value: number
+# LOGFILE_NEWSYSLOG_LIMIT:
+.if LOGFILE_NEWSYSLOG_LIMIT
+ .not_yet_implemented
+
+
+# # to turn over $ACTIVE_LIST and $MEMBER_LIST if the file size over this value,
+# # default 150K = 30*5000
+# # value: number / (number + K/M)
+# AMLIST_NEWSYSLOG_LIMIT: 150K
+.if AMLIST_NEWSYSLOG_LIMIT == 150K
+ .ignore
+
+
+
+##### Section: Html Configurations ###
+# #
+# # HTML article generator: Please see doc/tutorial for the details.
+# # AUTO_HTML_GEN == AUTOmatic HTML GENeration
+# # if $AUTO_HTML_GEN, we generate html'ed articles in $DIR/$HTML_DIR
+# # value: 1/0
+# AUTO_HTML_GEN:
+.if AUTO_HTML_GEN == 1
+
+ use_html_archive = yes
+
+.if AUTO_HTML_GEN == 0
+
+ use_html_archive = no
+
+
+# # use Mail::HTML::Lite in fml-devel (fml next generation).
+# # value: 1/0
+# USE_NEW_HTML_GEN:
+.if USE_NEW_HTML_GEN == 1
+
+ use_html_archive = yes
+
+.if USE_NEW_HTML_GEN == 0
+
+ use_html_archive = no
+
+
+# # value: 1/0
+# HTML_THREAD: 1
+.if HTML_THREAD == 1
+ .fml8_default
+
+.if HTML_THREAD == 0
+ .not_yet_configurable
+
+
+# # value: 1/0
+# HTML_INDEX_REVERSE_ORDER: 1
+.if HTML_INDEX_REVERSE_ORDER == 1
+ .fml8_default
+
+.if HTML_INDEX_REVERSE_ORDER == 0
+ .not_yet_configurable
+
+
+# # generate html articles under htdocs/
+# # value: directory string
+# HTML_DIR: htdocs
+.if HTML_DIR == htdocs
+ .ignore
+
+
+# # expire old html articles if non-zero value is defined.
+# # not expire in default since the value is 0 or NULL.
+# # options: Please see doc/tutorial for the details.
+# # value: number
+# HTML_EXPIRE_LIMIT:
+.if HTML_EXPIRE_LIMIT
+ .not_yet_configurable
+
+
+# # title of index.html
+# # value: string
+# HTML_INDEX_TITLE:
+.if HTML_INDEX_TITLE
+ .not_yet_configurable
+
+
+# # cache file
+# # value: filename string
+# HTML_DATA_CACHE:
+.if HTML_DATA_CACHE
+ .not_yet_configurable
+
+
+# HTML_DATA_THREAD:
+.if HTML_DATA_THREAD
+ .not_yet_configurable
+
+
+# # filter in generate html file
+# # value: filename string
+# HTML_OUTPUT_FILTER:
+.if HTML_OUTPUT_FILTER
+ .not_yet_configurable
+
+
+# # stylesheet file name (see HTML 4.0)
+# # "fml.css" is default.
+# # value: filename string
+# HTML_STYLESHEET_BASENAME:
+.if HTML_STYLESHEET_BASENAME
+ .not_yet_configurable
+
+
+# # threading algorithm type
+# # value: default / prefer-in-reply-to
+# HTML_THREAD_REF_TYPE: prefer-in-reply-to
+.if HTML_THREAD_REF_TYPE == prefer-in-reply-to
+ .fml8_default
+
+.if HTML_THREAD_REF_TYPE == default
+ .not_yet_configurable
+
+
+# # sort type for entries of thread.html
+# # default is "time" from past to latest,
+# # "reverse-number" is from latest to past.
+# # value: "" / reverse-number
+# HTML_THREAD_SORT_TYPE:
+.if HTML_THREAD_SORT_TYPE == reverse-number
+ .fml8_default
+
+.if HTML_THREAD_SORT_TYPE == NULL
+ .not_yet_configurable
+
+
+# # $subdir type of htdocs/$subdir/
+# # value: number / day / week / month / infinite
+# HTML_INDEX_UNIT: day
+.if HTML_INDEX_UNIT
+ .not_yet_configurable
+
+
+# # threading type
+# # value: "" / UL
+# HTML_INDENT_STYLE: UL
+.if HTML_INDENT_STYLE
+ .not_yet_configurable
+
+
+# # image file embedding style
+# # value: A / IMAGE
+# HTML_MULTIPART_IMAGE_REF_TYPE:
+.if HTML_MULTIPART_IMAGE_REF_TYPE
+ .not_yet_configurable
+
+
+# # html file umask
+# # value: "" / umask
+# HTML_DEFAULT_UMASK:
+.if HTML_DEFAULT_UMASK
+ .not_yet_configurable
+
+
+# HTML_WRITE_UMASK:
+.if HTML_WRITE_UMASK
+ .not_yet_configurable
+
+
+
+##### Section: Interface to DataBase Management System ###
+
+# # value: 1/0
+# USE_DATABASE:
+.if USE_DATABASE
+ .fml8_default
+
+
+# # value:
+# DATABASE_METHOD:
+.if DATABASE_METHOD
+ .ignore
+
+
+# # value:
+# DATABASE_CACHE_FILE_SUFFIX:
+.if DATABASE_CACHE_FILE_SUFFIX
+ .ignore
+
+
+# # value: filename
+# DATABASE_DRIVER: toymodel.pl
+.if DATABASE_DRIVER == toymodel.pl
+ .ignore
+
+
+# # attributes to inform database drivers
+# # value:
+# DATABASE_DRIVER_ATTRIBUTES: always_lower_domain
+.if DATABASE_DRIVER_ATTRIBUTES == always_lower_domain
+ .ignore
+
+
+# # ## Sub Section: RDBMS
+
+# # value: string
+# SQL_SERVER_HOST:
+.if SQL_SERVER_HOST
+ .ignore
+
+
+# # value: number
+# SQL_SERVER_PORT:
+.if SQL_SERVER_PORT
+ .ignore
+
+
+# # value: string
+# SQL_SERVER_USER:
+.if SQL_SERVER_USER
+ .ignore
+
+
+# # value: string
+# SQL_DATABASE_NAME:
+.if SQL_DATABASE_NAME
+ .ignore
+
+
+# # value: string
+# SQL_SERVER_PASSWORD:
+.if SQL_SERVER_PASSWORD
+ .ignore
+
+
+# # value: string
+# SQL_DATABASE_NAME:
+.if SQL_DATABASE_NAME
+ .ignore
+
+
+
+# # ## Sub Section: LDAP
+
+# # value: string
+# LDAP_SERVER_HOST:
+.if LDAP_SERVER_HOST
+ .ignore
+
+
+# LDAP_SERVER_PASSWORD:
+.if LDAP_SERVER_PASSWORD
+ .ignore
+
+
+# LDAP_SEARCH_BASE:
+.if LDAP_SEARCH_BASE
+ .ignore
+
+
+# LDAP_SERVER_BIND:
+.if LDAP_SERVER_BIND
+ .ignore
+
+
+# LDAP_QUERY_FILTER:
+.if LDAP_QUERY_FILTER
+ .ignore
+
+
+
+
+##### Section: Interface to other Services (http,ftp,gopher,www) ###
+
+# # "whois": default is search of local database file
+# # If "whois -h host" syntax is given, we connects "host" whois server.
+# # If $USE_WHOIS set, you can use local database $WHOIS_DB.
+# # If you have local whois server (inetd), you can also use it.
+# # If "whois help" is given, send back $WHOIS_HELP_FILE if it exists.
+# #
+# # value: 1/0
+# USE_WHOIS:
+.if USE_WHOIS
+ .unavailable
+
+
+# # value: string
+# DEFAULT_WHOIS_SERVER:
+.if DEFAULT_WHOIS_SERVER
+ .unavailable
+
+
+# # value: filename string
+# WHOIS_DB: $VARDB_DIR/whoisdb
+.if WHOIS_DB == $VARDB_DIR/whoisdb
+ .unavailable
+
+
+# WHOIS_HELP_FILE:
+.if WHOIS_HELP_FILE
+ .unavailable
+
+
+# # do Japanese conversion or not? for the result from whois server
+# # value: 1/0
+# WHOIS_JCODE_P: 1
+.if WHOIS_JCODE_P == 1
+ .unavailable
+
+
+
+#########################################################################
+##### Section: Architecture Dependence ###
+
+# # cpu-type manufacturer operating-system by GNU config.guess ("makefml")
+# # value: string
+# CPU_TYPE_MANUFACTURER_OS:
+.if CPU_TYPE_MANUFACTURER_OS
+ .auto
+
+
+# # struct sockaddr
+# # It is system dependent.
+# # value: string
+# STRUCT_SOCKADDR: S n a4 x8
+.if STRUCT_SOCKADDR
+ .auto
+
+
+# # flock(2) system call; please see "/usr/include/sys/file.h"
+# # value: number
+# LOCK_SH: 1
+.if LOCK_SH
+ .auto
+
+
+# LOCK_EX: 2
+.if LOCK_EX
+ .auto
+
+
+# LOCK_NB: 4
+.if LOCK_NB
+ .auto
+
+
+# LOCK_UN: 8
+.if LOCK_UN
+ .auto
+
+
+# # enforce solaris 2 compatible
+# # value: 1/0
+# COMPAT_SOLARIS2:
+.if COMPAT_SOLARIS2
+ .auto
+
+
+# # used in cron of fml package
+# # we can emulate daemon(3) ?
+# # value: 1/0
+# NOT_USE_TIOCNOTTY:
+.if NOT_USE_TIOCNOTTY
+ .auto
+
+
+# # On Unix, always yes set 1 in &SetDefaults;
+# # value: 1/0
+# HAS_GETPWUID: &is_unix
+.if HAS_GETPWUID
+ .auto
+
+
+# # On Unix, always yes set 1 in &SetDefaults;
+# # value: 1/0
+# HAS_GETPWGID: &is_unix
+.if HAS_GETPWGID
+ .auto
+
+
+# # On Unix, always yes set 1 in &SetDefaults;
+# # value: 1/0
+# HAS_ALARM: &is_unix
+.if HAS_ALARM
+ .auto
+
+
+# # On Unix, always yes set 1 in &SetDefaults;
+# # value: 1/0
+# UNISTD: &is_unix
+.if UNISTD
+ .auto
+
+
+
+# # program paths fml uses
+# # Usually "makefml newml" checks and expands this value.
+# # value: filename string
+# SENDMAIL: &path(sendmail)
+.if SENDMAIL
+ .auto
+
+
+# TAR: &path(tar) cf -
+.if TAR
+ .auto
+
+
+# UUENCODE: &path(uuencode)
+.if UUENCODE
+ .auto
+
+
+# COMPRESS: &path(gzip) -c
+.if COMPRESS
+ .auto
+
+
+# ZCAT: &path(gzcat:zcat:gzip\s-cd)
+.if ZCAT
+ .auto
+
+
+# LHA: &path(lha)
+.if LHA
+ .auto
+
+
+# ISH: &path(ish)
+.if ISH
+ .auto
+
+
+# ZIP: &path(zip)
+.if ZIP
+ .auto
+
+
+# BZIP2: &path(bzip2)
+.if BZIP2
+ .auto
+
+
+# PGP: &path(pgp)
+.if PGP
+ .auto
+
+
+# PGP5: &path(pgp5)
+.if PGP5
+ .auto
+
+
+# PGPE: &path(pgpe)
+.if PGPE
+ .auto
+
+
+# PGPK: &path(pgpk)
+.if PGPK
+ .auto
+
+
+# PGPS: &path(pgps)
+.if PGPS
+ .auto
+
+
+# PGPV: &path(pgpv)
+.if PGPV
+ .auto
+
+
+# GPG: &path(gpg)
+.if GPG
+ .auto
+
+
+# RCS: &path(rcs)
+.if RCS
+ .auto
+
+
+# CI: &path(ci)
+.if CI
+ .auto
+
+
+
+# BASE64_DECODE:
+.if BASE64_DECODE
+ .auto
+
+
+
+# BASE64_ENCODE:
+.if BASE64_ENCODE
+ .auto
+
+
+# MD5: &path(md5:md5sum)
+.if MD5
+ .auto
+
+
+
+# LOCAL_CONFIG:
+# # ## Sub Section: Available Hooks ##
+# # You can set customized hooks here. See doc/tutorial's chapter "HOOKS".
+# # For example available hooks are
+# # $START_HOOK, $DISTRIBUTE_START_HOOK, $SMTP_OPEN_HOOK
+# # $HEADER_ADD_HOOK, $DISTRIBUTE_CLOSE_HOOK, $DISTRIBUTE_END_HOOK
+# # $ADMIN_COMMAND_HOOK, $RFC1153_CUSTOM_HOOK, $MSEND_OPT_HOOK
+# # $FML_EXIT_HOOK, $FML_EXIT_PROG, $MSEND_START_HOOK
+# # $REPORT_HEADER_CONFIG_HOOK, $AUTO_REGISTRATION_HOOK, $MSEND_HEADER_HOOK
+# # $SMTP_CLOSE_HOOK, $MODE_BIFURCATE_HOOK. $HTML_TITLE_HOOK
+# # $PROCEDURE_CONFIG_HOOK, $ADMIN_PROCEDURE_CONFIG_HOOK, $COMMAND_HOOK
+# #
+# # ## Sub Section: Available Arrays and Assoc-Arrays ##
+# # Also you can set here arrays and association arrays:
+# #
+# # @MEMBER_LIST, @ACTIVE_LIST, @CROSSPOST_CF
+# # @HOST, @HOSTS, @MAIL_LIST_ALIASES, @HdrFieldsOrder
+# #
+# # value: perl statement
diff --git a/fml/lib/FML/Merge/FML4/config_ph.pm b/fml/lib/FML/Merge/FML4/config_ph.pm
new file mode 100644
index 00000000..d3d32986
--- /dev/null
+++ b/fml/lib/FML/Merge/FML4/config_ph.pm
@@ -0,0 +1,61 @@
+#-*- perl -*-
+#
+# Copyright (C) 2004 Ken'ichi Fukamachi
+# All rights reserved. This program is free software; you can
+# redistribute it and/or modify it under the same terms as Perl itself.
+#
+# $FML: @template.pm,v 1.8 2004/01/01 07:29:27 fukachan Exp $
+#
+
+package FML::Merge::FML4::config_ph;
+use strict;
+use vars qw(@ISA @EXPORT @EXPORT_OK $AUTOLOAD);
+use Carp;
+
+=head1 NAME
+
+FML::Merge::FML4::config_ph - what is this
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+=head1 METHODS
+
+=head2 C<new()>
+
+=cut
+
+sub new
+{
+ my ($self) = @_;
+ my ($type) = ref($self) || $self;
+ my $me = {};
+ return bless $me, $type;
+}
+
+
+=head1 CODING STYLE
+
+See C<http://www.fml.org/software/FNF/> on fml coding style guide.
+
+=head1 AUTHOR
+
+Ken'ichi Fukamachi
+
+=head1 COPYRIGHT
+
+Copyright (C) 2004 Ken'ichi Fukamachi
+
+All rights reserved. This program is free software; you can
+redistribute it and/or modify it under the same terms as Perl itself.
+
+=head1 HISTORY
+
+FML::Merge::FML4::config_ph appeared in fml8 mailing list driver package.
+See C<http://www.fml.org/> for more details.
+
+=cut
+
+
+1;
diff --git a/fml/lib/FML/Merge/Utils.pm b/fml/lib/FML/Merge/Utils.pm
new file mode 100644
index 00000000..4c887a43
--- /dev/null
+++ b/fml/lib/FML/Merge/Utils.pm
@@ -0,0 +1,61 @@
+#-*- perl -*-
+#
+# Copyright (C) 2004 Ken'ichi Fukamachi
+# All rights reserved. This program is free software; you can
+# redistribute it and/or modify it under the same terms as Perl itself.
+#
+# $FML: @template.pm,v 1.8 2004/01/01 07:29:27 fukachan Exp $
+#
+
+package FML::Merge::Utils;
+use strict;
+use vars qw(@ISA @EXPORT @EXPORT_OK $AUTOLOAD);
+use Carp;
+
+=head1 NAME
+
+FML::Merge::Utils - what is this
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+=head1 METHODS
+
+=head2 C<new()>
+
+=cut
+
+sub new
+{
+ my ($self) = @_;
+ my ($type) = ref($self) || $self;
+ my $me = {};
+ return bless $me, $type;
+}
+
+
+=head1 CODING STYLE
+
+See C<http://www.fml.org/software/FNF/> on fml coding style guide.
+
+=head1 AUTHOR
+
+Ken'ichi Fukamachi
+
+=head1 COPYRIGHT
+
+Copyright (C) 2004 Ken'ichi Fukamachi
+
+All rights reserved. This program is free software; you can
+redistribute it and/or modify it under the same terms as Perl itself.
+
+=head1 HISTORY
+
+FML::Merge::Utils appeared in fml8 mailing list driver package.
+See C<http://www.fml.org/> for more details.
+
+=cut
+
+
+1;