Network (macOS): init

This commit is contained in:
李通洲
2023-04-18 14:57:25 +08:00
committed by Carter Li
parent 3185d92fb5
commit a644762a60
9 changed files with 145 additions and 0 deletions
+3
View File
@@ -284,6 +284,7 @@ set(LIBFASTFETCH_SRC
src/modules/locale.c
src/modules/localip.c
src/modules/memory.c
src/modules/network.c
src/modules/opencl.c
src/modules/opengl.c
src/modules/os.c
@@ -473,6 +474,7 @@ elseif(APPLE)
src/detection/gamepad/gamepad_apple.c
src/detection/media/media_apple.m
src/detection/memory/memory_apple.c
src/detection/network/network_apple.c
src/detection/opengl/opengl_apple.c
src/detection/os/os_apple.m
src/detection/packages/packages_apple.c
@@ -710,6 +712,7 @@ if(APPLE)
PRIVATE "-framework IOKit"
PRIVATE "-framework OpenGL"
PRIVATE "-framework OpenCL"
PRIVATE "-framework SystemConfiguration"
PRIVATE "-weak_framework CoreDisplay"
PRIVATE "-weak_framework DisplayServices -F /System/Library/PrivateFrameworks"
PRIVATE "-weak_framework MediaRemote -F /System/Library/PrivateFrameworks"
+6
View File
@@ -115,6 +115,7 @@ static void defaultConfig(FFinstance* instance)
initModuleArg(&instance->config.bluetooth);
initModuleArg(&instance->config.sound);
initModuleArg(&instance->config.gamepad);
initModuleArg(&instance->config.network);
ffStrbufInitA(&instance->config.libPCI, 0);
ffStrbufInitA(&instance->config.libVulkan, 0);
@@ -203,6 +204,8 @@ static void defaultConfig(FFinstance* instance)
);
ffListInit(&instance->config.commandKeys, sizeof(FFstrbuf));
ffListInit(&instance->config.commandTexts, sizeof(FFstrbuf));
ffStrbufInit(&instance->config.networkType);
}
void ffInitInstance(FFinstance* instance)
@@ -383,6 +386,7 @@ static void destroyConfig(FFinstance* instance)
destroyModuleArg(&instance->config.bluetooth);
destroyModuleArg(&instance->config.sound);
destroyModuleArg(&instance->config.gamepad);
destroyModuleArg(&instance->config.network);
ffStrbufDestroy(&instance->config.libPCI);
ffStrbufDestroy(&instance->config.libVulkan);
@@ -426,6 +430,8 @@ static void destroyConfig(FFinstance* instance)
FF_LIST_FOR_EACH(FFstrbuf, item, instance->config.commandTexts)
ffStrbufDestroy(item);
ffListDestroy(&instance->config.commandTexts);
ffStrbufDestroy(&instance->config.networkType);
}
static void destroyState(FFinstance* instance)
+18
View File
@@ -0,0 +1,18 @@
#pragma once
#ifndef FF_INCLUDED_detection_network_network
#define FF_INCLUDED_detection_network_network
#include "fastfetch.h"
typedef struct FFNetworkResult
{
FFstrbuf name;
FFstrbuf type;
FFstrbuf address;
int32_t mtu;
} FFNetworkResult;
const char* ffDetectNetwork(FFinstance* instance, FFlist* result);
#endif
+42
View File
@@ -0,0 +1,42 @@
#include "detection/network/network.h"
#include "util/apple/cf_helpers.h"
#include <SystemConfiguration/SystemConfiguration.h>
const char* ffDetectNetwork(FFinstance* instance, FFlist* result)
{
FF_STRBUF_AUTO_DESTROY sbType;
ffStrbufInit(&sbType);
CFArrayRef FF_CFTYPE_AUTO_RELEASE array = SCNetworkInterfaceCopyAll();
for (CFIndex i = 0, length = CFArrayGetCount(array); i < length; ++i)
{
SCNetworkInterfaceRef ni = CFArrayGetValueAtIndex(array, i), parent;
while ((parent = SCNetworkInterfaceGetInterface(ni)))
ni = parent;
CFStringRef cfType = SCNetworkInterfaceGetInterfaceType(ni);
if (cfType)
ffCfStrGetString(cfType, &sbType);
else
ffStrbufAppendS(&sbType, "Unknown");
if (instance->config.networkType.length && !ffStrbufContainIgnCase(&instance->config.networkType, &sbType))
continue;
FFNetworkResult* item = (FFNetworkResult*) ffListAdd(result);
ffStrbufInitMove(&item->type, &sbType);
ffStrbufInit(&item->name);
ffStrbufInit(&item->address);
item->mtu = 0;
ffCfStrGetString(SCNetworkInterfaceGetLocalizedDisplayName(ni), &item->name);
ffCfStrGetString(SCNetworkInterfaceGetHardwareAddressString(ni), &item->address);
SCNetworkInterfaceCopyMTU(ni, &item->mtu, nil, nil);
}
if (result->length == 0)
return "No network interfaces found";
return NULL;
}
+4
View File
@@ -1341,6 +1341,8 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con
}
else if(strcasecmp(key, "--percent-type") == 0)
instance->config.percentType = optionParseUInt32(key, value);
else if(strcasecmp(key, "--network-type") == 0)
optionParseString(key, value, &instance->config.networkType);
else if(strcasecmp(key, "--command-shell") == 0)
optionParseString(key, value, &instance->config.commandShell);
else if(strcasecmp(key, "--command-key") == 0)
@@ -1516,6 +1518,8 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char
ffPrintSound(instance);
else if(strcasecmp(line, "gamepad") == 0)
ffPrintGamepad(instance);
else if(strcasecmp(line, "network") == 0)
ffPrintNetwork(instance);
else
ffPrintErrorString(instance, line, 0, NULL, NULL, "<no implementation provided>");
}
+4
View File
@@ -163,6 +163,7 @@ typedef struct FFconfig
FFModuleArgs bluetooth;
FFModuleArgs sound;
FFModuleArgs gamepad;
FFModuleArgs network;
FFstrbuf libPCI;
FFstrbuf libVulkan;
@@ -243,6 +244,8 @@ typedef struct FFconfig
FFstrbuf commandShell;
FFlist commandKeys;
FFlist commandTexts;
FFstrbuf networkType;
} FFconfig;
typedef struct FFstate
@@ -349,5 +352,6 @@ void ffPrintCommand(FFinstance* instance);
void ffPrintBluetooth(FFinstance* instance);
void ffPrintSound(FFinstance* instance);
void ffPrintGamepad(FFinstance* instance);
void ffPrintNetwork(FFinstance* instance);
#endif
+52
View File
@@ -0,0 +1,52 @@
#include "fastfetch.h"
#include "common/printing.h"
#include "detection/network/network.h"
#define FF_NETWORK_MODULE_NAME "Network"
#define FF_NETWORK_NUM_FORMAT_ARGS 4
void ffPrintNetwork(FFinstance* instance)
{
FF_LIST_AUTO_DESTROY networks;
ffListInit(&networks, sizeof(FFNetworkResult));
const char* error = ffDetectNetwork(instance, &networks);
if(error != NULL)
{
ffPrintError(instance, FF_NETWORK_MODULE_NAME, 0, &instance->config.network, "%s", error);
return;
}
FF_STRBUF_AUTO_DESTROY key;
ffStrbufInit(&key);
FF_LIST_FOR_EACH(FFNetworkResult, network, networks)
{
if(instance->config.network.key.length == 0)
{
ffStrbufSetF(&key, "%s (%s)", FF_NETWORK_MODULE_NAME, network->type.chars);
}
else
{
ffParseFormatString(&key, &instance->config.network.key, 1, (FFformatarg[]){
{FF_FORMAT_ARG_TYPE_STRBUF, &network->type},
{FF_FORMAT_ARG_TYPE_STRBUF, &network->name},
});
}
if (instance->config.network.outputFormat.length == 0)
{
ffPrintLogoAndKey(instance, key.chars, 0, NULL);
printf("%s - %s\n", network->name.chars, network->address.chars);
}
else
{
ffPrintFormatString(instance, key.chars, 0, NULL, &instance->config.network.outputFormat, FF_NETWORK_NUM_FORMAT_ARGS, (FFformatarg[]){
{FF_FORMAT_ARG_TYPE_STRBUF, &network->type},
{FF_FORMAT_ARG_TYPE_STRBUF, &network->name},
{FF_FORMAT_ARG_TYPE_STRBUF, &network->address},
{FF_FORMAT_ARG_TYPE_INT, &network->mtu},
});
}
}
}
+10
View File
@@ -204,11 +204,21 @@ static inline FF_C_NODISCARD bool ffStrbufContainS(const FFstrbuf* strbuf, const
return strstr(strbuf->chars, str) != NULL;
}
static inline FF_C_NODISCARD bool ffStrbufContain(const FFstrbuf* strbuf, const FFstrbuf* str)
{
return ffStrbufContainS(strbuf, str->chars);
}
static inline FF_C_NODISCARD bool ffStrbufContainIgnCaseS(const FFstrbuf* strbuf, const char* str)
{
return strcasestr(strbuf->chars, str) != NULL;
}
static inline FF_C_NODISCARD bool ffStrbufContainIgnCase(const FFstrbuf* strbuf, const FFstrbuf* str)
{
return ffStrbufContainIgnCaseS(strbuf, str->chars);
}
static inline FF_C_NODISCARD uint32_t ffStrbufFirstIndexC(const FFstrbuf* strbuf, char c)
{
return ffStrbufNextIndexC(strbuf, 0, c);
+6
View File
@@ -2,6 +2,12 @@
const char* ffCfStrGetString(CFStringRef str, FFstrbuf* result)
{
if (!str)
{
ffStrbufClear(result);
return NULL;
}
uint32_t length = (uint32_t)CFStringGetLength(str);
//CFString stores UTF16 characters, therefore may require larger buffer to convert to UTF8 string
ffStrbufEnsureFree(result, length * 2);