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文字ターミネートが無いので注意