Si le nom de votre appareil est NETDEVICE
, une vérification de l'existence du /sys/class/net/NETDEVICE/wireless
directory est un prédicat que vous pouvez utiliser. Il s'agit d'une approche Linux uniquement, cependant, et elle suppose que /sys
est monté, ce qui est presque toujours le cas normal. Il est également plus facile d'employer cette méthode à partir de scripts, plutôt que de traiter avec des ioctl()s.
Vous pouvez appeler le ioctl(fd, SIOCGIWNAME)
qui renvoie la version du protocole d'extension sans fil, qui n'est disponible que sur les interfaces sans fil.
int check_wireless(const char* ifname, char* protocol) {
int sock = -1;
struct iwreq pwrq;
memset(&pwrq, 0, sizeof(pwrq));
strncpy(pwrq.ifr_name, ifname, IFNAMSIZ);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
return 0;
}
if (ioctl(sock, SIOCGIWNAME, &pwrq) != -1) {
if (protocol) strncpy(protocol, pwrq.u.name, IFNAMSIZ);
close(sock);
return 1;
}
close(sock);
return 0;
}
Pour un exemple complet, voir :https://gist.github.com/edufelipe/6108057
Vous pouvez utiliser la commande iwconfig depuis la ligne de commande :
$ iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
Si vous avez besoin de l'utiliser depuis C, comme l'explique le lien de @opaque ci-dessus, récupérez les sources ou utilisez strace pour voir quel ioctls() vous devez utiliser :
ioctl(3, SIOCGIWNAME, 0x7fff82c0d040) = -1 EOPNOTSUPP (Operation not supported)
ioctl(3, SIOCGIFFLAGS, {ifr_name="lo", ifr_flags=IFF_UP|IFF_LOOPBACK|IFF_RUNNING}) = 0
write(2, "lo no wireless extensions"..., 35lo no wireless extensions.
) = 35
ioctl(3, SIOCGIWNAME, 0x7fff82c0d040) = -1 EOPNOTSUPP (Operation not supported)
ioctl(3, SIOCGIFFLAGS, {ifr_name="eth0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
write(2, "eth0 no wireless extensions"..., 35eth0 no wireless extensions.
) = 35
Voir l'utilisation de SIOCGIWNAME :
#define SIOCGIWNAME 0x8B01 /* get name == wireless protocol */
/* SIOCGIWNAME is used to verify the presence of Wireless Extensions.
* Common values : "IEEE 802.11-DS", "IEEE 802.11-FH", "IEEE 802.11b"...