diff --git a/CMakeLists.txt b/CMakeLists.txt index bb119b853..16c2e604c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -332,7 +332,7 @@ if(LINUX) src/detection/terminalshell/terminalshell_linux.c src/detection/uptime/uptime_linux.c src/detection/users/users_linux.c - src/detection/wifi/wifi_nosupport.c + src/detection/wifi/wifi_linux.c src/detection/wmtheme/wmtheme_linux.c ) elseif(ANDROID) diff --git a/README.md b/README.md index 7a656d598..5cc094bf4 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ All categories not listed here should work without needing a specific implementa ##### Available Modules ``` -Title, Separator, OS, Host, Bios, Board, Kernel, Uptime, Processes, Packages, Shell, Resolution, DE, WM, WMTheme, Theme, Icons, Font, Cursor, Terminal, Terminal Font, CPU, CPUUsage, GPU, Memory, Swap, Disk, Battery, Power Adapter, Player, Media, Vulkan, OpenGL, OpenCL, LocalIP, PublicIP, DateTime, Date, Time, Locale, Colors, Break, Custom +Title, Separator, OS, Host, Bios, Board, Kernel, Uptime, Processes, Packages, Shell, Resolution, DE, WM, WMTheme, Theme, Icons, Font, Cursor, Terminal, Terminal Font, CPU, CPUUsage, GPU, Memory, Swap, Disk, Battery, Power Adapter, Player, Media, Vulkan, OpenGL, OpenCL, LocalIP, PublicIP, Wifi, DateTime, Date, Time, Locale, Colors, Break, Custom ``` ##### Logos diff --git a/src/detection/wifi/wifi_linux.c b/src/detection/wifi/wifi_linux.c new file mode 100644 index 000000000..88de374d0 --- /dev/null +++ b/src/detection/wifi/wifi_linux.c @@ -0,0 +1,59 @@ +#include "wifi.h" + +#include "common/io.h" +#include +#include + +static const char* detectInf(uint32_t ifIndex, FFWifiResult* wifi) +{ + //TODO: play with netlink + FF_UNUSED(ifIndex, wifi); + return "Unimplemented"; +} + +const char* ffDetectWifi(const FFinstance* instance, FFlist* result) +{ + struct if_nameindex* infs = if_nameindex(); + if(!infs) + return "if_nameindex() failed"; + + FFstrbuf path; + ffStrbufInit(&path); + + for(struct if_nameindex* i = infs; !(i->if_index == 0 && i->if_name == NULL); ++i) + { + ffStrbufSetF(&path, "/sys/class/net/%s/phy80211", i->if_name); + if(!ffFileExists(path.chars, S_IFDIR)) + continue; + + FFWifiResult* item = (FFWifiResult*)ffListAdd(result); + ffStrbufInitS(&item->inf.description, i->if_name); + ffStrbufInit(&item->inf.status); + ffStrbufInit(&item->conn.status); + ffStrbufInit(&item->conn.ssid); + ffStrbufInit(&item->conn.macAddress); + ffStrbufInit(&item->conn.phyType); + item->conn.signalQuality = 0.0/0.0; + item->conn.rxRate = 0.0/0.0; + item->conn.txRate = 0.0/0.0; + item->security.enabled = false; + item->security.oneXEnabled = false; + ffStrbufInit(&item->security.algorithm); + + ffStrbufSetF(&path, "/sys/class/net/%s/operstate", i->if_name); + if(!ffAppendFileBuffer(path.chars, &item->inf.status) || !ffStrbufEqualS(&item->inf.status, "up")) + continue; + + ffStrbufSetF(&path, "/sys/class/net/%s/address", i->if_name); + ffAppendFileBuffer(path.chars, &item->conn.macAddress); + + detectInf(i->if_index, item); + } + if_freenameindex(infs); + ffStrbufDestroy(&path); + + if(result->length == 0) + return "No wifi interfaces found"; + + return NULL; +}