Получение essid через ioctl в ruby - PullRequest
       45

Получение essid через ioctl в ruby

3 голосов
/ 19 сентября 2009

Чтобы не полагаться на беспроводные инструменты, я хочу получить 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, но пока не нашел решения.

Есть ли способ обойти эту проблему с указателем памяти?

Ответы [ 2 ]

4 голосов
/ 23 сентября 2009

Я наконец заработал, решение было использовать аргумент '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
1 голос
/ 19 сентября 2009

Конечно, просто определите свой собственный Ruby-friendly интерфейс как оболочку (в C) для ioctl. Я вижу проблему с ioctl по умолчанию в Ruby. Я думаю, ios.ioctl в основном предназначен для ioctl записи вызовов.

...