mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-10-29 16:26:39 +01:00
Wifi: detect more information using libnm (Linux)
This commit is contained in:
+1
-1
@@ -22,7 +22,7 @@ Features:
|
||||
* Support `WezTerm` terminal font detection (requires [`wezterm` executable](https://wezfurlong.org/wezterm/cli/general.html) being available)
|
||||
* Add `--shell-version` and `--terminal-version` options to disable shell / terminal version detection
|
||||
* Enhance `--percent-type` to allow hiding other texts (#387)
|
||||
* Add Wifi module basic support for Linux
|
||||
* Add Wifi module support for Linux
|
||||
|
||||
Logos:
|
||||
* Raspbian (@IamNoRobot, #373)
|
||||
|
||||
@@ -68,6 +68,7 @@ cmake_dependent_option(ENABLE_GLX "Enable glx" ON "LINUX OR BSD" OFF)
|
||||
cmake_dependent_option(ENABLE_OSMESA "Enable osmesa" ON "LINUX OR BSD" OFF)
|
||||
cmake_dependent_option(ENABLE_OPENCL "Enable opencl" ON "LINUX OR BSD OR WIN32" OFF)
|
||||
cmake_dependent_option(ENABLE_LIBCJSON "Enable libcjson" ON "LINUX OR WIN32" OFF)
|
||||
cmake_dependent_option(ENABLE_LIBNM "Enable libnm" ON "LINUX" OFF)
|
||||
cmake_dependent_option(ENABLE_FREETYPE "Enable freetype" ON "ANDROID" OFF)
|
||||
cmake_dependent_option(ENABLE_THREADS "Enable multithreading" ON "Threads_FOUND AND NOT ANDROID" OFF)
|
||||
cmake_dependent_option(ENABLE_BUFFER "Enable stdout buffer" ON "LINUX OR APPLE OR BSD OR WIN32 OR ANDROID" OFF)
|
||||
@@ -637,6 +638,10 @@ ff_lib_enable(LIBCJSON
|
||||
"libcjson"
|
||||
"CJson"
|
||||
)
|
||||
ff_lib_enable(LIBNM
|
||||
"libnm"
|
||||
"libnm"
|
||||
)
|
||||
ff_lib_enable(FREETYPE
|
||||
"freetype2"
|
||||
"FreeType2"
|
||||
|
||||
@@ -52,6 +52,7 @@ The following libraries are used if present at runtime:
|
||||
* [`libsqlite3`](https://www.sqlite.org/index.html): Needed for pkg & rpm package count.
|
||||
* [`librpm`](http://rpm.org/): Slower fallback for rpm package count. Needed on openSUSE.
|
||||
* [`libcJSON`](https://github.com/DaveGamble/cJSON): Needed for Windows Terminal font ( WSL ).
|
||||
* [`libnm`](https://networkmanager.dev/docs/libnm/latest/): Used for Wifi detection on Linux.
|
||||
|
||||
### macOS
|
||||
|
||||
|
||||
@@ -139,6 +139,7 @@ static void defaultConfig(FFinstance* instance)
|
||||
ffStrbufInitA(&instance->config.libcJSON, 0);
|
||||
ffStrbufInitA(&instance->config.libfreetype, 0);
|
||||
ffStrbufInit(&instance->config.libwlanapi);
|
||||
ffStrbufInit(&instance->config.libnm);
|
||||
|
||||
instance->config.cpuTemp = false;
|
||||
instance->config.gpuTemp = false;
|
||||
@@ -400,6 +401,7 @@ static void destroyConfig(FFinstance* instance)
|
||||
ffStrbufDestroy(&instance->config.libcJSON);
|
||||
ffStrbufDestroy(&instance->config.libfreetype);
|
||||
ffStrbufDestroy(&instance->config.libwlanapi);
|
||||
ffStrbufDestroy(&instance->config.libnm);
|
||||
|
||||
ffStrbufDestroy(&instance->config.diskFolders);
|
||||
ffStrbufDestroy(&instance->config.batteryDir);
|
||||
|
||||
@@ -16,31 +16,17 @@ struct FFWifiConnection
|
||||
FFstrbuf status;
|
||||
FFstrbuf ssid;
|
||||
FFstrbuf macAddress;
|
||||
FFstrbuf phyType;
|
||||
FFstrbuf protocol;
|
||||
FFstrbuf security;
|
||||
double signalQuality; // Percentage
|
||||
double rxRate;
|
||||
double txRate;
|
||||
};
|
||||
|
||||
enum FFWifiSecurityType
|
||||
{
|
||||
FF_WIFI_SECURITY_UNKNOWN,
|
||||
FF_WIFI_SECURITY_ENABLED,
|
||||
FF_WIFI_SECURITY_DISABLED,
|
||||
};
|
||||
|
||||
struct FFWifiSecurity
|
||||
{
|
||||
enum FFWifiSecurityType type;
|
||||
bool oneXEnabled;
|
||||
FFstrbuf algorithm;
|
||||
};
|
||||
|
||||
typedef struct FFWifiResult
|
||||
{
|
||||
struct FFWifiInterface inf;
|
||||
struct FFWifiConnection conn;
|
||||
struct FFWifiSecurity security;
|
||||
} FFWifiResult;
|
||||
|
||||
const char* ffDetectWifi(const FFinstance* instance, FFlist* result /*list of FFWifiItem*/);
|
||||
|
||||
@@ -21,13 +21,11 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result)
|
||||
ffStrbufInit(&item->conn.status);
|
||||
ffStrbufInit(&item->conn.ssid);
|
||||
ffStrbufInit(&item->conn.macAddress);
|
||||
ffStrbufInit(&item->conn.phyType);
|
||||
ffStrbufInit(&item->conn.protocol);
|
||||
ffStrbufInit(&item->conn.security);
|
||||
item->conn.signalQuality = 0.0/0.0;
|
||||
item->conn.rxRate = 0.0/0.0;
|
||||
item->conn.txRate = 0.0/0.0;
|
||||
item->security.type = FF_WIFI_SECURITY_UNKNOWN;
|
||||
item->security.oneXEnabled = false;
|
||||
ffStrbufInit(&item->security.algorithm);
|
||||
|
||||
ffStrbufAppendS(&item->inf.description, inf.interfaceName.UTF8String);
|
||||
ffStrbufAppendS(&item->inf.status, inf.powerOn ? "Power On" : "Power Off");
|
||||
@@ -43,88 +41,85 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result)
|
||||
switch(inf.activePHYMode)
|
||||
{
|
||||
case kCWPHYModeNone:
|
||||
ffStrbufAppendS(&item->conn.phyType, "none");
|
||||
ffStrbufAppendS(&item->conn.protocol, "none");
|
||||
break;
|
||||
case kCWPHYMode11a:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11a");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11a");
|
||||
break;
|
||||
case kCWPHYMode11b:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11b");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11b");
|
||||
break;
|
||||
case kCWPHYMode11g:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11g");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11g");
|
||||
break;
|
||||
case kCWPHYMode11n:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11n (Wi-Fi 4)");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11n (Wi-Fi 4)");
|
||||
break;
|
||||
case kCWPHYMode11ac:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11ac (Wi-Fi 5)");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11ac (Wi-Fi 5)");
|
||||
break;
|
||||
case 6 /*kCWPHYMode11ax*/:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11ax (Wi-Fi 6)");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11ax (Wi-Fi 6)");
|
||||
break;
|
||||
case 7 /*kCWPHYMode11be?*/:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11be (Wi-Fi 7)");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11be (Wi-Fi 7)");
|
||||
break;
|
||||
default:
|
||||
ffStrbufAppendF(&item->conn.phyType, "Unknown (%ld)", inf.activePHYMode);
|
||||
ffStrbufAppendF(&item->conn.protocol, "Unknown (%ld)", inf.activePHYMode);
|
||||
break;
|
||||
}
|
||||
item->conn.signalQuality = inf.rssiValue >= -50 ? 100 : inf.rssiValue <= -100 ? 0 : (inf.rssiValue + 100) * 2;
|
||||
item->conn.txRate = inf.transmitRate;
|
||||
item->security.type = inf.security != kCWSecurityNone ? FF_WIFI_SECURITY_ENABLED : FF_WIFI_SECURITY_DISABLED;
|
||||
|
||||
switch(inf.security)
|
||||
{
|
||||
case kCWSecurityNone:
|
||||
ffStrbufAppendS(&item->security.algorithm, "None");
|
||||
break;
|
||||
case kCWSecurityWEP:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WEP");
|
||||
ffStrbufAppendS(&item->conn.security, "WEP");
|
||||
break;
|
||||
case kCWSecurityWPAPersonal:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WPA Personal");
|
||||
ffStrbufAppendS(&item->conn.security, "WPA Personal");
|
||||
break;
|
||||
case kCWSecurityWPAPersonalMixed:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WPA Persional Mixed");
|
||||
ffStrbufAppendS(&item->conn.security, "WPA Persional Mixed");
|
||||
break;
|
||||
case kCWSecurityWPA2Personal:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WPA2 Personal");
|
||||
ffStrbufAppendS(&item->conn.security, "WPA2 Personal");
|
||||
break;
|
||||
case kCWSecurityPersonal:
|
||||
ffStrbufAppendS(&item->security.algorithm, "Personal");
|
||||
ffStrbufAppendS(&item->conn.security, "Personal");
|
||||
break;
|
||||
case kCWSecurityDynamicWEP:
|
||||
ffStrbufAppendS(&item->security.algorithm, "Dynamic WEP");
|
||||
ffStrbufAppendS(&item->conn.security, "Dynamic WEP");
|
||||
break;
|
||||
case kCWSecurityWPAEnterprise:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WPA Enterprise");
|
||||
ffStrbufAppendS(&item->conn.security, "WPA Enterprise");
|
||||
break;
|
||||
case kCWSecurityWPAEnterpriseMixed:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WPA Enterprise Mixed");
|
||||
ffStrbufAppendS(&item->conn.security, "WPA Enterprise Mixed");
|
||||
break;
|
||||
case kCWSecurityWPA2Enterprise:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WPA2 Enterprise");
|
||||
ffStrbufAppendS(&item->conn.security, "WPA2 Enterprise");
|
||||
break;
|
||||
case kCWSecurityEnterprise:
|
||||
ffStrbufAppendS(&item->security.algorithm, "Enterprise");
|
||||
ffStrbufAppendS(&item->conn.security, "Enterprise");
|
||||
break;
|
||||
case kCWSecurityWPA3Personal:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WPA3 Personal");
|
||||
ffStrbufAppendS(&item->conn.security, "WPA3 Personal");
|
||||
break;
|
||||
case kCWSecurityWPA3Enterprise:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WPA3 Enterprise");
|
||||
ffStrbufAppendS(&item->conn.security, "WPA3 Enterprise");
|
||||
break;
|
||||
case kCWSecurityWPA3Transition:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WPA3 Transition");
|
||||
ffStrbufAppendS(&item->conn.security, "WPA3 Transition");
|
||||
break;
|
||||
case 14 /*kCWSecurityOWE*/:
|
||||
ffStrbufAppendS(&item->security.algorithm, "OWE");
|
||||
ffStrbufAppendS(&item->conn.security, "OWE");
|
||||
break;
|
||||
case 15 /*kCWSecurityOWETransition*/:
|
||||
ffStrbufAppendS(&item->security.algorithm, "OWE Transition");
|
||||
ffStrbufAppendS(&item->conn.security, "OWE Transition");
|
||||
break;
|
||||
default:
|
||||
ffStrbufAppendF(&item->security.algorithm, "Unknown (%ld)", inf.security);
|
||||
ffStrbufAppendF(&item->conn.security, "Unknown (%ld)", inf.security);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
+223
-28
@@ -1,5 +1,204 @@
|
||||
#include "wifi.h"
|
||||
|
||||
#include "common/processing.h"
|
||||
#include "common/properties.h"
|
||||
#include "common/library.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef FF_HAVE_LIBNM
|
||||
|
||||
#include <glib.h>
|
||||
#define NM_NO_INCLUDE_EXTRA_HEADERS 1
|
||||
#include <NetworkManager.h>
|
||||
|
||||
const char* ffDetectWifi(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* result)
|
||||
{
|
||||
FF_LIBRARY_LOAD(nm, &instance->config.libnm, "dlopen libnm failed", "libnm" FF_LIBRARY_EXTENSION, 0);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_client_new);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_client_get_devices);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_device_get_iface);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_device_get_state);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_device_wifi_get_type);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_device_wifi_get_active_access_point);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_ssid);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_utils_ssid_to_utf8);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_bssid);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_strength);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_max_bitrate);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_flags);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_wpa_flags);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_rsn_flags);
|
||||
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, g_type_check_instance_is_a);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, g_bytes_get_size);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, g_bytes_get_data);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, g_free);
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, g_object_unref);
|
||||
|
||||
NMClient* client = ffnm_client_new(NULL, NULL);
|
||||
if(!client)
|
||||
{
|
||||
dlclose(nm);
|
||||
return "Could not create NMClient";
|
||||
}
|
||||
|
||||
/* Get all devices managed by NetworkManager */
|
||||
const GPtrArray* devices = ffnm_client_get_devices(client);
|
||||
|
||||
/* Go through the array and process Wi-Fi devices */
|
||||
for (guint i = 0; i < devices->len; i++)
|
||||
{
|
||||
NMDevice *device = g_ptr_array_index(devices, i);
|
||||
if (!({
|
||||
GTypeInstance *__inst = (GTypeInstance*) device; GType __t = ffnm_device_wifi_get_type(); gboolean __r;
|
||||
if (!__inst)
|
||||
__r = FALSE;
|
||||
else if (__inst->g_class && __inst->g_class->g_type == __t)
|
||||
__r = TRUE;
|
||||
else
|
||||
__r = ffg_type_check_instance_is_a (__inst, __t);
|
||||
__r;
|
||||
}) //NM_IS_DEVICE_WIFI(device)
|
||||
)
|
||||
continue;
|
||||
|
||||
FFWifiResult* item = (FFWifiResult*) ffListAdd(result);
|
||||
ffStrbufInit(&item->inf.description);
|
||||
ffStrbufInit(&item->inf.status);
|
||||
ffStrbufInit(&item->conn.status);
|
||||
ffStrbufInit(&item->conn.ssid);
|
||||
ffStrbufInit(&item->conn.macAddress);
|
||||
ffStrbufInit(&item->conn.protocol);
|
||||
ffStrbufInit(&item->conn.security);
|
||||
item->conn.signalQuality = 0.0/0.0;
|
||||
item->conn.rxRate = 0.0/0.0;
|
||||
item->conn.txRate = 0.0/0.0;
|
||||
|
||||
ffStrbufAppendS(&item->inf.description, ffnm_device_get_iface(device));
|
||||
NMDeviceState state = ffnm_device_get_state(device);
|
||||
switch(state)
|
||||
{
|
||||
case NM_DEVICE_STATE_UNKNOWN:
|
||||
ffStrbufAppendS(&item->inf.status, "Unknown");
|
||||
break;
|
||||
case NM_DEVICE_STATE_UNMANAGED:
|
||||
ffStrbufAppendS(&item->inf.status, "Unmanaged");
|
||||
break;
|
||||
case NM_DEVICE_STATE_UNAVAILABLE:
|
||||
ffStrbufAppendS(&item->inf.status, "Unavailable");
|
||||
break;
|
||||
case NM_DEVICE_STATE_DISCONNECTED:
|
||||
ffStrbufAppendS(&item->inf.status, "Disconnected");
|
||||
break;
|
||||
case NM_DEVICE_STATE_PREPARE:
|
||||
ffStrbufAppendS(&item->inf.status, "Prepare");
|
||||
break;
|
||||
case NM_DEVICE_STATE_CONFIG:
|
||||
ffStrbufAppendS(&item->inf.status, "Config");
|
||||
break;
|
||||
case NM_DEVICE_STATE_NEED_AUTH:
|
||||
ffStrbufAppendS(&item->inf.status, "Need auth");
|
||||
break;
|
||||
case NM_DEVICE_STATE_IP_CONFIG:
|
||||
ffStrbufAppendS(&item->inf.status, "IP config");
|
||||
break;
|
||||
case NM_DEVICE_STATE_IP_CHECK:
|
||||
ffStrbufAppendS(&item->inf.status, "IP check");
|
||||
break;
|
||||
case NM_DEVICE_STATE_SECONDARIES:
|
||||
ffStrbufAppendS(&item->inf.status, "Secondaries");
|
||||
break;
|
||||
case NM_DEVICE_STATE_ACTIVATED:
|
||||
ffStrbufAppendS(&item->inf.status, "Activated");
|
||||
break;
|
||||
case NM_DEVICE_STATE_DEACTIVATING:
|
||||
ffStrbufAppendS(&item->inf.status, "Deactivating");
|
||||
break;
|
||||
case NM_DEVICE_STATE_FAILED:
|
||||
ffStrbufAppendS(&item->inf.status, "Failed");
|
||||
break;
|
||||
}
|
||||
if(state != NM_DEVICE_STATE_ACTIVATED)
|
||||
continue;
|
||||
|
||||
NMAccessPoint* ap = ffnm_device_wifi_get_active_access_point((NMDeviceWifi *) device);
|
||||
if (!ap)
|
||||
continue;
|
||||
|
||||
GBytes* activeSsid = ffnm_access_point_get_ssid(ap);
|
||||
if (activeSsid)
|
||||
{
|
||||
char* ssid = ffnm_utils_ssid_to_utf8(ffg_bytes_get_data(activeSsid, NULL), ffg_bytes_get_size(activeSsid));
|
||||
ffStrbufAppendS(&item->conn.ssid, ssid);
|
||||
ffg_free(ssid);
|
||||
}
|
||||
|
||||
ffStrbufAppendS(&item->conn.macAddress, ffnm_access_point_get_bssid(ap));
|
||||
item->conn.signalQuality = ffnm_access_point_get_strength(ap);
|
||||
item->conn.rxRate = ffnm_access_point_get_max_bitrate(ap);
|
||||
|
||||
if(instance->config.allowSlowOperations)
|
||||
{
|
||||
FF_STRBUF_AUTO_DESTROY output;
|
||||
ffStrbufInit(&output);
|
||||
if(!ffProcessAppendStdOut(&output, (char* const[]){
|
||||
"iw",
|
||||
"dev",
|
||||
item->inf.description.chars,
|
||||
"link",
|
||||
NULL
|
||||
}) && ffParsePropLines(output.chars, "tx bitrate: ", &item->conn.protocol))
|
||||
{
|
||||
if(ffStrbufContainS(&item->conn.protocol, " HE-MCS "))
|
||||
ffStrbufSetS(&item->conn.protocol, "802.11ax (Wi-Fi 6)");
|
||||
else if(ffStrbufContainS(&item->conn.protocol, " VHT-MCS "))
|
||||
ffStrbufSetS(&item->conn.protocol, "802.11ac (Wi-Fi 5)");
|
||||
else if(ffStrbufContainS(&item->conn.protocol, " MCS "))
|
||||
ffStrbufSetS(&item->conn.protocol, "802.11n (Wi-Fi 4)");
|
||||
else
|
||||
ffStrbufSetS(&item->conn.protocol, "802.11a/b/g");
|
||||
}
|
||||
}
|
||||
if(!item->conn.protocol.length)
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11");
|
||||
|
||||
NM80211ApFlags flags = ffnm_access_point_get_flags(ap);
|
||||
NM80211ApSecurityFlags wpaFlags = ffnm_access_point_get_wpa_flags(ap);
|
||||
NM80211ApSecurityFlags rsnFlags = ffnm_access_point_get_rsn_flags(ap);
|
||||
|
||||
if ((flags & NM_802_11_AP_FLAGS_PRIVACY) && (wpaFlags == NM_802_11_AP_SEC_NONE)
|
||||
&& (rsnFlags == NM_802_11_AP_SEC_NONE))
|
||||
ffStrbufAppendS(&item->conn.security, "WEP ");
|
||||
if (wpaFlags != NM_802_11_AP_SEC_NONE)
|
||||
ffStrbufAppendS(&item->conn.security, "WPA ");
|
||||
if ((rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_PSK)
|
||||
|| (rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) {
|
||||
ffStrbufAppendS(&item->conn.security, "WPA2 ");
|
||||
}
|
||||
if (rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_SAE) {
|
||||
ffStrbufAppendS(&item->conn.security, "WPA3 ");
|
||||
}
|
||||
if ((rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_OWE)
|
||||
|| (rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_OWE_TM)) {
|
||||
ffStrbufAppendS(&item->conn.security, "OWE ");
|
||||
}
|
||||
if ((wpaFlags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)
|
||||
|| (rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) {
|
||||
ffStrbufAppendS(&item->conn.security, "802.1X ");
|
||||
}
|
||||
ffStrbufTrimRight(&item->conn.security, ' ');
|
||||
}
|
||||
|
||||
ffg_object_unref(client);
|
||||
dlclose(nm);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#include "common/io.h"
|
||||
|
||||
#include <net/if.h>
|
||||
@@ -26,9 +225,9 @@ static const char* detectInf(char* ifName, FFWifiResult* wifi)
|
||||
if(ioctl(sock, SIOCGIWNAME, &iwr) >= 0)
|
||||
{
|
||||
if(strncasecmp(iwr.u.name, "IEEE ", 5) == 0)
|
||||
ffStrbufSetS(&wifi->conn.phyType, iwr.u.name + 5);
|
||||
ffStrbufSetS(&wifi->conn.protocol, iwr.u.name + 5);
|
||||
else
|
||||
ffStrbufSetS(&wifi->conn.phyType, iwr.u.name);
|
||||
ffStrbufSetS(&wifi->conn.protocol, iwr.u.name);
|
||||
}
|
||||
|
||||
if(ioctl(sock, SIOCGIWAP, &iwr) >= 0)
|
||||
@@ -50,30 +249,26 @@ static const char* detectInf(char* ifName, FFWifiResult* wifi)
|
||||
if(ioctl(sock, SIOCGIWENCODEEXT, &iwr) >= 0)
|
||||
{
|
||||
struct iw_encode_ext* iwe = iwr.u.data.pointer;
|
||||
if(iwe->alg == IW_ENCODE_ALG_NONE)
|
||||
wifi->security.type = FF_WIFI_SECURITY_DISABLED;
|
||||
else
|
||||
switch(iwe->alg)
|
||||
{
|
||||
wifi->security.type = FF_WIFI_SECURITY_ENABLED;
|
||||
switch(iwe->alg)
|
||||
{
|
||||
case IW_ENCODE_ALG_WEP:
|
||||
ffStrbufAppendS(&wifi->security.algorithm, "WEP");
|
||||
break;
|
||||
case IW_ENCODE_ALG_TKIP:
|
||||
ffStrbufAppendS(&wifi->security.algorithm, "TKIP");
|
||||
break;
|
||||
case IW_ENCODE_ALG_CCMP:
|
||||
ffStrbufAppendS(&wifi->security.algorithm, "CCMP");
|
||||
break;
|
||||
case IW_ENCODE_ALG_PMK:
|
||||
ffStrbufAppendS(&wifi->security.algorithm, "PMK");
|
||||
break;
|
||||
case IW_ENCODE_ALG_AES_CMAC:
|
||||
ffStrbufAppendS(&wifi->security.algorithm, "CMAC");
|
||||
break;
|
||||
}
|
||||
case IW_ENCODE_ALG_WEP:
|
||||
ffStrbufAppendS(&wifi->conn.security, "WEP");
|
||||
break;
|
||||
case IW_ENCODE_ALG_TKIP:
|
||||
ffStrbufAppendS(&wifi->conn.security, "TKIP");
|
||||
break;
|
||||
case IW_ENCODE_ALG_CCMP:
|
||||
ffStrbufAppendS(&wifi->conn.security, "CCMP");
|
||||
break;
|
||||
case IW_ENCODE_ALG_PMK:
|
||||
ffStrbufAppendS(&wifi->conn.security, "PMK");
|
||||
break;
|
||||
case IW_ENCODE_ALG_AES_CMAC:
|
||||
ffStrbufAppendS(&wifi->conn.security, "CMAC");
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
ffStrbufAppendS(&wifi->conn.security, "unknown");
|
||||
}
|
||||
|
||||
close(sock);
|
||||
@@ -104,13 +299,11 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result)
|
||||
ffStrbufInit(&item->conn.status);
|
||||
ffStrbufInit(&item->conn.ssid);
|
||||
ffStrbufInit(&item->conn.macAddress);
|
||||
ffStrbufInit(&item->conn.phyType);
|
||||
ffStrbufInit(&item->conn.protocol);
|
||||
ffStrbufInit(&item->conn.security);
|
||||
item->conn.signalQuality = 0.0/0.0;
|
||||
item->conn.rxRate = 0.0/0.0;
|
||||
item->conn.txRate = 0.0/0.0;
|
||||
item->security.type = FF_WIFI_SECURITY_UNKNOWN;
|
||||
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"))
|
||||
@@ -126,3 +319,5 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result)
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -82,13 +82,11 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* res
|
||||
ffStrbufInit(&item->conn.status);
|
||||
ffStrbufInit(&item->conn.ssid);
|
||||
ffStrbufInit(&item->conn.macAddress);
|
||||
ffStrbufInit(&item->conn.phyType);
|
||||
ffStrbufInit(&item->conn.protocol);
|
||||
ffStrbufInit(&item->conn.security);
|
||||
item->conn.signalQuality = 0.0/0.0;
|
||||
item->conn.rxRate = 0.0/0.0;
|
||||
item->conn.txRate = 0.0/0.0;
|
||||
item->security.type = FF_WIFI_SECURITY_UNKNOWN;
|
||||
item->security.oneXEnabled = false;
|
||||
ffStrbufInit(&item->security.algorithm);
|
||||
|
||||
ffStrbufSetWS(&item->inf.description, ifInfo->strInterfaceDescription);
|
||||
convertIfStateToString(ifInfo->isState, &item->inf.status);
|
||||
@@ -121,40 +119,40 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* res
|
||||
switch (connInfo->wlanAssociationAttributes.dot11PhyType)
|
||||
{
|
||||
case dot11_phy_type_fhss:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11 (FHSS)");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11 (FHSS)");
|
||||
break;
|
||||
case dot11_phy_type_dsss:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11 (DSSS)");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11 (DSSS)");
|
||||
break;
|
||||
case dot11_phy_type_irbaseband:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11 (IR)");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11 (IR)");
|
||||
break;
|
||||
case dot11_phy_type_ofdm:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11a");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11a");
|
||||
break;
|
||||
case dot11_phy_type_hrdsss:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11b");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11b");
|
||||
break;
|
||||
case dot11_phy_type_erp:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11g");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11g");
|
||||
break;
|
||||
case dot11_phy_type_ht:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11n (Wi-Fi 4)");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11n (Wi-Fi 4)");
|
||||
break;
|
||||
case 8 /*dot11_phy_type_vht*/:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11ac (Wi-Fi 5)");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11ac (Wi-Fi 5)");
|
||||
break;
|
||||
case 9 /*dot11_phy_type_dmg*/:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11ad (WiGig)");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11ad (WiGig)");
|
||||
break;
|
||||
case 10 /*dot11_phy_type_he*/:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11ax (Wi-Fi 6)");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11ax (Wi-Fi 6)");
|
||||
break;
|
||||
case 11 /*dot11_phy_type_eht*/:
|
||||
ffStrbufAppendS(&item->conn.phyType, "802.11be (Wi-Fi 7)");
|
||||
ffStrbufAppendS(&item->conn.protocol, "802.11be (Wi-Fi 7)");
|
||||
break;
|
||||
default:
|
||||
ffStrbufAppendF(&item->conn.phyType, "Unknown (%u)", (unsigned)connInfo->wlanAssociationAttributes.dot11PhyType);
|
||||
ffStrbufAppendF(&item->conn.protocol, "Unknown (%u)", (unsigned)connInfo->wlanAssociationAttributes.dot11PhyType);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -162,93 +160,51 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* res
|
||||
item->conn.rxRate = connInfo->wlanAssociationAttributes.ulRxRate;
|
||||
item->conn.txRate = connInfo->wlanAssociationAttributes.ulTxRate;
|
||||
|
||||
item->security.type = connInfo->wlanSecurityAttributes.bSecurityEnabled ? FF_WIFI_SECURITY_ENABLED : FF_WIFI_SECURITY_DISABLED;
|
||||
item->security.oneXEnabled = connInfo->wlanSecurityAttributes.bOneXEnabled;
|
||||
switch (connInfo->wlanSecurityAttributes.dot11AuthAlgorithm)
|
||||
if(connInfo->wlanSecurityAttributes.bSecurityEnabled)
|
||||
{
|
||||
case DOT11_AUTH_ALGO_80211_OPEN:
|
||||
ffStrbufAppendS(&item->security.algorithm, "802.11 Open");
|
||||
break;
|
||||
case DOT11_AUTH_ALGO_80211_SHARED_KEY:
|
||||
ffStrbufAppendS(&item->security.algorithm, "802.11 Shared");
|
||||
break;
|
||||
case DOT11_AUTH_ALGO_WPA:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WPA");
|
||||
break;
|
||||
case DOT11_AUTH_ALGO_WPA_PSK:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WPA-PSK");
|
||||
break;
|
||||
case DOT11_AUTH_ALGO_WPA_NONE:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WPA-None");
|
||||
break;
|
||||
case DOT11_AUTH_ALGO_RSNA:
|
||||
ffStrbufAppendS(&item->security.algorithm, "RSNA");
|
||||
break;
|
||||
case DOT11_AUTH_ALGO_RSNA_PSK:
|
||||
ffStrbufAppendS(&item->security.algorithm, "RSNA with PSK");
|
||||
break;
|
||||
case 8 /* DOT11_AUTH_ALGO_WPA3 */:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WPA3");
|
||||
break;
|
||||
case 9 /* DOT11_AUTH_ALGO_WPA3_SAE */:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WPA3-SAE");
|
||||
break;
|
||||
case 10 /* DOT11_AUTH_ALGO_OWE */:
|
||||
ffStrbufAppendS(&item->security.algorithm, "OWE");
|
||||
break;
|
||||
case 11 /* DOT11_AUTH_ALGO_WPA3_ENT */:
|
||||
ffStrbufAppendS(&item->security.algorithm, "OWE-ENT");
|
||||
break;
|
||||
default:
|
||||
ffStrbufAppendF(&item->security.algorithm, "Unknown (%u)", (unsigned)connInfo->wlanSecurityAttributes.dot11AuthAlgorithm);
|
||||
break;
|
||||
}
|
||||
ffStrbufAppendS(&item->security.algorithm, " - ");
|
||||
switch (connInfo->wlanSecurityAttributes.dot11CipherAlgorithm)
|
||||
{
|
||||
case DOT11_CIPHER_ALGO_NONE:
|
||||
ffStrbufAppendS(&item->security.algorithm, "None");
|
||||
break;
|
||||
case DOT11_CIPHER_ALGO_WEP40:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WEP-40");
|
||||
break;
|
||||
case DOT11_CIPHER_ALGO_TKIP:
|
||||
ffStrbufAppendS(&item->security.algorithm, "TKIP");
|
||||
break;
|
||||
case DOT11_CIPHER_ALGO_CCMP:
|
||||
ffStrbufAppendS(&item->security.algorithm, "CCMP");
|
||||
break;
|
||||
case DOT11_CIPHER_ALGO_WEP104:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WEP-104");
|
||||
break;
|
||||
case 0x06 /* DOT11_CIPHER_ALGO_BIP */:
|
||||
ffStrbufAppendS(&item->security.algorithm, "BIP-CMAC-128");
|
||||
break;
|
||||
case 0x08 /* DOT11_CIPHER_ALGO_GCMP */:
|
||||
ffStrbufAppendS(&item->security.algorithm, "GCMP-128");
|
||||
break;
|
||||
case 0x09 /* DOT11_CIPHER_ALGO_GCMP_256 */:
|
||||
ffStrbufAppendS(&item->security.algorithm, "GCMP-256");
|
||||
break;
|
||||
case 0x0a /* DOT11_CIPHER_ALGO_CCMP_256 */:
|
||||
ffStrbufAppendS(&item->security.algorithm, "CCMP-256");
|
||||
break;
|
||||
case 0x0b /* DOT11_CIPHER_ALGO_BIP_GMAC_128 */:
|
||||
ffStrbufAppendS(&item->security.algorithm, "BIP-GMAC-128");
|
||||
break;
|
||||
case 0x0c /* DOT11_CIPHER_ALGO_BIP_GMAC_256 */:
|
||||
ffStrbufAppendS(&item->security.algorithm, "BIP-GMAC-256");
|
||||
break;
|
||||
case 0x0d /* DOT11_CIPHER_ALGO_BIP_CMAC_256 */:
|
||||
ffStrbufAppendS(&item->security.algorithm, "BIP-CMAC-256");
|
||||
break;
|
||||
case DOT11_CIPHER_ALGO_WEP:
|
||||
ffStrbufAppendS(&item->security.algorithm, "WEP");
|
||||
break;
|
||||
default:
|
||||
ffStrbufAppendF(&item->security.algorithm, "Unknown (%u)", (unsigned)connInfo->wlanSecurityAttributes.dot11CipherAlgorithm);
|
||||
break;
|
||||
switch (connInfo->wlanSecurityAttributes.dot11AuthAlgorithm)
|
||||
{
|
||||
case DOT11_AUTH_ALGO_80211_OPEN:
|
||||
ffStrbufAppendS(&item->conn.security, "802.11 Open");
|
||||
break;
|
||||
case DOT11_AUTH_ALGO_80211_SHARED_KEY:
|
||||
ffStrbufAppendS(&item->conn.security, "802.11 Shared");
|
||||
break;
|
||||
case DOT11_AUTH_ALGO_WPA:
|
||||
ffStrbufAppendS(&item->conn.security, "WPA");
|
||||
break;
|
||||
case DOT11_AUTH_ALGO_WPA_PSK:
|
||||
ffStrbufAppendS(&item->conn.security, "WPA-PSK");
|
||||
break;
|
||||
case DOT11_AUTH_ALGO_WPA_NONE:
|
||||
ffStrbufAppendS(&item->conn.security, "WPA-None");
|
||||
break;
|
||||
case DOT11_AUTH_ALGO_RSNA:
|
||||
ffStrbufAppendS(&item->conn.security, "WPA2");
|
||||
break;
|
||||
case DOT11_AUTH_ALGO_RSNA_PSK:
|
||||
ffStrbufAppendS(&item->conn.security, "WPA2-PSK");
|
||||
break;
|
||||
case 8 /* DOT11_AUTH_ALGO_WPA3 */:
|
||||
ffStrbufAppendS(&item->conn.security, "WPA3");
|
||||
break;
|
||||
case 9 /* DOT11_AUTH_ALGO_WPA3_SAE */:
|
||||
ffStrbufAppendS(&item->conn.security, "WPA3-SAE");
|
||||
break;
|
||||
case 10 /* DOT11_AUTH_ALGO_OWE */:
|
||||
ffStrbufAppendS(&item->conn.security, "OWE");
|
||||
break;
|
||||
case 11 /* DOT11_AUTH_ALGO_WPA3_ENT */:
|
||||
ffStrbufAppendS(&item->conn.security, "OWE-ENT");
|
||||
break;
|
||||
default:
|
||||
ffStrbufAppendF(&item->conn.security, "Unknown (%u)", (unsigned)connInfo->wlanSecurityAttributes.dot11AuthAlgorithm);
|
||||
break;
|
||||
}
|
||||
if(connInfo->wlanSecurityAttributes.bOneXEnabled)
|
||||
ffStrbufAppendS(&item->conn.security, " 802.11X");
|
||||
}
|
||||
|
||||
ffWlanFreeMemory(connInfo);
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -373,13 +373,11 @@ static inline void printCommandHelp(const char* command)
|
||||
"Connection status",
|
||||
"Connection SSID",
|
||||
"Connection mac address",
|
||||
"Connection PHY type",
|
||||
"Connection protocol",
|
||||
"Connection signal quality (percentage)",
|
||||
"Connection RX rate",
|
||||
"Connection TX rate",
|
||||
"Security enabled",
|
||||
"Security 802.1X enabled",
|
||||
"Security algorithm"
|
||||
"Connection Security algorithm"
|
||||
);
|
||||
}
|
||||
else if(strcasecmp(command, "player-format") == 0)
|
||||
@@ -1236,6 +1234,8 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con
|
||||
optionParseString(key, value, &instance->config.libcJSON);
|
||||
else if(strcasecmp(subkey, "-wlanapi") == 0)
|
||||
optionParseString(key, value, &instance->config.libwlanapi);
|
||||
else if(strcasecmp(subkey, "-nm") == 0)
|
||||
optionParseString(key, value, &instance->config.libnm);
|
||||
else
|
||||
goto error;
|
||||
}
|
||||
|
||||
@@ -163,6 +163,7 @@ typedef struct FFconfig
|
||||
FFstrbuf libcJSON;
|
||||
FFstrbuf libfreetype;
|
||||
FFstrbuf libwlanapi;
|
||||
FFstrbuf libnm;
|
||||
|
||||
bool cpuTemp;
|
||||
bool gpuTemp;
|
||||
|
||||
+10
-12
@@ -3,7 +3,7 @@
|
||||
#include "detection/wifi/wifi.h"
|
||||
|
||||
#define FF_WIFI_MODULE_NAME "Wifi"
|
||||
#define FF_WIFI_NUM_FORMAT_ARGS 12
|
||||
#define FF_WIFI_NUM_FORMAT_ARGS 10
|
||||
|
||||
void ffPrintWifi(FFinstance* instance)
|
||||
{
|
||||
@@ -24,11 +24,11 @@ void ffPrintWifi(FFinstance* instance)
|
||||
ffPrintLogoAndKey(instance, FF_WIFI_MODULE_NAME, moduleIndex, &instance->config.wifi.key);
|
||||
if(item->conn.ssid.length)
|
||||
{
|
||||
printf("%s - %s", item->conn.ssid.chars, item->conn.phyType.chars);
|
||||
if(item->security.type == FF_WIFI_SECURITY_DISABLED)
|
||||
puts(" - insecure");
|
||||
else
|
||||
putchar('\n');
|
||||
printf("%s - %s - %s\n",
|
||||
item->conn.ssid.chars,
|
||||
item->conn.protocol.chars,
|
||||
item->conn.security.length > 0 ? item->conn.security.chars : "insecure"
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -43,13 +43,11 @@ void ffPrintWifi(FFinstance* instance)
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.status},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.ssid},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.macAddress},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.phyType},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.protocol},
|
||||
{FF_FORMAT_ARG_TYPE_DOUBLE, &item->conn.signalQuality},
|
||||
{FF_FORMAT_ARG_TYPE_DOUBLE, &item->conn.rxRate},
|
||||
{FF_FORMAT_ARG_TYPE_DOUBLE, &item->conn.txRate},
|
||||
{FF_FORMAT_ARG_TYPE_STRING, item->security.type == FF_WIFI_SECURITY_UNKNOWN ? "Unknown" : item->security.type == FF_WIFI_SECURITY_ENABLED ? "Secure" : "Insecure"},
|
||||
{FF_FORMAT_ARG_TYPE_BOOL, &item->security.oneXEnabled},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &item->security.algorithm},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.security},
|
||||
});
|
||||
}
|
||||
|
||||
@@ -58,8 +56,8 @@ void ffPrintWifi(FFinstance* instance)
|
||||
ffStrbufDestroy(&item->conn.status);
|
||||
ffStrbufDestroy(&item->conn.ssid);
|
||||
ffStrbufDestroy(&item->conn.macAddress);
|
||||
ffStrbufDestroy(&item->conn.phyType);
|
||||
ffStrbufDestroy(&item->security.algorithm);
|
||||
ffStrbufDestroy(&item->conn.protocol);
|
||||
ffStrbufDestroy(&item->conn.security);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user