Pergunta

Para evitar contando com as ferramentas sem fio I querem obter o essid diretamente do dispositivo com ioctl, em C isso não seria um problema, mas em Ruby é bastante diferente.

O problema é seguinte struct de wireless.h , que é usado como entrada / resposta de 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 */
};

A parte ponteiro deve ser um endereço válido de uma área de memória, seguido pelo comprimento em bytes, seguido de um campo de bandeira. Eu tentei com Array # pacote eo gem bit-estrutura, mas não encontrei uma solução ainda.

Existe uma maneira de contornar este problema ponteiro de memória?

Foi útil?

Solução

Eu finalmente tenho que trabalhar, a solução foi usar o argumento de 'p' do pacote, desta forma:

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

Outras dicas

Claro, apenas definir sua própria interface Rubi-friendly como um wrapper (em C) em torno ioctl. Eu vejo o problema com o ioctl padrão em Ruby. Eu acho que ios.ioctl é principalmente destinado a ioctl chamadas "Write".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top