Pregunta

Para evitar depender de las herramientas inalámbricas, quiero obtener el essid directamente desde el dispositivo con ioctl, en C esto no sería un problema, pero en Ruby es bastante diferente.

El problema es seguir la estructura de wireless.h que se usa como entrada / respuesta 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 */
};

La parte del puntero debe ser una dirección válida de un área de memoria, seguida de la longitud en bytes, seguida de un campo de marca. Intenté con Array # pack y la gema de estructura de bits, pero aún no he encontrado una solución.

¿Hay alguna forma de evitar este problema de puntero de memoria?

¿Fue útil?

Solución

Finalmente lo puse a funcionar, la solución fue usar el argumento 'p' del paquete de esta manera:

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

Otros consejos

Claro, solo defina su propia interfaz amigable con Ruby como un contenedor (en C) alrededor de ioctl. Veo el problema con el ioctl predeterminado en Ruby. Supongo que ios.ioctl está destinado principalmente a ioctl " write " llamadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top