#define _GNU_SOURCE
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <sys/types.h>
|
|
#include <dirent.h>
|
|
#include <stdbool.h>
|
|
|
|
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]);
|
|
}
|
|
}
|