From: KOSAKI Motohiro Date: 2010-06-13T20:24:53+09:00 Subject: [ruby-dev:41601] Re: [Bug #3433] Error that occurs by BasicSocket#sendmsg こさきです > まつもと ゆきひろです > > In message "Re: [ruby-dev:41597] [Bug #3433] Error that occurs by BasicSocket#sendmsg" > on Sun, 13 Jun 2010 03:06:34 +0900, Masaya Tarui writes: > > |r24199と関連するのですが、sendmsgが実装されていない場合に発生するエラーとして、 > |こちらの環境ではNotImplementedErrorではなくErrno::ENOSYSが発生します。 > > CRubyでは、下のレイヤーがエラーを返せばそのまま返します。正直、 > sendmsgというシステムコールはあるが、呼ぶと必ずENOSYSを返す変 > なプラットフォームが存在した場合、それをドキュメントでカバー > できるかというとかなり疑問です。 システムコール一般についていうとENOSYSはあんまり変な状況ではないと 思います。 Rubyのコンパイル環境よりも実行環境が古いバージョンの場合は、起こりうる 挙動です。 # まあ、sendmsg()をつい最近実装したようなOSはないと思うので、このスレッド # からは脱線になってしまいますが。。。 なので、もしENOSYSになにか対処をするのだとしたら、sendmsg以外でも NotImplementedError に変換するべきな気がしなくもない。とかなんとか・・・ > > |ドキュメントにはエラーについて書いていないのですが、どちらが正解かまた両方ありえるのか、 > |どうなんでしょうか? > | > |これで、 > |test_udp_server(TestSocket) > |test_sendmsg_nonblock_error(TestSocketNonblock) > |がErrorになっています。 > > どうすべきなんでしょうね。 > > * mswin32ではsendmsgは非対応にする。ifdefで外す > * ドキュメントにENOSYSを返すことがあると明記。テストもそれ > にあわせて変更 > * sendmsgがENOSYSを返したらNotImplementedErrorを返すように > > どれもありえるとは思うのですが。 毎回ENOSYSを返す関数ってうれしいかなぁ??というのが第一印象でした。 この件についてだけ考えるとifdefで外してしまうのがもっとも親切に 見えます。