#include #include #include #include #include #include #include #include #include #include #define le16toh(x) letoh16(x) #define IFACE_NAME "iwi0" int main(int argc, char **argv) { struct ifreq ifr; struct ifmediareq ifmr; struct wi_req wr; char *interface = IFACE_NAME; int s, i; char buf[24 * 1024]; s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) { perror("socket()"); return -1; } memset(buf, 0, sizeof(buf)); bzero((void *) &ifmr, sizeof(ifmr)); strlcpy(ifmr.ifm_name, interface, sizeof(ifmr.ifm_name)); if (ioctl(s, SIOCGIFMEDIA, &ifmr) < 0) { perror("doesn't support SIOCGIFMEDIA ?"); return -1; } if ((ifmr.ifm_status & IFM_AVALID) == 0) { perror("doesn't support media-valid status ?"); return -1; } printf("carrier:%d\n", ifmr.ifm_status & IFM_ACTIVE); strlcpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name)); wr.wi_len = WI_MAX_DATALEN; wr.wi_type = WI_RID_STA_IDENTITY; ifr.ifr_data = (caddr_t) ≀ if (ioctl(s, SIOCGWAVELAN, &ifr) < 0) { perror("ioctl()"); return -1; } printf("vendor = %d (ID %d, version %d.%d)", wr.wi_val[1], wr.wi_val[0], wr.wi_val[2], wr.wi_val[3]); bzero((void *) &wr, sizeof(wr)); wr.wi_len = WI_MAX_DATALEN; wr.wi_type = WI_RID_CURRENT_SSID; ifr.ifr_data = (caddr_t) ≀ if (ioctl(s, SIOCGWAVELAN, &ifr) < 0) { perror("ioctl()"); return -1; } printf("ssid = %s\n", &wr.wi_val[1]); bzero((void *) &wr, sizeof(wr)); wr.wi_len = WI_MAX_DATALEN; wr.wi_type = WI_RID_COMMS_QUALITY; ifr.ifr_data = (caddr_t) ≀ if (ioctl(s, SIOCGWAVELAN, &ifr) < 0) { perror("ioctl()"); return -1; } printf("quality=%d\n", le16toh(wr.wi_val[0])); bzero((void *) &wr, sizeof(wr)); wr.wi_len = WI_MAX_DATALEN; wr.wi_type = WI_RID_CUR_TX_RATE; ifr.ifr_data = (caddr_t) ≀ if (ioctl(s, SIOCGWAVELAN, &ifr) < 0) { perror("ioctl()"); return -1; } printf("rate=%d\n", le16toh(wr.wi_val[0])); return 0; }