ruby-trunk-changes r33710 - r33727

今日は久々に大量のコミットが。ioctl/fcntl の変数の型にまつわる修正とそれに伴なって大きめのリファクタリングがありました。

akr:r33710 2011-11-11 23:01:25 +0900

dbm の extconf.rb で、これまでは dbm_open() や dbm_clearerror() が関数マクロで提供されていた場合のために __db_ndbm_open() などの内部の関数もチェックしていたのが、引数も指定してチェックできるようにしたために関数マクロの存在を直接確認できるようになったのでその特別な処理を削除しています。

kosaki:r33711 2011-11-12 11:06:23 +0900

rb_io_ctl() から ioctl(2) の len を IOCPARM_LEN() マクロで取得する部分を ioctl_narg_len() という関数に分離し、また fcntl() の時はこれを使わずに 256 に固定するようにしています。 IOCPARAM_LEN() というマクロで ioctl のコマンド毎の必要がバッファサイズを取得できるんですね、知りませんでした。

svn:r33712 2011-11-12 11:06:28 +0900

version.h の日付更新。

kosaki:r33713 2011-11-12 11:09:56 +0900

更に rb_io_ctl から ioctl/fcntl のバッファサイズを計算する部分を setup_narg() として切り出しています。

kosaki:r33714 2011-11-12 11:12:19 +0900

setup_narg() で String オブジェクトのバッファを最後の1バイト越えてアクセスしていた不具合修正。

kosaki:r33715 2011-11-12 11:17:41 +0900

ioctl/fcntl の引数をまとめた構造体 struct io_cntl_arg から ioctl か fcntl かを識別するメンバー io_p を削除し、ioctl() と fcntl() を呼ぶ関数が共有されていたのをそれぞれ別の関数として分離しています。

kosaki:r33716 2011-11-12 11:24:51 +0900

ioctl(2) の cmd 引数の型が int だったり unsigned long だったりするためプラットフォームによっては31ビットが1のコマンドが上位のビットが 1 埋めされるため警告が出るというのを修正するため、プラットフォームに応じて cmd の型を使い分けるようにしています。 [ruby-dev:44589] [Bug #5429]

kosaki:r33717 2011-11-12 11:27:51 +0900

IO#ioctl, IO#fcntl でバッファに渡した文字列の最後に適当なマジックナンバーを埋めておいて、オーバーランしなかったかを検出するようにしているのですが、それをそのまま返していたので、正常終了したら '\0' にリセットしてから返すようにしています。さっきからこの 17 というのが何なのか不思議だったのですが、こういうことだったんですね。

kosaki:r33718 2011-11-12 11:29:37 +0900

Linux には ioctl(2) のバッファサイズを得るのに IOCPARAM_LEN() ではなくて _IOC_SIZE() を使うのでこちらのサポートも追加しています。

kosaki:r33719 2011-11-12 11:31:15 +0900

test_fcntl_lock という fcntl を使って file lock をテストするメソッドが Linux でしかテストしていなかったので、メソッド名を test_fcntl_lock_linux と改名して、FreeBSD でのテストをする test_fcntl_lock_freebsd を追加しています。 ioctl/fcntl は結果が C の構造体そのままを String に pack したものが返ってくるため、結果の解釈がプラットフォーム毎に異なるために別のテストになっています。

kosaki:r33720 2011-11-12 11:32:16 +0900

IO#fcntl に F_DUPFD を使って指定した番号の fd に dup するテストを追加しています。 これ F_DUPFD が未定義だとエラーになったりしないでしょうか。

kosaki:r33721 2011-11-12 11:33:58 +0900

fcntl() の時はバッファサイズを 256 固定にしていたので fcntl_narg_len() という関数を定義して、既知の cmd についてバッファサイズを返すようにしています。

kosaki:r33722 2011-11-12 13:37:54 +0900

make test で Ctrl-C で SIGINT を送っても子プロセスだけが死んで make test 自体は終了しないのを親もすぐ停止するように、子が SIGINT で死んでいたら Interrupt を raise するようにしています。 [ruby-dev:44856] [Feature #5612]

akr:r33723 2011-11-12 16:06:09 +0900

dbm で dbm_clearerr() は常にあるはずなので存在するときだけ使うという条件コンパイルは外しています。

nobu:r33724 2011-11-12 16:49:48 +0900

インデントの修正や行末の空白の削除など。

akr:r33725 2011-11-12 16:50:12 +0900

dbm/extconf.rb の gdbm と gdbm_compat についてのコメントを修正しています。1.8.1 以降 gdbm_compat という名前になったということのようです、よくわかってませんが……。

nobu:r33726 2011-11-12 17:01:51 +0900

ext/dbm/extconf.rb で重複したコードを共有するようにリファクタリング

nobu:r33727 2011-11-12 17:26:13 +0900

ioctl(2) の cmd 引数に使うために定義した ioctl_req_t を各所で使うようにしています。