Ottenere essid via ioctl in rubino
Domanda
Per evitare di fare affidamento sugli strumenti wireless, voglio ottenere l'essid direttamente dal dispositivo con ioctl, in C questo non sarebbe un problema, ma in Ruby è abbastanza diverso.
Il problema sta seguendo la struttura di wireless.h utilizzata come input / risposta di 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 puntatore deve essere un indirizzo valido di un'area di memoria, seguita dalla lunghezza in byte, seguita da un campo flag. Ho provato con Array # pack e la gemma bit-struct, ma non ho ancora trovato una soluzione.
C'è un modo per aggirare questo problema con il puntatore della memoria?
Soluzione
Finalmente ho funzionato, la soluzione era usare l'argomento 'p' del pacchetto in questo modo:
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
Altri suggerimenti
Certo, basta definire la propria interfaccia per Ruby come un wrapper (in C) attorno a ioctl. Vedo il problema con lo ioctl predefinito in Ruby. Suppongo che ios.ioctl
sia destinato principalmente a ioctl
" write " chiamate.