Wifi: add basic Linux support using iw

This commit is contained in:
李通洲
2023-01-16 00:33:22 +08:00
parent c1d92206f5
commit 1c93d68e7b
2 changed files with 52 additions and 10 deletions
+51 -9
View File
@@ -1,14 +1,59 @@
#include "wifi.h"
#include "common/io.h"
#include <linux/nl80211.h>
#include "common/processing.h"
#include "common/properties.h"
#include <net/if.h>
static const char* detectInf(uint32_t ifIndex, FFWifiResult* wifi)
static const char* detectInf(char* ifName, FFWifiResult* wifi)
{
//TODO: play with netlink
FF_UNUSED(ifIndex, wifi);
return "Unimplemented";
const char* error = NULL;
FF_STRBUF_AUTO_DESTROY output;
ffStrbufInit(&output);
if((error = ffProcessAppendStdOut(&output, (char* const[]){
"iw",
"dev",
ifName,
"link",
NULL
})))
return error;
if(output.length == 0)
return "iw command execution failed";
if(!ffParsePropLines(output.chars, "Connected to ", &wifi->conn.macAddress))
{
ffStrbufAppendS(&wifi->conn.status, "Disconnected");
return NULL;
}
FF_STRBUF_AUTO_DESTROY temp;
ffStrbufInit(&temp);
ffStrbufAppendS(&wifi->conn.status, "Connected");
ffStrbufSubstrBefore(&wifi->conn.macAddress, ' ');
ffParsePropLines(output.chars, "SSID: ", &wifi->conn.ssid);
if(ffParsePropLines(output.chars, "signal: ", &temp))
wifi->conn.signalQuality = ffStrbufToDouble(&temp);
if(ffParsePropLines(output.chars, "tx bitrate: ", &temp))
{
if(ffStrbufContainS(&temp, " HE-MCS "))
ffStrbufAppendS(&wifi->conn.phyType, "802.11ax (Wi-Fi 6)");
else if(ffStrbufContainS(&temp, " VHT-MCS "))
ffStrbufAppendS(&wifi->conn.phyType, "802.11ac (Wi-Fi 5)");
else if(ffStrbufContainS(&temp, " MCS "))
ffStrbufAppendS(&wifi->conn.phyType, "802.11n (Wi-Fi 4)");
else
ffStrbufAppendS(&wifi->conn.phyType, "802.11a/b/g");
}
wifi->security.enabled = true; //FIXME: Unable to find this info. Set it true so that fastfetch won't print `insecure`
return NULL;
}
const char* ffDetectWifi(const FFinstance* instance, FFlist* result)
@@ -46,10 +91,7 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result)
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);
detectInf(i->if_name, item);
}
if_freenameindex(infs);
ffStrbufDestroy(&path);
+1 -1
View File
@@ -7,7 +7,7 @@
void ffPrintWifi(FFinstance* instance)
{
FFlist result;
FF_LIST_AUTO_DESTROY result;
ffListInit(&result, sizeof(FFWifiResult));
const char* error = ffDetectWifi(instance, &result);