Получение essid через ioctl в ruby
Вопрос
Чтобы не полагаться на беспроводные инструменты, я хочу получить essid непосредственно с устройства с помощью ioctl, в C это не будет проблемой, но в Ruby все по-другому. Р>
Проблема в следующем: структура из wireless.h , которая используется как ввод / ответ ioctl:
struct iw_point
{
void __user *pointer; /* Pointer to the data (in user space) */
__u16 length; /* number of fields or size in bytes */
__u16 flags; /* Optional params */
};
Часть указателя должна быть действительным адресом области памяти, за которой следует длина в байтах, за которой следует поле флага. Я пытался использовать Array # pack и gem bit-struct, но пока не нашел решения. Р>
Есть ли способ обойти эту проблему с указателем памяти?
Решение
Я наконец-то начал работать, решение было использовать аргумент 'p' пакета следующим образом:
require "socket"
# Copied from wireless.h
SIOCGIWESSID = 0x8B1B
IW_ESSID_MAX_SIZE = 32
iwreq = [ "wlan0", " " * IW_ESSID_MAX_SIZE, IW_ESSID_MAX_SIZE, 0 ].pack("a16pII")
sock = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0)
sock.ioctl(SIOCGIWESSID, iwreq)
interface, essid, len, flags = iwreq.unpack("a16pII")
puts essid
Другие советы
Конечно, просто определите свой собственный дружественный к Ruby интерфейс как оболочку (в C) для ioctl. Я вижу проблему с ioctl по умолчанию в Ruby. Я думаю, ios.ioctl
в основном предназначен для ioctl
" write " звонки. Р>