Obteniendo essid a través de ioctl en ruby
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?
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.