#include #include #include #include #include #include #include #include "wmwifi.h" #include #include #include #include /* * This is my quick and dirty way of accessing the Linux Wireless Extensions * from the /proc/net/wireless interface. * Open the file, and get the Interface name, link, level, and noise. * - Jess */ int get_wifi_info(struct wifi *wfi) { struct iwreq wrq; struct iw_range range; int skfd; float ret; int i; FILE *fp; char buff[1024] = ""; if (fp = fopen("/proc/net/wireless", "r")) { //if (fp = fopen("./demo.txt", "r")) { for (i = 0; i < (wfi->ifnum + 3); i++) { fgets(buff, sizeof(buff), fp); buff[strlen(buff) + 1] = '\0'; } fclose(fp); } else { wfi->max_qual = -1; fprintf(stdout, "ERROR: Cannot Open Linux Wireless Extensions!\n\b"); // exit(1); } sscanf(buff, "%s %*s %f %d", &wfi->ifname, &wfi->link, &wfi->level); /* Don't know why I have to make a second call to sscanf * to pull wfi->noise, but for some wierd reason I cannot * pull it above along with the other stats. */ sscanf(buff, "%*s %*s %*s %*s %d", &wfi->noise); /* Thanks to Jeroen Nijhof * for catching this, I guess I overlooked it. * Strip out the trailing ':' if exists. */ if (wfi->ifname[strlen(wfi->ifname) - 1] == ':') { wfi->ifname[strlen(wfi->ifname) - 1] = '\0'; } memset(&wfi->essid, 0, IW_ESSID_MAX_SIZE + 1); skfd = socket(AF_INET, SOCK_DGRAM, 0); memset(&range, 0, sizeof(struct iw_range)); wrq.u.data.pointer = (caddr_t) & range; wrq.u.data.length = sizeof(struct iw_range); wrq.u.data.flags = 0; strncpy(wrq.ifr_name, wfi->ifname, IFNAMSIZ); ret = ioctl(skfd, SIOCGIWRANGE, &wrq); if (ret > -1) { ret = range.max_qual.qual; } else { fprintf(stdout, "ERROR\n"); /* Maybe put auto-learning HERE? */ } wfi->max_qual = ret; wrq.u.essid.pointer = (caddr_t) wfi->essid; wrq.u.essid.length = IW_ESSID_MAX_SIZE + 1; wrq.u.essid.flags = 0; ret = ioctl(skfd, SIOCGIWESSID, &wrq); ret = ioctl(skfd, SIOCGIWRATE, &wrq); memcpy(&(wfi->bitrate), &(wrq.u.bitrate), sizeof(struct iw_param)); if (strlen(wfi->essid) < 1) { strcpy(wfi->essid, "not_set"); } if (wfi->link > wfi->max_link) { wfi->max_link = wfi->link; } if (wfi->max_link > wfi->max_qual) { wfi->max_qual = wfi->max_link; } /* * For debugging purposes. * Check these values against /proc/net/wireless and * iwconfig * fprintf(stdout, "wfi->ifname -> %s\n", wfi->ifname); fprintf(stdout, "wfi->max_qual -> %f\n", wfi->max_qual); fprintf(stdout, "wfi->essid -> %s\n", wfi->essid); fprintf(stdout, "wfi->link -> %f\n", wfi->link); fprintf(stdout, "wfi->level -> %d\n", wfi->level); fprintf(stdout, "wfi->noise -> %d\n", wfi->noise - 0x100); fprintf(stdout, "wfi->bitrate -> %d\n", wfi->bitrate.value); fprintf(stdout, "wfi->max_link -> %.f\n", wfi->max_link); */ close(skfd); return ret; } void next_if(struct wifi *wfi) { int max; max = get_max_ifs(); wfi->max_link = 0; if (wfi->ifnum < max) { wfi->ifnum++; } else { wfi->ifnum = 0; } } /* Not used anymore, how many mouse button's do * you have? */ void last_if(struct wifi *wfi) { int max; max = get_max_ifs(); wfi->max_link = 0; if (wfi->ifnum > 0) { wfi->ifnum--; } else { wfi->ifnum = max; } } int get_max_ifs(void) { FILE *fp; char buff[255]; int i = 0; if (fp = fopen("/proc/net/wireless", "r")) { //if (fp = fopen("./demo.txt", "r")) { for (i = -3; fgets(buff, sizeof(buff), fp); i++) { } fclose(fp); } return i; }