mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-09-13 02:42:09 +02:00
Network (macOS): init
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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>");
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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},
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user