perlでioctl
perlでioctlを試してみた。
ioctlに渡す構造体をperlでどう表現するかが重要でした。
分かったこと
- バッファを確保するためには、必要な長さの文字列を作っておく。
- バッファのポインタはpackのpオプションをつかって変換する。
perlでwireless extensionのioctlでssidを取得するサンプル。
#!/usr/bin/perl use strict; use Socket; my $if_name = "eth2"; my $SIOCGIWESSID = 0x8B1B; #open socket socket(SOCKET, PF_INET, SOCK_STREAM, 0); #prepare buffer my $ssid_buff = "12345678901234567890123456789012"; #set interface name my $ssid_info = pack("a16pSS", $if_name, $ssid_buff, 32 , 0); #do ioctl ioctl(SOCKET, $SIOCGIWESSID, $ssid_info); #get result my ($if, # interface name $ssid_pointer, # ssid pointer $ssid_length, # ssid length $ssid_flags # ssid flag ) = unpack("a16pSS", $ssid_info); print <<ZZZ; interface = $if ssid = $ssid_pointer ssid length = $ssid_length ssid flags = $ssid_flags ZZZ
実行結果
interface = eth2 ssid = default ssid length = 8 ssid flags = 1
# wireless extension V21以降だとNULL文字ターミネートが無いので注意