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

[FDclone-users:00842] Re: FDclone 3.00d has been released



 しらいです。

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

>  本日下記 URL にて FDclone 3.00d を公開しましたのでご案内申
> 上げます。
> 	http://hp.vector.co.jp/authors/VA012337/soft/fd/
> 	ftp://ftp.unixusers.net/src/fdclone/

 普段は fj.sources への投稿を先に行なっているんですが、そろ
そろ fj も読んでる人が殆んどいなくなってきているので、今回か
ら HTTP/FTP のみの公開とします。
 と言うか、使ってた NNTP サーバがとうとう閉鎖しちゃったみた
いで投稿環境が無いんですよね。HP testdrive も閉鎖しちゃうし、
FDclone 開発周辺の環境も時代の波に飲まれつつあります。


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

 では気を取り直して変更点の解説です。


> 	一部の環境でファイル名補完時にフリーズする点を修正。

 gcc の一部のバージョンでは、被代入変数のアドレス計算を代入
実行に先駆けて行なう実装になっているようです。

 例えば動的配列 array に対して「array[0] = func()」という代
入式があった場合、通常は
	1.func() 実行
	2.array[0] のアドレス計算
	3.求めたアドレスに func() の結果を格納
という順番になります。
 これが 2. -> 1. -> 3. の順で行なわれ、尚且つ func() の副作
用として array の realloc() を行なっていた場合、2. で求めた
アドレスは既に無関係の領域になっています。
 そのため、不正なアドレスにアクセスしてしまいフリーズしてい
ました。

 gcc の挙動はともかく、代入の右辺値を計算している過程で左辺
値アドレスに変更があった場合の動作は、多分規格上でも保証はさ
れていないと思うので、余り好ましいコードではありません。
 なので、この箇所の実装を改め、副作用のある関数の実行を代入
文より前の段階に移すことで、このフリーズは解消しました。


> 	su(1) 経由で login shell として使用時の起動パス認識ミスを修正。

 FDclone は MS-DOS 文化を引きずっているために、起動ディレク
トリを調べるという UNIX 文化では普通考えられないことを行なっ
ています。

 具体的には、argv[0] がパス名無しだった場合は PATH を参照し
ている筈なので、その中から自分自身が最初に見つかったディレク
トリを起動ディレクトリと見なしています。
 そもそもこの乱暴なやり方自体に問題がないでもないのですが、
su(1) の場合は su という実行ファイルの存在するディレクトリな
んか調べたって何の参考にもなりません。
 なので、自動ファイル名が su の場合は必ず login shell を参
照して、その在処を自動ディレクトリと見なすように改めました。


> 	内部変数 HISTSIZE に大きな値を設定するとフリーズする点を修正。

 HISTSIZE の型は short なんですが、変数値である文字列から数
値としての設定値を計算する際に、int の返り値をそのまま short
変数に代入していました。
 このため、32768 以上の大きな値に関しては負数に符合拡張され
てしまい、その結果意図しないアドレスを参照してしまっていまし
た。


> 	組込みコマンド echo が - で始まる文字列を無視していた点を修正。

 3.00 で echo に -N option を追加した際に、引数の構文解析に
汎用的な関数を用いてしまったために、「-」で始まる引数を全て
option 扱いにしていました。
 これだと「-」で始まる引数を印字したい場合に困るので、-n と
-N 以外は単なる引数として扱うように変更しました。


> 	一部の VT100 互換端末でファンクションキーが効かない点を修正。

 本物の VT100 は F1-F4 で \eOP-\eOS を吐いてたようなんです
が、世にある VT 端末互換エミュレータは VT400 辺りのシーケン
ス \e[11~-\e[14~ を吐くような仕様が多いようです。
 これだと termcap や terminfo の記述と合わないため、そうい
う端末エミュレータではファンクションキーが使えなくなってしま
います。

 FDclone にはそういった de-facto standard 的なキーシーケン
スを default 値に用意してあるのですが、termcap から拾ったキ
ーシーケンスでその値を上書きしてしまいます。
 それでは既定値を用意した意味がないので、このお節介な既定
値を可能な限り残すようにしました。


> 	64bit 環境の BSD で ioctl() が吐いていた警告を修正。

 *BSD 的には inctl() の第二引数は unsigned long なので、int
値を渡すと型の不一致エラーが発生して syslog に警告が残ってし
まいます。
 unsigned long ではない環境も多いので、*BSD 系の OS の一部
だけ unsigned long で ioctl() を呼ぶようにしました。

                                               しらい たかし