From 4d1fc9ceb12603fb8d735a0bed8763f99659c8fc Mon Sep 17 00:00:00 2001 From: Carter Li Date: Mon, 25 Mar 2024 15:04:24 +0800 Subject: [PATCH 01/17] Packaging: update debian stuff --- debian/changelog | 6 ++++++ debian/files | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 8515ae964..6c560750f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +fastfetch (2.8.10) jammy; urgency=medium + + * Update to 2.8.10 + + -- Carter Li Mon, 25 Mar 2024 15:01:53 +0800 + fastfetch (2.8.9) jammy; urgency=medium * Update to 2.8.9 diff --git a/debian/files b/debian/files index b621bfa1f..655eaefe5 100644 --- a/debian/files +++ b/debian/files @@ -1 +1 @@ -fastfetch_2.8.9_source.buildinfo universe/utils optional +fastfetch_2.8.10_source.buildinfo universe/utils optional From a9aab5176480d6a732cb3bbf46c38cd31fb9c68a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 25 Mar 2024 16:36:30 +0800 Subject: [PATCH 02/17] Doc: update changelog [ci skip] --- CHANGELOG.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c534c9c2..0b1d79f25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,5 @@ # 2.8.10 -Changes: -* Use MS-DOS device name as mountFrom result, instead of useless GUID volume name (Windows, Disk) -* Some adjustments to Terminal detection (Terminal, Windows) - * Don't pretty print CMD - * Print conhost as Windows Console - * Don't detect `wininit` as Terminal - Bugfixes: * Don't display 0.00 GHz (CPU, FreeBSD) * Don't detect manufactor of Qualcomm as ARM (CPU, Android) @@ -17,6 +10,11 @@ Bugfixes: Features: * Improve stability; print more useful error message; avoid misuse (PublicIP / Weather) +* Use MS-DOS device name as mountFrom result, instead of useless GUID volume name (Windows, Disk) +* Some adjustments to Terminal detection (Terminal, Windows) + * Don't pretty print CMD + * Print conhost as Windows Console + * Don't detect `wininit` as Terminal Logo: * Fix color of Arco Linux From ffac35436816508bf12bd65c42f5da01d5993190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 26 Mar 2024 08:42:48 +0000 Subject: [PATCH 03/17] Terminal (Linux): support Lxterminal version detection --- CHANGELOG.md | 5 +++++ src/detection/terminalshell/terminalshell.c | 13 ++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b1d79f25..9186935cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# 2.8.11 + +Features: +* Support Lxterminal version detection + # 2.8.10 Bugfixes: diff --git a/src/detection/terminalshell/terminalshell.c b/src/detection/terminalshell/terminalshell.c index 8fc56d34b..d2df1137b 100644 --- a/src/detection/terminalshell/terminalshell.c +++ b/src/detection/terminalshell/terminalshell.c @@ -400,6 +400,14 @@ FF_MAYBE_UNUSED static bool getTerminalVersionSt(FF_MAYBE_UNUSED FFstrbuf* exe, return version->length > 0; } +FF_MAYBE_UNUSED static bool getTerminalVersionLxterminal(FFstrbuf* exe, FFstrbuf* version) +{ + if(!getExeVersionRaw(exe, version)) return false; + // lxterminal 0.3.2 + ffStrbufSubstrAfterFirstC(version, ' '); + return version->length > 0; +} + static bool getTerminalVersionContour(FFstrbuf* exe, FFstrbuf* version) { const char* env = getenv("TERMINAL_VERSION_STRING"); @@ -410,7 +418,7 @@ static bool getTerminalVersionContour(FFstrbuf* exe, FFstrbuf* version) } if(!getExeVersionRaw(exe, version)) return false; // Contour Terminal Emulator 0.3.12.262 - ffStrbufSubstrAfterFirstC(version, ' '); + ffStrbufSubstrAfterLastC(version, ' '); return version->length > 0; } @@ -525,6 +533,9 @@ bool fftsGetTerminalVersion(FFstrbuf* processName, FF_MAYBE_UNUSED FFstrbuf* exe if(ffStrbufIgnCaseEqualS(processName, "st")) return getTerminalVersionSt(exe, version); + if(ffStrbufIgnCaseEqualS(processName, "lxterminal")) + return getTerminalVersionLxterminal(exe, version); + if(ffStrbufIgnCaseEqualS(processName, "urxvt") || ffStrbufIgnCaseEqualS(processName, "urxvtd") || ffStrbufIgnCaseEqualS(processName, "rxvt") || From 9b21ec6e1fafa6ebdabb28aa684d65b4b364043a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 28 Mar 2024 03:12:46 +0000 Subject: [PATCH 04/17] Terminal (Linux): support weston-terminal version detection --- src/detection/terminalshell/terminalshell.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/detection/terminalshell/terminalshell.c b/src/detection/terminalshell/terminalshell.c index d2df1137b..40f5129d3 100644 --- a/src/detection/terminalshell/terminalshell.c +++ b/src/detection/terminalshell/terminalshell.c @@ -408,6 +408,21 @@ FF_MAYBE_UNUSED static bool getTerminalVersionLxterminal(FFstrbuf* exe, FFstrbuf return version->length > 0; } +FF_MAYBE_UNUSED static bool getTerminalVersionWeston(FF_MAYBE_UNUSED FFstrbuf* exe, FFstrbuf* version) +{ + // weston-terminal doesn't report a version, use weston version instead + if(ffProcessAppendStdOut(version, (char* const[]){ + "weston", + "--version", + NULL + })) return false; + + //weston 8.0.0 + ffStrbufSubstrAfterFirstC(version, ' '); + + return version->length > 0; +} + static bool getTerminalVersionContour(FFstrbuf* exe, FFstrbuf* version) { const char* env = getenv("TERMINAL_VERSION_STRING"); @@ -536,6 +551,9 @@ bool fftsGetTerminalVersion(FFstrbuf* processName, FF_MAYBE_UNUSED FFstrbuf* exe if(ffStrbufIgnCaseEqualS(processName, "lxterminal")) return getTerminalVersionLxterminal(exe, version); + if(ffStrbufIgnCaseEqualS(processName, "weston-terminal")) + return getTerminalVersionWeston(exe, version); + if(ffStrbufIgnCaseEqualS(processName, "urxvt") || ffStrbufIgnCaseEqualS(processName, "urxvtd") || ffStrbufIgnCaseEqualS(processName, "rxvt") || From bb97893bd09ac82cb6809cd57c2db9eede178c0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 29 Mar 2024 14:36:11 +0800 Subject: [PATCH 05/17] Doc: update changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9186935cc..a96d23252 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ # 2.8.11 Features: -* Support Lxterminal version detection +* Support Lxterminal version detection (Terminal, Linux) +* Support weston-terminal version and font detection (TerminalFont, Linux) # 2.8.10 From 43b96df1121758a32b82a8e6de7dc6524dc1425e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 2 Apr 2024 14:28:25 +0800 Subject: [PATCH 06/17] Version: detect apple clang --- src/detection/version/version.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/detection/version/version.c b/src/detection/version/version.c index 202c10ca2..3bb4f2f8a 100644 --- a/src/detection/version/version.c +++ b/src/detection/version/version.c @@ -32,7 +32,21 @@ void ffDetectVersion(FFVersionResult* version) version->cmakeBuiltType = FASTFETCH_PROJECT_CMAKE_BUILD_TYPE; version->compileTime = __DATE__ ", " __TIME__; #ifdef __clang__ - version->compiler = "clang " FF_STR(__clang_major__) "." FF_STR(__clang_minor__) "." FF_STR(__clang_patchlevel__); + version->compiler = + #ifdef _MSC_VER + "clang-cl " ; + #elif defined(__APPLE__) && defined(__apple_build_version__) + "Apple clang " + #else + "clang " + #endif + + FF_STR(__clang_major__) "." FF_STR(__clang_minor__) "." FF_STR(__clang_patchlevel__) + + #if defined(__APPLE__) && defined(__apple_build_version__) + " (" FF_STR(__apple_build_version__) ")" + #endif + ; #elif defined(__GNUC__) version->compiler = "gcc " FF_STR(__GNUC__) "." FF_STR(__GNUC_MINOR__) "." FF_STR(__GNUC_PATCHLEVEL__); #elif defined(_MSC_VER) From 898859cc7aa6228275bd76d032acd96b1f4f9606 Mon Sep 17 00:00:00 2001 From: kojq <106934605+kojq@users.noreply.github.com> Date: Tue, 2 Apr 2024 10:36:20 -0400 Subject: [PATCH 07/17] Flashfetch: add the skipped "host" option from "Flashfetch: simplify implementation" (#770) --- src/flashfetch.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/flashfetch.c b/src/flashfetch.c index 3ec690bdb..2ec8f21bb 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -21,6 +21,7 @@ int main(void) &options->title, &options->separator, &options->os, + &options->host, &options->kernel, &options->uptime, &options->packages, From 4430b7145ebca48a6607133ebf58f3d8a7285211 Mon Sep 17 00:00:00 2001 From: apocelipes Date: Wed, 3 Apr 2024 20:02:38 +0800 Subject: [PATCH 08/17] fastfetch: add the missing new-line in config files (#772) --- src/fastfetch.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/fastfetch.c b/src/fastfetch.c index 0109c2717..20f316d0e 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -821,6 +821,7 @@ static void run(FFdata* data) if (instance.state.resultDoc) { yyjson_mut_write_fp(stdout, instance.state.resultDoc, YYJSON_WRITE_INF_AND_NAN_AS_NULL | YYJSON_WRITE_PRETTY_TWO_SPACES, NULL, NULL); + //TODO should use YYJSON_WRITE_NEWLINE_AT_END when it is available putchar('\n'); } else @@ -840,24 +841,23 @@ static void writeConfigFile(FFdata* data, const FFstrbuf* filename) ffOptionsGenerateLibraryJsonConfig(&instance.config.library, doc); ffMigrateCommandOptionToJsonc(data, doc); - if (ffStrbufEqualS(filename, "-")) - yyjson_mut_write_fp(stdout, doc, YYJSON_WRITE_INF_AND_NAN_AS_NULL | YYJSON_WRITE_PRETTY_TWO_SPACES, NULL, NULL); - else + FILE *fp = stdout; + bool writeToStdout = ffStrbufEqualS(filename, "-"); + if (!writeToStdout) + fp = fopen(filename->chars, "w"); + + bool ok = yyjson_mut_write_fp(fp, doc, YYJSON_WRITE_INF_AND_NAN_AS_NULL | YYJSON_WRITE_PRETTY_TWO_SPACES, NULL, NULL); + //TODO should use YYJSON_WRITE_NEWLINE_AT_END when it is available + fputc('\n', fp); + if (!ok) { - size_t len; - FF_AUTO_FREE const char* str = yyjson_mut_write(doc, YYJSON_WRITE_INF_AND_NAN_AS_NULL | YYJSON_WRITE_PRETTY_TWO_SPACES, &len); - if (!str) - { - printf("Error: failed to generate config file\n"); - exit(1); - } - if (ffWriteFileData(filename->chars, len, str)) - printf("The generated config file has been written in `%s`\n", filename->chars); - else - { - printf("Error: failed to write file in `%s`\n", filename->chars); - exit(1); - } + fprintf(stderr, "Error: failed to generate config in `%s`\n", writeToStdout ? "stdout" : filename->chars); + exit(1); + } + if (ok && !writeToStdout) + { + fclose(fp); + printf("The generated config file has been written in `%s`\n", filename->chars); } yyjson_mut_doc_free(doc); From 77431671bba220f3d3439a01628d0dce62a1a537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 3 Apr 2024 21:08:33 +0800 Subject: [PATCH 09/17] Packages (Linux): add `am` support Fix: #771 --- src/detection/packages/packages.h | 1 + src/detection/packages/packages_linux.c | 38 +++++++++++++++++++++++++ src/modules/packages/option.h | 1 + src/modules/packages/packages.c | 11 +++++-- 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/detection/packages/packages.h b/src/detection/packages/packages.h index 88df483b4..87c497ce0 100644 --- a/src/detection/packages/packages.h +++ b/src/detection/packages/packages.h @@ -4,6 +4,7 @@ typedef struct FFPackagesResult { + uint32_t am; uint32_t apk; uint32_t brew; uint32_t brewCask; diff --git a/src/detection/packages/packages_linux.c b/src/detection/packages/packages_linux.c index 194330fa5..9f5b3c307 100644 --- a/src/detection/packages/packages_linux.c +++ b/src/detection/packages/packages_linux.c @@ -253,6 +253,43 @@ static uint32_t getRpmFromLibrpm(void) #endif //FF_HAVE_RPM +static uint32_t getAM(FFstrbuf* baseDir) +{ + // #771 + uint32_t baseDirLength = baseDir->length; + + ffStrbufAppendS(baseDir, "/opt"); + uint32_t optDirLength = baseDir->length; + + uint32_t result = 0; + + ffStrbufAppendS(baseDir, "/am/APP-MANAGER"); + if (ffPathExists(baseDir->chars, FF_PATHTYPE_FILE)) + { + ++result; // `am` itself is counted as a package too + ffStrbufSubstrBefore(baseDir, optDirLength); + FF_AUTO_CLOSE_DIR DIR* dirp = opendir(baseDir->chars); + if(dirp) + { + struct dirent *entry; + while ((entry = readdir(dirp)) != NULL) + { + if (entry->d_name[0] == '.') continue; + if (entry->d_type == DT_DIR) + { + ffStrbufAppendF(baseDir, "/%s/AM-updater", entry->d_name); + if (ffPathExists(baseDir->chars, FF_PATHTYPE_FILE)) + ++result; + ffStrbufSubstrBefore(baseDir, optDirLength); + } + } + } + } + + ffStrbufSubstrBefore(baseDir, baseDirLength); + return result; +} + static void getPackageCounts(FFstrbuf* baseDir, FFPackagesResult* packageCounts, FFPackagesOptions* options) { if (!(options->disabled & FF_PACKAGES_FLAG_APK_BIT)) packageCounts->apk += getNumStrings(baseDir, "/lib/apk/db/installed", "C:Q"); @@ -277,6 +314,7 @@ static void getPackageCounts(FFstrbuf* baseDir, FFPackagesResult* packageCounts, } if (!(options->disabled & FF_PACKAGES_FLAG_PALUDIS_BIT)) packageCounts->paludis += countFilesRecursive(baseDir, "/var/db/paludis/repositories", "environment.bz2"); if (!(options->disabled & FF_PACKAGES_FLAG_OPKG_BIT)) packageCounts->opkg += getNumStrings(baseDir, "/usr/lib/opkg/status", "Package:"); // openwrt + if (!(options->disabled & FF_PACKAGES_FLAG_AM_BIT)) packageCounts->am = getAM(baseDir); } static void getPackageCountsRegular(FFstrbuf* baseDir, FFPackagesResult* packageCounts, FFPackagesOptions* options) diff --git a/src/modules/packages/option.h b/src/modules/packages/option.h index 81b5a01b7..315ff0dc3 100644 --- a/src/modules/packages/option.h +++ b/src/modules/packages/option.h @@ -26,6 +26,7 @@ typedef enum FFPackagesFlags FF_PACKAGES_FLAG_SNAP_BIT = 1 << 16, FF_PACKAGES_FLAG_WINGET_BIT = 1 << 17, FF_PACKAGES_FLAG_XBPS_BIT = 1 << 18, + FF_PACKAGES_FLAG_AM_BIT = 1 << 19, } FFPackagesFlags; typedef struct FFPackagesOptions diff --git a/src/modules/packages/packages.c b/src/modules/packages/packages.c index b81cd3b2c..9107624de 100644 --- a/src/modules/packages/packages.c +++ b/src/modules/packages/packages.c @@ -4,7 +4,7 @@ #include "modules/packages/packages.h" #include "util/stringUtils.h" -#define FF_PACKAGES_NUM_FORMAT_ARGS 25 +#define FF_PACKAGES_NUM_FORMAT_ARGS 26 void ffPrintPackages(FFPackagesOptions* options) { @@ -64,6 +64,7 @@ void ffPrintPackages(FFPackagesOptions* options) FF_PRINT_PACKAGE(paludis) FF_PRINT_PACKAGE(winget) FF_PRINT_PACKAGE(opkg) + FF_PRINT_PACKAGE(am) putchar('\n'); } @@ -95,6 +96,7 @@ void ffPrintPackages(FFPackagesOptions* options) {FF_FORMAT_ARG_TYPE_UINT, &counts.paludis}, {FF_FORMAT_ARG_TYPE_UINT, &counts.winget}, {FF_FORMAT_ARG_TYPE_UINT, &counts.opkg}, + {FF_FORMAT_ARG_TYPE_UINT, &counts.am}, })); } @@ -141,6 +143,7 @@ bool ffParsePackagesCommandOptions(FFPackagesOptions* options, const char* key, FF_TEST_PACKAGE_NAME(SNAP) FF_TEST_PACKAGE_NAME(WINGET) FF_TEST_PACKAGE_NAME(XBPS) + FF_TEST_PACKAGE_NAME(AM) #undef FF_TEST_PACKAGE_NAME if (end) @@ -210,6 +213,7 @@ void ffParsePackagesJsonObject(FFPackagesOptions* options, yyjson_val* module) FF_TEST_PACKAGE_NAME(SNAP) FF_TEST_PACKAGE_NAME(WINGET) FF_TEST_PACKAGE_NAME(XBPS) + FF_TEST_PACKAGE_NAME(AM) #undef FF_TEST_PACKAGE_NAME } } @@ -250,6 +254,7 @@ void ffGeneratePackagesJsonConfig(FFPackagesOptions* options, yyjson_mut_doc* do FF_TEST_PACKAGE_NAME(SNAP) FF_TEST_PACKAGE_NAME(WINGET) FF_TEST_PACKAGE_NAME(XBPS) + FF_TEST_PACKAGE_NAME(AM) #undef FF_TEST_PACKAGE_NAME } } @@ -295,6 +300,7 @@ void ffGeneratePackagesJsonResult(FF_MAYBE_UNUSED FFPackagesOptions* options, yy FF_APPEND_PACKAGE_COUNT(winget) FF_APPEND_PACKAGE_COUNT(xbps) FF_APPEND_PACKAGE_COUNT(opkg) + FF_APPEND_PACKAGE_COUNT(am) yyjson_mut_obj_add_strbuf(doc, obj, "pacmanBranch", &counts.pacmanBranch); } @@ -325,7 +331,8 @@ void ffPrintPackagesHelpFormat(void) "Number of pkgtool packages", "Number of paludis packages", "Number of winget packages", - "Number of opkg packages" + "Number of opkg packages", + "Number of am packages", })); } From de6b1f954266bf557d9197e0c5e162a01c38b8b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 4 Apr 2024 10:08:26 +0800 Subject: [PATCH 10/17] LocalIP (Linux): fix network prefix detection when the value is greater than 24 --- src/detection/localip/localip_linux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index afc97e28d..b1d64df3d 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -84,7 +84,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) inet_ntop(AF_INET, &ipv4->sin_addr, addressBuffer, INET_ADDRSTRLEN); struct sockaddr_in* netmask = (struct sockaddr_in*) ifa->ifa_netmask; - int cidr = __builtin_popcount(inet_netof(netmask->sin_addr)); + int cidr = __builtin_popcount(netmask->sin_addr.s_addr); if (cidr != 0) { size_t len = strlen(addressBuffer); From a6cb30d6c822ba4e6ad0bc09aca4f9f9ce5de2a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 4 Apr 2024 10:09:06 +0800 Subject: [PATCH 11/17] LocalIP: print all IPs if multiple IPs are assigned to the same interface --- src/detection/localip/localip_linux.c | 6 ++++-- src/detection/localip/localip_windows.c | 10 ++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index b1d64df3d..a1b3cc3ed 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -40,10 +40,12 @@ static void addNewIp(FFlist* list, const char* name, const char* addr, int type, switch (type) { case AF_INET: - ffStrbufSetS(&ip->ipv4, addr); + if (ip->ipv4.length) ffStrbufAppendC(&ip->ipv4, ','); + ffStrbufAppendS(&ip->ipv4, addr); break; case AF_INET6: - ffStrbufSetS(&ip->ipv6, addr); + if (ip->ipv6.length) ffStrbufAppendC(&ip->ipv6, ','); + ffStrbufAppendS(&ip->ipv6, addr); break; case -1: ffStrbufSetS(&ip->mac, addr); diff --git a/src/detection/localip/localip_windows.c b/src/detection/localip/localip_windows.c index 3bbdddd8b..6e7af5661 100644 --- a/src/detection/localip/localip_windows.c +++ b/src/detection/localip/localip_windows.c @@ -6,7 +6,7 @@ #include "util/windows/unicode.h" #include "localip.h" -static void addNewIp(FFlist* list, const char* name, const char* value, int type, bool newIp, bool defaultRoute) +static void addNewIp(FFlist* list, const char* name, const char* addr, int type, bool newIp, bool defaultRoute) { FFLocalIpResult* ip = NULL; @@ -27,13 +27,15 @@ static void addNewIp(FFlist* list, const char* name, const char* value, int type switch (type) { case AF_INET: - ffStrbufSetS(&ip->ipv4, value); + if (ip->ipv4.length) ffStrbufAppendC(&ip->ipv4, ','); + ffStrbufAppendS(&ip->ipv4, addr); break; case AF_INET6: - ffStrbufSetS(&ip->ipv6, value); + if (ip->ipv6.length) ffStrbufAppendC(&ip->ipv6, ','); + ffStrbufAppendS(&ip->ipv6, addr); break; case -1: - ffStrbufSetS(&ip->mac, value); + ffStrbufSetS(&ip->mac, addr); break; } } From 3a2786a89f8110b9ffefeaf805554bf9903de873 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 4 Apr 2024 10:15:19 +0800 Subject: [PATCH 12/17] LocalIP: support network prefix detection for IPv6 --- src/detection/localip/localip_linux.c | 13 ++++++++++++- src/detection/localip/localip_windows.c | 9 ++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index a1b3cc3ed..e5ade13a3 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -101,8 +101,19 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) continue; struct sockaddr_in6* ipv6 = (struct sockaddr_in6 *)ifa->ifa_addr; - char addressBuffer[INET6_ADDRSTRLEN]; + char addressBuffer[INET6_ADDRSTRLEN + 4]; inet_ntop(AF_INET6, &ipv6->sin6_addr, addressBuffer, INET6_ADDRSTRLEN); + + struct sockaddr_in6* netmask = (struct sockaddr_in6*) ifa->ifa_netmask; + int cidr = 0; + for (uint32_t i = 0; i < sizeof(netmask->sin6_addr.s6_addr32) / sizeof(netmask->sin6_addr.s6_addr32[0]); ++i) + cidr += __builtin_popcount(netmask->sin6_addr.s6_addr32[i]); + if (cidr != 0) + { + size_t len = strlen(addressBuffer); + snprintf(addressBuffer + len, 4, "/%d", cidr); + } + addNewIp(results, ifa->ifa_name, addressBuffer, AF_INET6, isDefaultRoute); } #if defined(__FreeBSD__) || defined(__APPLE__) diff --git a/src/detection/localip/localip_windows.c b/src/detection/localip/localip_windows.c index 6e7af5661..f64e8c300 100644 --- a/src/detection/localip/localip_windows.c +++ b/src/detection/localip/localip_windows.c @@ -122,8 +122,15 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) else if (ifa->Address.lpSockaddr->sa_family == AF_INET6) { SOCKADDR_IN6* ipv6 = (SOCKADDR_IN6*) ifa->Address.lpSockaddr; - char addressBuffer[INET6_ADDRSTRLEN]; + char addressBuffer[INET6_ADDRSTRLEN + 4]; inet_ntop(AF_INET6, &ipv6->sin6_addr, addressBuffer, INET6_ADDRSTRLEN); + + if (ifa->OnLinkPrefixLength) + { + size_t len = strlen(addressBuffer); + snprintf(addressBuffer + len, 4, "/%u", (unsigned) ifa->OnLinkPrefixLength); + } + addNewIp(results, name, addressBuffer, AF_INET6, newIp, isDefaultRoute); newIp = false; } From a2d99695fd6a3cdab8f64c70bbdbf5dcde948186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 4 Apr 2024 10:42:44 +0800 Subject: [PATCH 13/17] LocalIP: add new option `localip-show-prefix-len` --- doc/json_schema.json | 5 +++++ src/data/help.json | 9 ++++++++ src/detection/localip/localip_linux.c | 30 +++++++++++++++---------- src/detection/localip/localip_windows.c | 4 ++-- src/modules/localip/localip.c | 23 ++++++++++++++++++- src/modules/localip/option.h | 11 ++++----- 6 files changed, 62 insertions(+), 20 deletions(-) diff --git a/doc/json_schema.json b/doc/json_schema.json index bc436f26c..363497e30 100644 --- a/doc/json_schema.json +++ b/doc/json_schema.json @@ -1438,6 +1438,11 @@ "type": "boolean", "default": false }, + "showPrefixLen": { + "description": "Show network prefix length (/N)", + "type": "boolean", + "default": true + }, "compact": { "description": "Show all IPs in one line", "type": "boolean", diff --git a/src/data/help.json b/src/data/help.json index 621d2d71e..b50980800 100644 --- a/src/data/help.json +++ b/src/data/help.json @@ -1261,6 +1261,15 @@ "default": false } }, + { + "long": "localip-show-prefix-len", + "desc": "Show network prefix length (/N) in local ip module", + "arg": { + "type": "bool", + "optional": true, + "default": true + } + }, { "long": "localip-name-prefix", "desc": "Show interfaces with given interface name prefix only", diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index e5ade13a3..92b803bb0 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -85,12 +85,15 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) char addressBuffer[INET_ADDRSTRLEN + 4]; inet_ntop(AF_INET, &ipv4->sin_addr, addressBuffer, INET_ADDRSTRLEN); - struct sockaddr_in* netmask = (struct sockaddr_in*) ifa->ifa_netmask; - int cidr = __builtin_popcount(netmask->sin_addr.s_addr); - if (cidr != 0) + if (options->showType & FF_LOCALIP_TYPE_PREFIX_LEN_BIT) { - size_t len = strlen(addressBuffer); - snprintf(addressBuffer + len, 4, "/%d", cidr); + struct sockaddr_in* netmask = (struct sockaddr_in*) ifa->ifa_netmask; + int cidr = __builtin_popcount(netmask->sin_addr.s_addr); + if (cidr != 0) + { + size_t len = strlen(addressBuffer); + snprintf(addressBuffer + len, 4, "/%d", cidr); + } } addNewIp(results, ifa->ifa_name, addressBuffer, AF_INET, isDefaultRoute); @@ -104,14 +107,17 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) char addressBuffer[INET6_ADDRSTRLEN + 4]; inet_ntop(AF_INET6, &ipv6->sin6_addr, addressBuffer, INET6_ADDRSTRLEN); - struct sockaddr_in6* netmask = (struct sockaddr_in6*) ifa->ifa_netmask; - int cidr = 0; - for (uint32_t i = 0; i < sizeof(netmask->sin6_addr.s6_addr32) / sizeof(netmask->sin6_addr.s6_addr32[0]); ++i) - cidr += __builtin_popcount(netmask->sin6_addr.s6_addr32[i]); - if (cidr != 0) + if (options->showType & FF_LOCALIP_TYPE_PREFIX_LEN_BIT) { - size_t len = strlen(addressBuffer); - snprintf(addressBuffer + len, 4, "/%d", cidr); + struct sockaddr_in6* netmask = (struct sockaddr_in6*) ifa->ifa_netmask; + int cidr = 0; + for (uint32_t i = 0; i < sizeof(netmask->sin6_addr.s6_addr32) / sizeof(netmask->sin6_addr.s6_addr32[0]); ++i) + cidr += __builtin_popcount(netmask->sin6_addr.s6_addr32[i]); + if (cidr != 0) + { + size_t len = strlen(addressBuffer); + snprintf(addressBuffer + len, 4, "/%d", cidr); + } } addNewIp(results, ifa->ifa_name, addressBuffer, AF_INET6, isDefaultRoute); diff --git a/src/detection/localip/localip_windows.c b/src/detection/localip/localip_windows.c index f64e8c300..96463c331 100644 --- a/src/detection/localip/localip_windows.c +++ b/src/detection/localip/localip_windows.c @@ -110,7 +110,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) char addressBuffer[INET_ADDRSTRLEN + 4]; inet_ntop(AF_INET, &ipv4->sin_addr, addressBuffer, INET_ADDRSTRLEN); - if (ifa->OnLinkPrefixLength) + if ((options->showType & FF_LOCALIP_TYPE_PREFIX_LEN_BIT) && ifa->OnLinkPrefixLength) { size_t len = strlen(addressBuffer); snprintf(addressBuffer + len, 4, "/%u", (unsigned) ifa->OnLinkPrefixLength); @@ -125,7 +125,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) char addressBuffer[INET6_ADDRSTRLEN + 4]; inet_ntop(AF_INET6, &ipv6->sin6_addr, addressBuffer, INET6_ADDRSTRLEN); - if (ifa->OnLinkPrefixLength) + if ((options->showType & FF_LOCALIP_TYPE_PREFIX_LEN_BIT) && ifa->OnLinkPrefixLength) { size_t len = strlen(addressBuffer); snprintf(addressBuffer + len, 4, "/%u", (unsigned) ifa->OnLinkPrefixLength); diff --git a/src/modules/localip/localip.c b/src/modules/localip/localip.c index 4541154e1..f301c7e9d 100644 --- a/src/modules/localip/localip.c +++ b/src/modules/localip/localip.c @@ -174,6 +174,15 @@ bool ffParseLocalIpCommandOptions(FFLocalIpOptions* options, const char* key, co return true; } + if (ffStrEqualsIgnCase(subKey, "show-prefix-len")) + { + if (ffOptionParseBoolean(value)) + options->showType |= FF_LOCALIP_TYPE_PREFIX_LEN_BIT; + else + options->showType &= ~FF_LOCALIP_TYPE_PREFIX_LEN_BIT; + return true; + } + if(ffStrEqualsIgnCase(subKey, "compact")) { if (ffOptionParseBoolean(value)) @@ -247,6 +256,15 @@ void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module) continue; } + if (ffStrEqualsIgnCase(key, "showPrefixLen")) + { + if (yyjson_get_bool(val)) + options->showType |= FF_LOCALIP_TYPE_PREFIX_LEN_BIT; + else + options->showType &= ~FF_LOCALIP_TYPE_PREFIX_LEN_BIT; + continue; + } + if (ffStrEqualsIgnCase(key, "compact")) { if (yyjson_get_bool(val)) @@ -293,6 +311,9 @@ void ffGenerateLocalIpJsonConfig(FFLocalIpOptions* options, yyjson_mut_doc* doc, if (options->showType & FF_LOCALIP_TYPE_LOOP_BIT) yyjson_mut_obj_add_bool(doc, module, "showLoop", true); + if (options->showType & FF_LOCALIP_TYPE_PREFIX_LEN_BIT) + yyjson_mut_obj_add_bool(doc, module, "showPrefixLen", true); + if (options->showType & FF_LOCALIP_TYPE_COMPACT_BIT) yyjson_mut_obj_add_bool(doc, module, "compact", true); } @@ -369,7 +390,7 @@ void ffInitLocalIpOptions(FFLocalIpOptions* options) ); ffOptionInitModuleArg(&options->moduleArgs); - options->showType = FF_LOCALIP_TYPE_IPV4_BIT; + options->showType = FF_LOCALIP_TYPE_IPV4_BIT | FF_LOCALIP_TYPE_PREFIX_LEN_BIT; ffStrbufInit(&options->namePrefix); options->defaultRouteOnly = #ifdef __ANDROID__ diff --git a/src/modules/localip/option.h b/src/modules/localip/option.h index e2bdda0e3..56092e98d 100644 --- a/src/modules/localip/option.h +++ b/src/modules/localip/option.h @@ -7,12 +7,13 @@ typedef enum FFLocalIpType { FF_LOCALIP_TYPE_NONE, - FF_LOCALIP_TYPE_LOOP_BIT = 1 << 0, - FF_LOCALIP_TYPE_IPV4_BIT = 1 << 1, - FF_LOCALIP_TYPE_IPV6_BIT = 1 << 2, - FF_LOCALIP_TYPE_MAC_BIT = 1 << 3, + FF_LOCALIP_TYPE_LOOP_BIT = 1 << 0, + FF_LOCALIP_TYPE_IPV4_BIT = 1 << 1, + FF_LOCALIP_TYPE_IPV6_BIT = 1 << 2, + FF_LOCALIP_TYPE_MAC_BIT = 1 << 3, + FF_LOCALIP_TYPE_PREFIX_LEN_BIT = 1 << 4, - FF_LOCALIP_TYPE_COMPACT_BIT = 1 << 10, + FF_LOCALIP_TYPE_COMPACT_BIT = 1 << 10, } FFLocalIpType; typedef struct FFLocalIpOptions From 82af7a5b52806d8e6ad6f9156cdd0d3aae25eb08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 4 Apr 2024 10:52:42 +0800 Subject: [PATCH 14/17] Doc: update changelog --- CHANGELOG.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a96d23252..e0a68e0aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,15 @@ -# 2.8.11 +# 2.9.0 Features: * Support Lxterminal version detection (Terminal, Linux) * Support weston-terminal version and font detection (TerminalFont, Linux) +* Support `am` package manager detection (#771, Packages, Linux) +* Support network prefix length detection for IPv6 (LocalIP) +* Display all IPs when multiple IPs are assigned to the same interface (LocalIP) +* Add option `--localip-show-prefix-len` to show network prefix length for both IPv4 and IPv6. Defaults to `true` (LocalIP) + +Bugfixes: +* Fix network prefix length detection when the value is greater than 24 (#773, LocalIP, Linux) # 2.8.10 From 8b7a4daeda38b7a4979d515113891516508f4bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 4 Apr 2024 11:09:28 +0800 Subject: [PATCH 15/17] TerminalFont: use system mono font if no config file is find --- CHANGELOG.md | 1 + src/detection/terminalfont/terminalfont_linux.c | 8 +------- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0a68e0aa..584f7cc0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Features: Bugfixes: * Fix network prefix length detection when the value is greater than 24 (#773, LocalIP, Linux) +* For xfce4-terminal, use system mono font if no config file is found (TerminalFont, Linux) # 2.8.10 diff --git a/src/detection/terminalfont/terminalfont_linux.c b/src/detection/terminalfont/terminalfont_linux.c index b843465cb..3a6ac9086 100644 --- a/src/detection/terminalfont/terminalfont_linux.c +++ b/src/detection/terminalfont/terminalfont_linux.c @@ -145,13 +145,7 @@ static void detectXFCETerminal(FFTerminalFontResult* terminalFont) }); } - if (!configFound) - { - ffStrbufSetStatic(&terminalFont->error, "Couldn't find xfce4/xfconf/xfce-perchannel-xml/xfce4-terminal.xml or xfce4/terminal/terminalrc"); - return; - } - - if(useSysFont.length == 0 || ffStrbufIgnCaseCompS(&useSysFont, "false") == 0) + if(configFound && (useSysFont.length == 0 || ffStrbufIgnCaseCompS(&useSysFont, "false") == 0)) { if(fontName.length == 0) ffStrbufAppendF(&terminalFont->error, "Couldn't find FontName in %s", path); From 39da11de8edf1e35f8b4ad4d46555181106ea230 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Thu, 4 Apr 2024 19:42:33 +0800 Subject: [PATCH 16/17] LocalIP (BSD): fix build --- src/detection/localip/localip_linux.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index 92b803bb0..905dec568 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -111,8 +111,9 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) { struct sockaddr_in6* netmask = (struct sockaddr_in6*) ifa->ifa_netmask; int cidr = 0; - for (uint32_t i = 0; i < sizeof(netmask->sin6_addr.s6_addr32) / sizeof(netmask->sin6_addr.s6_addr32[0]); ++i) - cidr += __builtin_popcount(netmask->sin6_addr.s6_addr32[i]); + static_assert(sizeof(netmask->sin6_addr) % sizeof(uint64_t) == 0, ""); + for (uint32_t i = 0; i < sizeof(netmask->sin6_addr) / sizeof(uint64_t); ++i) + cidr += __builtin_popcountll(((uint64_t*) &netmask->sin6_addr)[i]); if (cidr != 0) { size_t len = strlen(addressBuffer); From 69589f1ad59dd7e5bae19f240c0f5c2290b949df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 4 Apr 2024 12:22:52 +0800 Subject: [PATCH 17/17] Release: v2.9.0 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 64a87ad3d..6470145a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.12.0) # target_link_libraries with OBJECT libs & project homepage url project(fastfetch - VERSION 2.8.10 + VERSION 2.9.0 LANGUAGES C DESCRIPTION "Fast neofetch-like system information tool" HOMEPAGE_URL "https://github.com/fastfetch-cli/fastfetch"