#define _GNU_SOURCE #include #include #include #include #include #include int discovery() { DIR *dir; struct dirent *ent; bool comma = false; if ((dir = opendir ("/sys/kernel/debug/ieee80211/")) != NULL) { printf("{\"data\":["); while ((ent = readdir (dir)) != NULL) { if (strcmp(".", ent->d_name) && strcmp("..", ent->d_name)) { if (comma) printf(","); printf("{\"{#PHY}\":\"%s\"}", ent->d_name); comma = true; } } printf("]}\n"); closedir(dir); } else { perror(""); return EXIT_FAILURE; } return EXIT_SUCCESS; } int get_param(char *phy, char *stat) { char *filename = NULL; FILE *f = NULL; phy = basename(phy); stat = basename(stat); if (asprintf(&filename, "/sys/kernel/debug/ieee80211/%s/statistics/%s", phy, stat) > 0) f = fopen(filename, "r"); if (f != NULL) { char temp[256]; while (fgets(temp, 256, f) != NULL) printf("%s",temp); fclose(f); } else { perror(""); return EXIT_FAILURE; } free(filename); return EXIT_SUCCESS; } int usage(char *name) { fprintf(stderr, "Usage:\n"); fprintf(stderr, " %s discovery\n", name); fprintf(stderr, " => print mac80211.phydiscovery discovery rule\n"); fprintf(stderr, " %s PHY STAT\n", name); fprintf(stderr, " => cat /sys/kernel/debug/ieee80211/PHY/statistics/STAT as root\n"); return EXIT_FAILURE; } int main(int argc, char *argv[]) { switch (argc) { case 2: return discovery(); case 3: return get_param(argv[1], argv[2]); default: return usage(argv[0]); } }