From 24c37880551a260ee382ebb0172e38da1ba8d0ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 18 Apr 2023 17:30:54 +0800 Subject: [PATCH] Network (Windows): add support --- CMakeLists.txt | 1 + src/common/init.c | 1 + src/detection/network/network.h | 1 + src/detection/network/network_apple.c | 1 + src/detection/network/network_windows.c | 103 ++++++++++++++++++++++++ src/fastfetch.c | 2 + src/fastfetch.h | 1 + src/modules/network.c | 3 +- 8 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 src/detection/network/network_windows.c diff --git a/CMakeLists.txt b/CMakeLists.txt index e9b4cff72..56db7ca45 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -516,6 +516,7 @@ elseif(WIN32) src/detection/gamepad/gamepad_windows.c src/detection/media/media_nosupport.c src/detection/memory/memory_windows.c + src/detection/network/network_windows.c src/detection/opengl/opengl_windows.c src/detection/os/os_windows.cpp src/detection/packages/packages_windows.c diff --git a/src/common/init.c b/src/common/init.c index cf196c1d3..2ba5a2dfc 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -206,6 +206,7 @@ static void defaultConfig(FFinstance* instance) ffListInit(&instance->config.commandTexts, sizeof(FFstrbuf)); ffStrbufInit(&instance->config.networkType); + instance->config.networkAll = false; } void ffInitInstance(FFinstance* instance) diff --git a/src/detection/network/network.h b/src/detection/network/network.h index 82c3064ed..2a4393d31 100644 --- a/src/detection/network/network.h +++ b/src/detection/network/network.h @@ -11,6 +11,7 @@ typedef struct FFNetworkResult FFstrbuf type; FFstrbuf address; int32_t mtu; + bool on; } FFNetworkResult; const char* ffDetectNetwork(FFinstance* instance, FFlist* result); diff --git a/src/detection/network/network_apple.c b/src/detection/network/network_apple.c index 23f527b6a..249372859 100644 --- a/src/detection/network/network_apple.c +++ b/src/detection/network/network_apple.c @@ -29,6 +29,7 @@ const char* ffDetectNetwork(FFinstance* instance, FFlist* result) ffStrbufInit(&item->name); ffStrbufInit(&item->address); item->mtu = 0; + item->on = true; ffCfStrGetString(SCNetworkInterfaceGetLocalizedDisplayName(ni), &item->name); ffCfStrGetString(SCNetworkInterfaceGetHardwareAddressString(ni), &item->address); diff --git a/src/detection/network/network_windows.c b/src/detection/network/network_windows.c new file mode 100644 index 000000000..f8de12009 --- /dev/null +++ b/src/detection/network/network_windows.c @@ -0,0 +1,103 @@ +#include "detection/network/network.h" +#include "util/windows/unicode.h" +#include "util/mallocHelper.h" + +#include +#include +#include +#include + +const char* ffDetectNetwork(FFinstance* instance, FFlist* result) +{ + IP_ADAPTER_ADDRESSES* FF_AUTO_FREE adapter_addresses = NULL; + + // Start with a 16 KB buffer and resize if needed - + // multiple attempts in case interfaces change while + // we are in the middle of querying them. + DWORD adapter_addresses_buffer_size = 16 * 1024; + for (int attempts = 0; attempts != 3; ++attempts) + { + adapter_addresses = (IP_ADAPTER_ADDRESSES*)realloc(adapter_addresses, adapter_addresses_buffer_size); + assert(adapter_addresses); + + DWORD error = GetAdaptersAddresses( + AF_UNSPEC, + GAA_FLAG_SKIP_ANYCAST | + GAA_FLAG_SKIP_MULTICAST | + GAA_FLAG_SKIP_DNS_SERVER | + GAA_FLAG_SKIP_FRIENDLY_NAME, + NULL, + adapter_addresses, + &adapter_addresses_buffer_size); + + if (error == ERROR_SUCCESS) + break; + else if (ERROR_BUFFER_OVERFLOW == error) + continue; + else + return "GetAdaptersAddresses() failed"; + } + + // Iterate through all of the adapters + for (IP_ADAPTER_ADDRESSES* adapter = adapter_addresses; adapter; adapter = adapter->Next) + { + if (adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK) + continue; + + bool isOn = adapter->OperStatus == IfOperStatusUp; + if (!isOn && !instance->config.networkAll) + continue; + + const char* strType = NULL; + switch (adapter->IfType) + { + case IF_TYPE_ETHERNET_CSMACD: + strType = "Ethernet"; + break; + case IF_TYPE_ISO88025_TOKENRING: + strType = "ISO88025"; + break; + case IF_TYPE_PPP: + strType = "PPP"; + break; + case IF_TYPE_ATM: + strType = "ATM"; + break; + case IF_TYPE_IEEE80211: + strType = "IEEE80211"; + break; + case IF_TYPE_TUNNEL: + strType = "Tunnel"; + break; + case IF_TYPE_IEEE1394: + strType = "Fireware"; + break; + case IF_TYPE_MODEM: + strType = "Modem"; + break; + default: + strType = "Other"; + break; + } + + if (instance->config.networkType.length && !ffStrbufContainIgnCaseS(&instance->config.networkType, strType)) + continue; + + FFNetworkResult* item = (FFNetworkResult*) ffListAdd(result); + ffStrbufInitS(&item->type, strType); + ffStrbufInit(&item->name); + ffStrbufInit(&item->address); + item->mtu = (int32_t) adapter->Mtu; + item->on = isOn; + + ffStrbufSetWS(&item->name, adapter->FriendlyName); + for (ULONG i = 0; i < adapter->PhysicalAddressLength; i++) + ffStrbufAppendF(&item->address, "%.2X-", (int) adapter->PhysicalAddress[i]); + ffStrbufTrimRight(&item->address, '-'); + } + + if (result->length == 0) + return "No network interfaces found"; + + return NULL; +} diff --git a/src/fastfetch.c b/src/fastfetch.c index 1e174d93a..11ce9b23f 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1343,6 +1343,8 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con instance->config.percentType = optionParseUInt32(key, value); else if(strcasecmp(key, "--network-type") == 0) optionParseString(key, value, &instance->config.networkType); + else if(strcasecmp(key, "--network-all") == 0) + instance->config.networkAll = optionParseBoolean(value); else if(strcasecmp(key, "--command-shell") == 0) optionParseString(key, value, &instance->config.commandShell); else if(strcasecmp(key, "--command-key") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index b3c3de88b..1ab30a444 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -246,6 +246,7 @@ typedef struct FFconfig FFlist commandTexts; FFstrbuf networkType; + bool networkAll; } FFconfig; typedef struct FFstate diff --git a/src/modules/network.c b/src/modules/network.c index 67809bc91..c61cd53f4 100644 --- a/src/modules/network.c +++ b/src/modules/network.c @@ -3,7 +3,7 @@ #include "detection/network/network.h" #define FF_NETWORK_MODULE_NAME "Network" -#define FF_NETWORK_NUM_FORMAT_ARGS 4 +#define FF_NETWORK_NUM_FORMAT_ARGS 5 void ffPrintNetwork(FFinstance* instance) { @@ -42,6 +42,7 @@ void ffPrintNetwork(FFinstance* instance) else { ffPrintFormatString(instance, key.chars, 0, NULL, &instance->config.network.outputFormat, FF_NETWORK_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRING, network->on ? "ON" : "OFF"}, {FF_FORMAT_ARG_TYPE_STRBUF, &network->type}, {FF_FORMAT_ARG_TYPE_STRBUF, &network->name}, {FF_FORMAT_ARG_TYPE_STRBUF, &network->address},