義田と申します。
ruby-pcap(
http://www.goto.info.waseda.ac.jp/~fukusima/ruby/pcap-j.html)をRuby1.9.1でも使えるようにしようと思い、Debian上で開発しています。
http://github.com/yoppi/ruby-pcappcapでパケットをキャプチャする際、pcap_loopやpcap_dispatchでpcap側の制御に
入るとCtrl-CでSIGINTを送っても受けつけないので、現在のruby-pcapの実装では
TRAP_BEG、TRAP_ENDで上記の関数を囲んでいます。
ところが、Ruby1.9.1ではTRAP_BEG、TRAP_ENDはruby/backward/rubysig.hで定義さ
れており、rubysig.h自体がobsoleteであり、TRAP_BEG、TRAP_ENDもdeprecatedと
なっています。
Ruby1.9.1でそれらしい関数やマクロを探してみたのですが、見つけられませんでした。
Ruby1.9.1でTRAP_BEG、TRAP_ENDの代わりとなる関数またはマクロが実装されてい
るなら、ご教示いただけたらと思います。
とりあえず、TRAP_BEG、TRAP_ENDは残したままruby-pcapをコンパイルしたものを使って
以下のスクリプトをRuby1.9.1で実行すると、パケットを一つキャプチャしてそのまま反応がな
くなり、SIGINTも受けつけない状態になりました。
Ruby1.8.7-p160では問題なく動きます。
% cat test.rb
require 'pcap'
dev = Pcap.lookupdev
cap = Pcap::Capture.open_live(dev)
cap.setfilter("icmp")
cap.loop do |pkt|
puts pkt
end
cap.close
# 別端末でpingを実行
% ruby test.rb
192.168.0.10 > 192.169.0.1: icmp: echo request
^C
^C
また、TRAP_BEG、TRAP_ENDをコメントアウトしたものをコンパイルして同様のスクリプトで
試したところ、パケットは正常にキャプチャできましたが、やはりSIGINTを受けつけません。
私の環境は以下の通りです。
% gcc --version
gcc (Debian 4.3.2-1) 4.3.2
% ruby --version
ruby 1.9.1p243 (2009-07-16 revision 24175) [i686-linux]
% ruby -rrbconfig -e "puts Config::CONFIG['configure_args']"
'--prefix=/usr/local/apps/ruby/ruby-1.9.1-p243' '--enable-pthread'
'--enable-shared'
% aptitude show libpcap-dev
バージョン: 0.9.8-5
% cat /etc/debian_version
lenny/sid
--
義田