我正在使用Ruby和bit-struct在测试设置中配置我的网络接口。这对于大多数IOCTL调用都很好用,但我不知道如何调用SIOCGIFCONF
下面是一个示例:
如果我想得到一个接口的MAC地址,我会这样写:
class LinuxIfreqMacAddr < BitStruct
char :name, 128
unsigned :type, 16, :endian => :native
hex_octets :macaddr, 48
pad :padding, 64
end
ifr = LinuxIfreqMacAddr.new
ifr.name = "eth0"
s.ioctl(SIOCGIFHWADDR, ifr) # s is a socket
puts ifr.macaddr
这可以正常工作,并将打印eth0的MAC地址。但是“struct ifconf”的签名(与SIOCGIFCONF一起使用)需要传递沿着一个缓冲区。
下面是签名:
struct ifconf {
int ifc_len;
char __user *ifcu_buf;
};
如何在ruby中使用4096字节的缓冲区调用SIOCGIFCONF ioctl命令?
1条答案
按热度按时间txu3uszq1#
使用Array#pack的“P”说明符来存储指向缓冲区的指针:
How this works
创建缓冲区,ioctl将在其中存储接口信息数组:
现在创建第二个缓冲区以传递给ioctl调用。缓冲区将是一个表示ifconf struct的字符串:
我们使用Array#pack来实现:
格式说明符分为:
ifreqs.size
。ifreqs
字符串中的缓冲区地址进行编码。现在我们可以打电话了:
SIOCGIFCONF调用修改ifconf缓冲区,将
ifc_len
更新为实际存储在ifreqs
缓冲区中的数据字节数。我们可以看到,通过只解包数组的该元素:将存储在 ifreqs 中的数据解码留给读者练习。