mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-10-29 00:03:58 +01:00
LocalIP: adds IPv6 type selection for local IP display
`{ "type": "localip", "showIpv6": "ula" /* Show ULA only */ }`
Fixes #1459
This commit is contained in:
@@ -198,10 +198,33 @@ void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module)
|
||||
|
||||
if (unsafe_yyjson_equals_str(key, "showIpv6"))
|
||||
{
|
||||
if (yyjson_get_bool(val))
|
||||
options->showType |= FF_LOCALIP_TYPE_IPV6_BIT;
|
||||
else
|
||||
options->showType &= ~FF_LOCALIP_TYPE_IPV6_BIT;
|
||||
if (yyjson_is_bool(val))
|
||||
{
|
||||
options->ipv6Type = FF_LOCALIP_IPV6_TYPE_AUTO;
|
||||
if (unsafe_yyjson_get_bool(val))
|
||||
options->showType |= FF_LOCALIP_TYPE_IPV6_BIT;
|
||||
else
|
||||
options->showType &= ~FF_LOCALIP_TYPE_IPV6_BIT;
|
||||
}
|
||||
else if (yyjson_is_str(val))
|
||||
{
|
||||
int value;
|
||||
const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) {
|
||||
{ "auto", FF_LOCALIP_IPV6_TYPE_AUTO },
|
||||
{ "gua", FF_LOCALIP_IPV6_TYPE_GUA_BIT },
|
||||
{ "ula", FF_LOCALIP_IPV6_TYPE_ULA_BIT },
|
||||
{ "lla", FF_LOCALIP_IPV6_TYPE_LLA_BIT },
|
||||
{ "unknown", FF_LOCALIP_IPV6_TYPE_UNKNOWN_BIT },
|
||||
{},
|
||||
});
|
||||
if (error)
|
||||
ffPrintError(FF_LOCALIP_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", unsafe_yyjson_get_str(key), error);
|
||||
else
|
||||
{
|
||||
options->showType |= FF_LOCALIP_TYPE_IPV6_BIT;
|
||||
options->ipv6Type = (FFLocalIpIpv6Type) value;
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -302,7 +325,21 @@ void ffGenerateLocalIpJsonConfig(FFLocalIpOptions* options, yyjson_mut_doc* doc,
|
||||
|
||||
yyjson_mut_obj_add_bool(doc, module, "showIpv4", !!(options->showType & FF_LOCALIP_TYPE_IPV4_BIT));
|
||||
|
||||
yyjson_mut_obj_add_bool(doc, module, "showIpv6", !!(options->showType & FF_LOCALIP_TYPE_IPV6_BIT));
|
||||
if (options->ipv6Type == FF_LOCALIP_IPV6_TYPE_AUTO)
|
||||
yyjson_mut_obj_add_bool(doc, module, "showIpv6", !!(options->showType & FF_LOCALIP_TYPE_IPV6_BIT));
|
||||
else
|
||||
{
|
||||
const char* str = NULL;
|
||||
switch (options->ipv6Type)
|
||||
{
|
||||
case FF_LOCALIP_IPV6_TYPE_GUA_BIT: str = "gua"; break;
|
||||
case FF_LOCALIP_IPV6_TYPE_ULA_BIT: str = "ula"; break;
|
||||
case FF_LOCALIP_IPV6_TYPE_LLA_BIT: str = "lla"; break;
|
||||
case FF_LOCALIP_IPV6_TYPE_UNKNOWN_BIT: str = "unknown"; break;
|
||||
default: str = "auto"; break;
|
||||
}
|
||||
yyjson_mut_obj_add_str(doc, module, "showIpv6", str);
|
||||
}
|
||||
|
||||
yyjson_mut_obj_add_bool(doc, module, "showMac", !!(options->showType & FF_LOCALIP_TYPE_MAC_BIT));
|
||||
|
||||
@@ -385,6 +422,7 @@ void ffInitLocalIpOptions(FFLocalIpOptions* options)
|
||||
| FF_LOCALIP_TYPE_DEFAULT_ROUTE_ONLY_BIT
|
||||
#endif
|
||||
;
|
||||
options->ipv6Type = FF_LOCALIP_IPV6_TYPE_AUTO;
|
||||
ffStrbufInit(&options->namePrefix);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,11 +21,26 @@ typedef enum __attribute__((__packed__)) FFLocalIpType
|
||||
} FFLocalIpType;
|
||||
static_assert(sizeof(FFLocalIpType) == sizeof(uint16_t), "");
|
||||
|
||||
typedef enum __attribute__((__packed__)) FFLocalIpIpv6Type
|
||||
{
|
||||
FF_LOCALIP_IPV6_TYPE_NONE = 0b00000000,
|
||||
FF_LOCALIP_IPV6_TYPE_GUA_BIT = 0b00000001,
|
||||
FF_LOCALIP_IPV6_TYPE_ULA_BIT = 0b00000010,
|
||||
FF_LOCALIP_IPV6_TYPE_LLA_BIT = 0b00000100,
|
||||
FF_LOCALIP_IPV6_TYPE_UNKNOWN_BIT = 0b00001000, // IPv4-mapped, loopback, etc.
|
||||
FF_LOCALIP_IPV6_TYPE_SECONDARY_BIT = 0b01000000, // Temporary, duplicated, etc.
|
||||
FF_LOCALIP_IPV6_TYPE_PREFERRED_BIT = 0b10000000, // PREFER_SOURCE (manually set)
|
||||
FF_LOCALIP_IPV6_TYPE_TYPE_MASK = 0b00011111,
|
||||
FF_LOCALIP_IPV6_TYPE_AUTO = 0b11111111, // Used for detect option
|
||||
} FFLocalIpIpv6Type;
|
||||
static_assert(sizeof(FFLocalIpIpv6Type) == sizeof(uint8_t), "");
|
||||
|
||||
typedef struct FFLocalIpOptions
|
||||
{
|
||||
FFModuleArgs moduleArgs;
|
||||
|
||||
FFLocalIpType showType;
|
||||
FFLocalIpIpv6Type ipv6Type;
|
||||
FFstrbuf namePrefix;
|
||||
} FFLocalIpOptions;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user