[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:00395] Re: FDclone 2.06d has been released



 しらいです。

 ちょっと間が開いてしまったので変更点が多くなってます。加え
て 2.07 用に pty 対応のために用意した枠組を先行投入している
ため、patch も不必要に大きいものになっています。

In Message-Id <20050510110227.5F9BC40C392@yuka.unixusers.net>
        Takashi SHIRAI <shirai@unixusers.net>writes:
>  しらいです。

>  以下は HISTORY より今回の変更点の抜粋です。

 では変更点の解説です。判りにくいところがあれば忌憚なくご質
問下さい。


> 	/etc/fd2rc のインストール先をコンパイル時に指定可能に。

 Install に追加した記述のとおりですが、「make CONFDIR=/foo」
とすることで /etc/fd2rc を /foo/fd2rc に変更出来るようにしま
した。
 各種 package メンテナさんからかねてより頂いていたリクエス
トに応える形で対応しました。


> 	フロッピードライブの禁止ファイル名に COM5-COM9 を追加。

 MS-DOS 用 FAT 形式の floppy や HDD を UNIX 環境から覗き見
る機能が「フロッピードライブ」です。

 そういう media はMS-DOS からも access されるので MS-DOS ル
ールに則る必要があり、filename に使用出来る文字などの制限事
項があります。
 CONCON 問題が記憶に新しいように、MS-DOS file system では幾
つかの予約名が用意されており、一般の filename として使用する
ことが禁止されています。
 COM5-COM9 もその中の一つなんですが、Windows NT archtecture
で初めて禁止された filename なので従来はフロッピードライブ経
由でこういう filename を生成可能にしてありました。

 実際は、NT architecture でも serial port を増設しない限り
は問題にはならないのですが、一応除外対象に含めることにしまし
た。


> 	関数内にヒアドキュメントを記述できなかった点を修正。

 「cat << EOF」みたいにして「ここに書いてるのを標準入力に渡
してね、というのが here document です。

 最初は pipe(2) で実装されていたために一回きりの使い捨てに
なってしまっていたのですが、2.02 で一時 file を使う実装にし
て for などの statement 中からも使えるようにしました。
 ところが、関数の中に here document を書いた場合、関数定義
が完了した時点でその一時 file を不要だと思い込んで削除してし
まっていたので、関数利用時にはその一時 file を参照することが
出来ませんでした。

 そこで、その関数定義が削除されるまでは一時 file を削除しな
いように実装を改めました。


> 	ファイル名補完時に画面が崩れることがある点を修正。

 command line で Tab を入力すると filename 補完機能が働きま
す。この時複数の候補があれば、もう一度 Tab を入力した時点で
filename 選択モードになります。

 この時に、既に command line に複数行の入力文字列があった場
合、画面全体が scroll した状態にあり、従来 filename 表示領域
であった部分に command line 文字列が侵食する形になります。
 この状態で filename 選択モードに入ってしまうと、その従来の
filename 表示領域いっぱいまで候補の filename 群を表示してし
まうため、結果 filename 表示が command line 文字列を上書きし
てしまいます。

 これを回避するため、command line 文字列が filename 表示領
域を侵食していた場合には、filename 選択モードの表示範囲をそ
の分減らして対処するようにしました。


> 	組込みコマンドのパイプ処理で子プロセスが異常終了する点を修正。

 組込みコマンドの中には端末入出力を直接操作するものが幾つか
あります。
 例えば「dir -p」とすると一画面分の表示の後にキー入力待ちに
なりますが、この時 /dev/tty という端末 device を直接操作して
います。

 一方「|」で区切った command の並びを pipeline と言い、これ
は前段の標準出力を後段の標準入力とする機能です。UNIX ではこ
の実装に fork(2) と pipe(2) を用います。
 即ち、パイプの前段は必ず子プロセスとなっており、子プロセス
は勝手に端末を操作出来ないために、この前段に上記のような組込
みコマンドを使うとそのプロセスが異常終了してしまいます。

 例えば「dir -p | less」とやってみると前段の「dir」が異常終
了した旨の表示が現れることがあります。これは多分にタイミング
の問題なので、環境によっては滅多に出ませんが出る時は出ます。
 この原因を解説するのは難しいのですが、前段プロセスが端末操
作不能になった際の割込み (SIGTTOU) が発生した時にたまたま端
末操作関数 (ioctl()) を利用していると、この関数が割込みエラ
ー (EINTR) になるのでエラー終了になります。

 この対処としては、pipeline 前段では SIGTTOU を無視させ、な
おかつ ioctl() が EINTR でエラーになった場合には再試行させる
ようにしました。


> 	日本語ディレクトリからの起動時に異常終了する点を修正。

 [FDclone-users:00367] に始まる thread に準ずる bugfix です。

# HISTORY の記述順は大概処理を行なった順番になってまして、
#ここまで作業して 4 月になったというスケジュールになってま
#す。実はこの時点では 2.06d は 4/10 release 予定でした :-)


> 	fdsh でウィンドウ分割のまま fd を抜けると異常終了する点を修正。

 fdsh という名前で起動された FDclone は shell 形態となって
おり、その中では「fd」は組込みコマンド扱いになってます。

 この状態で「/」でウィンドウ分割してそのまま「fd」を抜ける
と元の shell 形態に戻ります。しかし、この状態でもウィンドウ
の最大数を憶えていて、再び「fd」を起動すると話がややこしくな
ります。
 組込みコマンド「fd」は複数の引数を記述して起動しない限りは
単一ウィンドウで起動する設計になっています。なのに二度目の起
動では最初からウィンドウ数 = 2 として起動されます。
 この時、2 つめのウィンドウは中身に一体何を表示したらいいの
か定まっていないため、メモリ参照違反を起こして異常終了してし
まいます。

 実際は異常終了しないで下半分が真っ黒になった状態で起動する
という環境も多いのですが、どの道おかしな挙動には違いないので、
組込みコマンド「fd」起動時には必ずウィンドウ最大数を 1 にリ
セットするようにしました。


> 	子プロセス実行中の画面サイズ変更に対応していなかった点を修正。

 Tera Tern や kterm 等のソフトウェア端末はその画面サイズを
動的に変更することが出来ます。

 この時、端末はその端末を使う各プロセスに端末サイズ変更を教
える signal (SIGWINCH) を発行し、それを受けたプロセスは改め
て画面サイズを問い合わせて画面の再描画を行ないます。
 ここで言う「各プロセス」とはその端末を制御可能にあるプロセ
スのことで、例えば子プロセスが端末制御を行なっている場合には
親プロセスには SIGWINCH は送られません。
 このため、file 表示中とか何らかの外部コマンド実行中とかで
すと、FDclone 自身はその間の端末サイズ変更を知ることが出来ず
に、変更前のサイズだと思い込んだまま作業続行していました。

 これを回避するため、子プロセス終了時には必ず画面サイズを問
い合わせることにして、常に正しい画面サイズを確保するようにし
ました。

# 因みにこの実装では不十分な環境も一部にあって、次の 2.07
#で対処する予定です。
# 例えば HP-UX の more(1) は画面サイズを環境変数 LINES や
#COLUMNS から求めているので、FDclone が知っている値をこれら
#の環境変数に入れて渡してやらないと、起動時のサイズが延々と
#more(1) に伝わり続けてしまいます。
# 普通は端末に問い合わせてサイズを求めるものなんですけど、
#変数があるからって横着しちゃってるみたいですね。

                                               しらい たかし