Pokud je název vašeho zařízení NETDEVICE
, kontrola existence /sys/class/net/NETDEVICE/wireless
adresář je predikát, který můžete použít. Toto je však přístup pouze pro Linux a předpokládá, že /sys
je namontován, což je téměř vždy normální případ. Je také snazší použít tuto metodu ze skriptů, než se zabývat ioctl()s.
Můžete zavolat na číslo ioctl(fd, SIOCGIWNAME)
která vrací verzi protokolu bezdrátového rozšíření, která je dostupná pouze na rozhraních, která jsou bezdrátová.
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;
}
Úplný příklad viz:https://gist.github.com/edufelipe/6108057
Můžete použít příkaz iwconfig z příkazového řádku:
$ iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
Pokud jej potřebujete použít z C, jak vysvětluje výše uvedený odkaz @opaque, získejte zdroje nebo použijte strace, abyste zjistili, které ioctls() musíte použít:
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
Viz použití 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"...