< :前の番号
^ :番号順リスト
> :次の番号
P :前の記事
N :次の記事
|<:スレッドの先頭
>|:次のスレッド
^ :返事先
_:自分への返事
>:同じ返事先を持つ記事(前)
<:同じ返事先を持つ記事(後)
---:分割してスレッド表示、再表示
| :分割して(縦)スレッド表示、再表示
~ :スレッドのフレーム消去
.:インデックス
..:インデックスのインデックス
>>>>> "W" == WATANABE Hirofumi <watanabe / ase.ptg.sony.co.jp> writes:
WATANABE Tetsuya <tetsu / jpn.hp.com> writes:
:ext/socket.c で strtoul(3) を使っているんですが、ちょっと仕様と
:実際の動作が違うようです。仕様だと変換できないような文字では
:ULONG_MAX を返すはずですが、実際には 0 が帰ってきます。
W> ULONG_MAX を返すのはオーバーフローしたときだけです.
W> だからもともと strtoul だけでは判断できません.
あ、すいません。これは間違いですね。
今回の場合 /etc/services にエントリがない場合に
どのようになるか? と思って確認していて core を
はいたのでした。
irb(main):001:0> require "socket"
true
irb(main):003:0> p Socket.getservbyname('ddddd', 'udp')
SocketError: service/proto not found
(irb):3:in `getservbyname'
(irb):3
(irb_local_binding):1:in `eval'
irb(main):004:0> udp = UDPsocket.open
#<UDPsocket:0x40081cd0>
irb(main):005:0> udp.connect('localhost', 'ddddd')
(irb):5: [BUG] Bus Error
サービス名として登録されているか? という確認は
可能なのですが(上記 getservbyname)、socket.c で
の対応としてサービスポートナンバーが「0」という
のはないと思われるので、「0」の場合はエラー処理
に回す? (数値としての 0 が指定されていれば、別
の処理が行われます) のでよさそうな気がします。
W> "ruby" のような文字列を与えた場合は 0 が返るのは昔からそう
W> だったから仕様と言えば仕様でしょうね.
W> 初期値 0 で変換できない文字にぶちあたったら break するような
W> 処理だと思うので, たとえば "12ruby" なら 12 になります.
これはわかります。
W> やるんなら自前でチェックしないとやっぱだめでしょうね.
そうですか。できれば楽したいですね。
文字列であって /etc/services にない場合に "no
such service %s" を表示する意図にみえたので、前
回のパッチのようにしたんです。
--
WATANABE Tetsuya HP Japan
e-mail tetsu / jpn.hp.com