2009-09-18 7 views
3

Pour éviter de compter sur les outils sans fil, je veux obtenir l'essid directement à partir de l'appareil avec ioctl, en C ce ne serait pas un problème, mais dans Ruby c'est assez différent.Obtenir essid via ioctl dans ruby ​​

Le problème suit struct de wireless.h qui est utilisé comme entrée/réponse 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 partie de pointeur doit être une adresse valide d'une zone de mémoire, suivie de la longueur octets, suivi d'un champ de drapeau. J'ai essayé avec Array # pack et le bit-struct gem, mais je n'ai pas encore trouvé de solution.

Existe-t-il un moyen de contourner ce problème de pointeur de mémoire?

Répondre

4

Je suis enfin fonctionner, la solution est d'utiliser l'argument « p » du paquet ainsi:

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

Bien sûr, il suffit de définir votre propre interface Ruby-friendly comme un wrapper (en C) autour de ioctl. Je vois le problème avec l'ioctl par défaut dans Ruby. Je suppose que ios.ioctl est principalement destiné à ioctl "écrire" des appels.

+0

Eh bien, je suppose que pas d'autre choix. En fait, ioctl devrait fonctionner dans les deux sens correctement et pas seulement segfault quand une structure comme celle ci-dessus est utilisée. ;) – unexist

+0

Je n'ai pas regardé les tripes d'ioctl récemment, mais si la version de loonix est quelque chose comme un unix BSD, elle a une ambiguïté horrible en ce que savoir si elle lit ou écrit, ou combien, nécessite de connaître les deux l'ioctl et l'appareil. (!) – DigitalRoss

+0

Vrai, mais les appareils doivent normalement suivre un brouillon pour être utilisable par les clients, ce qui est applicable de la même manière pour les vendeurs et/ou les auteurs de pilotes. Le problème dans ce cas est juste le manque de pointeurs dans Ruby qui ne peut probablement pas être facilement couvert par bitstruct. Pendant mon travail sur mon gestionnaire de fenêtres, je suis au courant de l'API C de Ruby - donc ce ne sera pas un problème du tout. :) – unexist

Questions connexes