[PREVIOUS CHAPTER]
[NEXT CHAPTER]
5 ファイルをまとめて操作する関数群 (mgetとまとめおくりで使う)
5.1 mget options (help file より)
mgetは『そのコマンドごとに』『まとめおくりはユーザーごとに』送り方が指
定できます。以下 help ファイルより抜粋
5.2 mget3 のデフォールトの変更
○ 複数のファイルを一つにする時のまとめ方のデフォールト
$MGET_MODE_DEFAULT can change the default file format "mget" command
sends back. The default format is "tgz" on UNIX, 'mp' on Windows NT4.
libsendfile.pl では
local($mode) = $MGET_MODE_DEFAULT || 'tgz'; # default
のようになっています。オプションで明示的な指定がない場合は
tar して gzip をかけたフォーマット(binary)
そして uuencode して送られます。
で送り返されます。このデフォールトは $MGET_MODE_DEFAULT で変更できます。
定義して意味のある変数は 上述のmgetのオプションと同じと思って構いませ
ん。正確には(libfop.pl中で定義されている) %_fp というハッシュテーブル
のKEY(2番目の引数のフィールド)です。
uf
rfc934
rfc1153
mp
gz
tgz
lhaish
lhauu
uu
○ アーカイブ(var/archive や library コマンドや…)のencodingのデフォールト
spool とは別にMLのアーカイブがある場合がありえます。例えば
電話番号簿(TEXT)
100個ずつにまとめたスプールの記事(BINARY)
このアーカイブを取り寄せる時のデフォールトは
テキスト $MGET_TEXT_MODE_DEFAULT
(デフォールトは 'mp' MIME/Multipart)
バイナリ $MGET_BIN_MODE_DEFAULT
(デフォールトは 'uu' uuencode された状態);
$mode = -T $opt ?
($MGET_TEXT_MODE_DEFAULT || 'mp'):
($MGET_BIN_MODE_DEFAULT || 'uu');
○ Subject の設定
$MGET_SUBJECT_TEMPLATE
という変数をテンプレートとして用いています。これを元にいくつかの入れ替
えをおこなって subject を生成しています。
これは
result for mget _DOC_MODE_ _PART_ _ML_FN_
のように定義されている場合
_DOC_MODE_ <=> [last:10 tar + gzip]
_PART_ <=> (1/4)
_ML_FN_ <=> $ML_FN (here is "(Elena Lolobrigita ML)")
という置換えが行なわれ、最終的に
Subject: result for mget [last:3 tar + gzip] (1/1) (Elena Lolobrigita ML)
という形で mget の result が送り返されます。よってこの変数を適当に削る
なりすれば subject をカスタマイズできます。
5.3 mget3 インターフェイス:パターンマッチ戦略
5.4 プログラムのパス
6.57.4
ファイル操作ではいくつか下請けのプログラムを呼ぶことがあります。これら
は makefml が自動的に検出し、設定するはずです。でも一応確認はして下さ
い。自分でチェックしながら config.ph に書くのは管理者として望ましい態
度です。site_init.ph もしくは sitedef.ph 等で一回ちゃんと記述してあと
はほっておくというのもよい手です。
現在ファイル操作関係で自動的に検出し設定されるのは次のコマンドです。
変数名 設定例
$TAR = "/usr/bin/tar cf -";
$UUENCODE = "/usr/bin/uuencode";
$COMPRESS = "/usr/bin/gzip -c";
$ZCAT = "/usr/bin/zcat";
$LHA = "/usr/local/bin/lha";
$ISH = "/usr/local/bin/ish";
5.5 mget3 の送り返しプロセス
いくつかのファイルをまとめて送り返すプロセスの最終ステージは、次のよう
に行なわれます。
○ mget3 interface はロックがかかっている状態のうちに
$TMP_DIR に送り返すべきファイルを作っておきます。
送り返しプロセスはロックを外した後で行なわれる。
なお $TMP_DIR に作られる中間ファイルは次のようなファイル名になっている。
m:"モード名":"プロセスID"return.数字(分割されるため)
送り返すものが複数になった時のために”分割の数字”は必要であるのは自明
だが、一意にファイルを定めるためにはプロセスIDとモード名までがセットに
なる必要がある。というのは一つのメールで「複数のモードの mget コマンド
を使う」ことができるからである。
○ ロックをはずす (&Unlock();)
というのは、送り返すプロセスが長い場合ML自体およびその後に来たもっと
手間のかからないプロセスさえもロックして止まてしまうのはいけないからで
ある。
○ &RunStartHooks; から mget3_SendingEntry を呼び出す。
mget3_SendingEntry は %mget_list に従い下位インターフェイスを呼び出す。
ロックははずれているので、複数の送り返しプロセスがどう時に走っても構わ
ない。
ファイルが分割されている場合、送り返しは $MGET_SEND_BACK_SLEEPTIME (が
未定義なら $SLEEPTIME) 時間ごとに行なわれる。mget コマンドで明示的に指
定される場合以外はデフォールトの $MGET_SEND_BACK_SLEEPTIME
($SLEEPTIME) が優先される。$SLEEPTIME は $MGET_SEND_BACK_SLEEPTIME の
古い名前である
注意:なお通常の条件下では今送り返そうとしている中間ファイルが 上書きさ
れることはありえない。異常な場合は有り得るだろうが…(そんな状態のOS下
でプロセスはマトモに動かないだろう)
5.6 コマンドで単なるシンタックスエラーの警告をする
明示的に $USE_WARNING をセット
e.g. in config.ph
$USE_WARNING = 1;
するとコマンドメールでのシンタックスエラーの警告をする。デフォールトは
しない。
e.g.
# helps ←コマンドのエラーは警告
#うじゃ ←シンタックスエラー警告なし
#しぐにちゃ〜 uja@uja.ac.jp ←シンタックスエラー警告なし
5.7 mget の送り返し時のファイルサイズ
$MAIL_LENGTH_LIMIT (default is 1000 lines)
は複数のファイルに分割する時の一通あたりの大きさです。行数で指定します。
Internetならともかく、パソコン通信の人へも配送する時は気を使いますよね
(最近ではそうでもないのか?よくしらない)。
目安としては1000行でだいたい50kくらいになるので1000が選ばれています。
5.8 mget で指定できるファイルの最大数
mget で指定できるファイル数の最大値。デフォールトは1000で mget * など
として1000通以上のファイルを指定するとエラーになる。
$MGET_SEND_BACK_FILES_LIMIT
5.9 Mget Format: Unix From 形式
4.4BSD UNIX の sendmail は /usr/libexec/mail.local を使い各ユーザ(e.g.
fukachan) 宛のメールを /var/mail/fukachan に保存しています。
この形式が UNIX FROM 形式です。$HOME/mbox も同様ですね。
From fukachan Mon Jan 26 09:11:46 1998
Received: by hikari.fml.org (8.8.8/3.4W6+Hikari-2.1)
with ESMTP id JAA02846 for <uja@fml.org>;
Mon, 26 Jan 1998 09:11:46 +0900 (JST)
From: fukachan@sapporo.iij.ad.jp
Subject: uja
なんとなくです。なんとなく
MH の inc はこの形式のファイルを処理することを前提にしています。
5.10 Mget Format: MIME/MultipartのBNF表現(RFC1521より)
boundary := 0*69<bchars> bcharsnospace
bchars := bcharsnospace / " "
bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" / "+" /"_"
/ "," / "-" / "." / "/" / ":" / "=" / "?"
Overall, the body of a multipart entity may be specified as
follows:
multipart-body := preamble 1*encapsulation
close-delimiter epilogue
encapsulation := delimiter body-part CRLF
delimiter := "--" boundary CRLF ; taken from Content-Type field.
; There must be no space
; between "--" and boundary.
close-delimiter := "--" boundary "--" CRLF ; Again, no space
by "--",
preamble := discard-text ; to be ignored upon receipt.
epilogue := discard-text ; to be ignored upon receipt.
discard-text := *(*text CRLF)
body-part := <"message" as defined in RFC 822,
with all header fields optional, and with the
specified delimiter not occurring anywhere in
the message body, either on a line by itself
or as a substring anywhere. Note that the
semantics of a part differ from the semantics
of a message, as described in the text.>
5.11 Mget Format: MIME/Multipartの見本
Date: Thu, 18 May 95 22:33:00 JST
From: Elena@phys.titech.ac.jp (Elena Lologrigita)
Subject: P R E S E N T
To: fukachan@phys.titech.ac.jp
MIME-Version: 1.0
Content-type: multipart/mixed;
boundary="--Thu_18_May_95_22:32:56--"
5.12 Mget Format: RFC934
rfc934 "Proposed Standard for Message Encapsulation"
MH の burstで複数の展開に展開できます。
Example:
5.13 Mget Format: RFC1153 digest
5.14 Mget Format: 1153 のカスタマイズ
$RFC1153_ISSUE MLの記事番号ではなく1153形式で送り出す時の番号
$RFC1153_SEQUENCE_FILE その番号を保存するファイル
このルーチンが呼ばれるたびにカウンタは進みますが、
前述のように各ユーザごとに1153で送る場合を考えると
送り方はそれぞれ違うのだから
番号はちゃんとつながってはくれません。
これを解決する方法はありません
$RFC1153_LISTNAME まとめ送りする1153 digest につけるタイトル
$RFC1153_VOL Volume 例えば96年度のまとめ送りなら Volume 96の
ようなレベルの番号
$RFC1153_CUSTOM_HOOK &Rfc1153Custom($mode, *conf) の中で
行なわれるフック
&Rfc1153Custom($mode, *conf) internal:
########## CUSTOMIZE BELOW ##########
$issue = $RFC1153_ISSUE || 1;
$listname = $RFC1153_LISTNAME || "UJA";
$vol = $RFC1153_VOL || $year;
$IssueSeq = $RFC1153_SEQUENCE_FILE ||
"$FP_VARLOG_DIR/IssueSeq"; # file to remember count;
&GetTime;
&eval($RFC1153_CUSTOM_HOOK, 'RFC1153 custom:');
$issue = &Rfc1153GetSeq($IssueSeq);
5.15 Mget Format: lzh + ish option
FYI: 一部のOS(Sun OS 4.x ?)で 2.2 でうまく動かない時に
$INSECURE_SYSTEM = 1; を設定すると動くことがあります。
9.15
mget 200-210 ish
の用に指定するとlzh して ish(s7 mode)したものを送り返します。
$LHA = "/usr/share/bin/lha";
$ISH = "/home/axion/fukachan/bin/ish";
等をどこかで(config.ph or sitedef.ph)で設定して下さい。makefml が自動
探索て設定されているはずですが確認はして下さい。
5.16 SJIS にファイルを変換して送る (lzh + ish と lhz + uuencode option)
config.ph で $USE_SJIS_IN_ISH = 1; をセットすると lha を使うタイプでは
SJIS に変換します。変数名は ish だけのように見えますが歴史的なものです。
lha を使うならいづれの場合にも適用されます。
^M ^Z もつけます。すべて、外部コマンドを使わずに自力でやります。
[PREVIOUS CHAPTER]
[NEXT CHAPTER]