From 586874080f2d73ad688fad28e72fd1e0919c641a Mon Sep 17 00:00:00 2001 From: Carter Li Date: Fri, 15 Mar 2024 10:51:09 +0800 Subject: [PATCH 01/23] 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 80ba492cb..8515ae964 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +fastfetch (2.8.9) jammy; urgency=medium + + * Update to 2.8.9 + + -- Carter Li Fri, 15 Mar 2024 10:49:42 +0800 + fastfetch (2.8.8) jammy; urgency=medium * Update to 2.8.8 diff --git a/debian/files b/debian/files index 094800a84..b621bfa1f 100644 --- a/debian/files +++ b/debian/files @@ -1 +1 @@ -fastfetch_2.8.8_source.buildinfo universe/utils optional +fastfetch_2.8.9_source.buildinfo universe/utils optional From 55ae3a7dbdff1332449d9b7917c05a6d1bc893b1 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Fri, 15 Mar 2024 11:15:23 +0800 Subject: [PATCH 02/23] CPU (FreeBSD): don't display 0.00 GHz --- src/detection/cpu/cpu_bsd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/detection/cpu/cpu_bsd.c b/src/detection/cpu/cpu_bsd.c index e1d647cd3..70623cbff 100644 --- a/src/detection/cpu/cpu_bsd.c +++ b/src/detection/cpu/cpu_bsd.c @@ -11,7 +11,8 @@ const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu) cpu->coresLogical = cpu->coresPhysical; cpu->coresOnline = cpu->coresPhysical; - cpu->frequencyBase = ffSysctlGetInt("hw.clockrate", 0) / 1000.0; + int clockRate = ffSysctlGetInt("hw.clockrate", 0); + cpu->frequencyBase = clockRate <= 0 ? 0.0/0.0 : clockRate / 1000.0; cpu->temperature = FF_CPU_TEMP_UNSET; if (options->temp) From 6c6d93370df183e9ed98cb7a81517441e5f771ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 15 Mar 2024 20:31:00 +0800 Subject: [PATCH 03/23] Logo: fix colors of arco linux Fix #759 --- src/logo/ascii/arco_small.txt | 2 +- src/logo/builtin.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/logo/ascii/arco_small.txt b/src/logo/ascii/arco_small.txt index cafcc5441..45da66921 100644 --- a/src/logo/ascii/arco_small.txt +++ b/src/logo/ascii/arco_small.txt @@ -1,4 +1,4 @@ -${c1} A + A ooo ooooo ooooooo diff --git a/src/logo/builtin.c b/src/logo/builtin.c index 45e61e8aa..2b06782c5 100644 --- a/src/logo/builtin.c +++ b/src/logo/builtin.c @@ -413,7 +413,7 @@ static const FFlogo A[] = { .lines = FASTFETCH_DATATEXT_LOGO_ARCO, .colors = { FF_COLOR_FG_BLUE, - FF_COLOR_FG_GREEN, + FF_COLOR_FG_WHITE, }, .colorKeys = FF_COLOR_FG_BLUE, .colorTitle = FF_COLOR_FG_BLUE, @@ -425,7 +425,7 @@ static const FFlogo A[] = { .lines = FASTFETCH_DATATEXT_LOGO_ARCO_SMALL, .colors = { FF_COLOR_FG_BLUE, - FF_COLOR_FG_GREEN, + FF_COLOR_FG_WHITE, }, .colorKeys = FF_COLOR_FG_BLUE, .colorTitle = FF_COLOR_FG_BLUE, From 553124ab5bed8011b4333cd8295b4df85357d735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sat, 16 Mar 2024 22:23:01 +0800 Subject: [PATCH 04/23] Presets: a new example Ref: #761 --- presets/examples/12.jsonc | 104 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 presets/examples/12.jsonc diff --git a/presets/examples/12.jsonc b/presets/examples/12.jsonc new file mode 100644 index 000000000..eca55ab7f --- /dev/null +++ b/presets/examples/12.jsonc @@ -0,0 +1,104 @@ +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json", + "logo": { + "type": "none" + }, + "display": { + "separator": "-> " + }, + "modules": [ + { + "type": "title", + "format": " {6}{7}{8}" + }, + "break", + { + "type": "custom", + "format": "┌───────────────────────────── \u001b[1mSystem Information\u001b[0m ─────────────────────────────┐" // `\u001b` is `\033`, or `\e` + }, + "break", + { + "key": "  OS ", + "keyColor": "red", + "type": "os" + }, + { + "key": "  Machine ", + "keyColor": "green", + "type": "host" + }, + { + "key": "  Kernel ", + "keyColor": "magenta", + "type": "kernel" + }, + { + "key": " 󰅐 Uptime ", + "keyColor": "red", + "type": "uptime" + }, + { + "key": " 󰍹 Resolution ", + "keyColor": "yellow", + "type": "display", + "compactType": "original-with-refresh-rate" + }, + { + "key": "  WM ", + "keyColor": "blue", + "type": "wm" + }, + { + "key": "  DE ", + "keyColor": "green", + "type": "de" + }, + { + "key": "  Shell ", + "keyColor": "cyan", + "type": "shell" + }, + { + "key": "  Terminal ", + "keyColor": "red", + "type": "terminal" + }, + { + "key": "  CPU ", + "keyColor": "yellow", + "type": "cpu" + }, + { + "key": " ﬙ GPU ", + "keyColor": "blue", + "type": "gpu" + }, + { + "key": " 󰑭 Memory ", + "keyColor": "magenta", + "type": "memory" + }, + { + "key": " 󰩟 Local IP ", + "keyColor": "red", + "type": "localip", + "compact": true + }, + { + "key": " 󰩠 Public IP ", + "keyColor": "cyan", + "type": "publicip" + }, + "break", + { + "type": "custom", + "format": "└──────────────────────────────────────────────────────────────────────────────┘" // `\u001b` is `\033`, or `\e` + }, + "break", + { + "type": "colors", + "paddingLeft": 34, + "symbol": "circle" + } + ] +} From f902e3b3d870023c3c9fb6428bf154adce902748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 17 Mar 2024 19:11:55 +0800 Subject: [PATCH 05/23] CPU (Android): don't detect manufactor of Qualcomm as ARM --- src/detection/cpu/cpu_linux.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/detection/cpu/cpu_linux.c b/src/detection/cpu/cpu_linux.c index 673f0cbdb..acce51ca8 100644 --- a/src/detection/cpu/cpu_linux.c +++ b/src/detection/cpu/cpu_linux.c @@ -17,7 +17,10 @@ static void detectAndroid(FFCPUResult* cpu) { if (cpu->name.length == 0) + { ffSettingsGetAndroidProperty("ro.soc.model", &cpu->name); + ffStrbufClear(&cpu->vendor); // We usually detect the vendor of CPU core as ARM, but instead we want the vendor of SOC + } if (cpu->vendor.length == 0) { if (!ffSettingsGetAndroidProperty("ro.soc.manufacturer", &cpu->vendor)) From 7c5eb021ee81e42a77b1eae73c9691e23cdd12ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 18 Mar 2024 09:02:09 +0800 Subject: [PATCH 06/23] Terminal (Linux): ignore `chezmoi` Fix #762 --- src/detection/terminalshell/terminalshell_linux.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/detection/terminalshell/terminalshell_linux.c b/src/detection/terminalshell/terminalshell_linux.c index fc29113f4..d62d7275e 100644 --- a/src/detection/terminalshell/terminalshell_linux.c +++ b/src/detection/terminalshell/terminalshell_linux.c @@ -280,6 +280,7 @@ static pid_t getTerminalInfo(FFTerminalResult* result, pid_t pid) ffStrEquals(name, "xonsh") || // works in Linux but not in macOS because kernel returns `Python` in this case ffStrEquals(name, "login") || ffStrEquals(name, "sshd") || + ffStrEquals(name, "chezmoi") || // #762 #ifdef __linux__ ffStrStartsWith(name, "flatpak-") || // #707 #endif From 66bef2fc196b1a5521d205938fd5d22c0c3a09ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 19 Mar 2024 15:21:23 +0800 Subject: [PATCH 07/23] Network: trim trailing white spaces --- src/detection/publicip/publicip.c | 1 + src/detection/weather/weather.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/detection/publicip/publicip.c b/src/detection/publicip/publicip.c index 4c1cdc42f..5475fdb4d 100644 --- a/src/detection/publicip/publicip.c +++ b/src/detection/publicip/publicip.c @@ -69,5 +69,6 @@ const char* ffDetectPublicIp(FFPublicIpOptions* options, FFPublicIpResult* resul ffStrbufDestroy(&result->ip); ffStrbufInitMove(&result->ip, &response); + ffStrbufTrimRightSpace(&result->ip); return NULL; } diff --git a/src/detection/weather/weather.c b/src/detection/weather/weather.c index 94bd6b5b6..544105a62 100644 --- a/src/detection/weather/weather.c +++ b/src/detection/weather/weather.c @@ -29,7 +29,11 @@ const char* ffDetectWeather(FFWeatherOptions* options, FFstrbuf* result) ffStrbufEnsureFree(result, 4095); bool success = ffNetworkingRecvHttpResponse(&state, result, options->timeout); - if (success) ffStrbufSubstrAfterFirstS(result, "\r\n\r\n"); + if (success) + { + ffStrbufSubstrAfterFirstS(result, "\r\n\r\n"); + ffStrbufTrimRightSpace(result); + } if(!success || result->length == 0) return "Failed to receive the server response"; From f73c3b85c2056f28a0eae854d3b68f46a56a0334 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 19 Mar 2024 16:02:39 +0800 Subject: [PATCH 08/23] Doc: update changelog --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5cb31dd9c..dc9d4c5e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +# 2.8.10 + +Bugfixes: +* Don't display 0.00 GHz (CPU, FreeBSD) +* Don't detect manufactor of Qualcomm as ARM (CPU, Android) +* Ignore `chezmoi` (Terminal, Linux) +* Trim trailing possible whitespaces (PublicIP) + +Logo: +* Fix color of Arco Linux + # 2.8.9 Bugfixes: From 85da30ccf532c15dd019d9d59eb1890e2953c17e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 20 Mar 2024 13:52:39 +0800 Subject: [PATCH 09/23] Networking: report detailed error messages; support `--thread false` for debugging --- src/common/networking.h | 12 ++------- src/common/networking_linux.c | 45 ++++++++++++++++++++----------- src/detection/publicip/publicip.c | 22 ++++++++------- src/detection/weather/weather.c | 21 ++++++++------- 4 files changed, 56 insertions(+), 44 deletions(-) diff --git a/src/common/networking.h b/src/common/networking.h index 1fb4589d9..2137705bb 100644 --- a/src/common/networking.h +++ b/src/common/networking.h @@ -22,13 +22,5 @@ typedef struct FFNetworkingState { #endif } FFNetworkingState; -bool ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, const char* path, const char* headers); -bool ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer, uint32_t timeout); - -static inline bool ffNetworkingGetHttp(const char* host, const char* path, uint32_t timeout, const char* headers, FFstrbuf* buffer) -{ - FFNetworkingState state; - if(ffNetworkingSendHttpRequest(&state, host, path, headers)) - return ffNetworkingRecvHttpResponse(&state, buffer, timeout); - return false; -} +const char* ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, const char* path, const char* headers); +const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer, uint32_t timeout); diff --git a/src/common/networking_linux.c b/src/common/networking_linux.c index 37c796276..46719363a 100644 --- a/src/common/networking_linux.c +++ b/src/common/networking_linux.c @@ -6,22 +6,25 @@ #include #include -static void connectAndSend(FFNetworkingState* state) +static const char* connectAndSend(FFNetworkingState* state) { - struct addrinfo hints = { - .ai_family = AF_INET, - .ai_socktype = SOCK_STREAM, - }; - + const char* ret = NULL; struct addrinfo* addr; - if(getaddrinfo(state->host.chars, "80", &hints, &addr) != 0) + if(getaddrinfo(state->host.chars, "80", &(struct addrinfo) { + .ai_family = AF_INET, + .ai_socktype = SOCK_STREAM, + }, &addr) != 0) + { + ret = "getaddrinfo() failed"; goto error; + } state->sockfd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); if(state->sockfd == -1) { freeaddrinfo(addr); + ret = "socket() failed"; goto error; } @@ -29,6 +32,7 @@ static void connectAndSend(FFNetworkingState* state) { close(state->sockfd); freeaddrinfo(addr); + ret = "connect() failed"; goto error; } @@ -37,6 +41,7 @@ static void connectAndSend(FFNetworkingState* state) if(send(state->sockfd, state->command.chars, state->command.length, 0) < 0) { close(state->sockfd); + ret = "send() failed"; goto error; } @@ -48,11 +53,13 @@ static void connectAndSend(FFNetworkingState* state) exit: ffStrbufDestroy(&state->host); ffStrbufDestroy(&state->command); + + return ret; } FF_THREAD_ENTRY_DECL_WRAPPER(connectAndSend, FFNetworkingState*); -bool ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, const char* path, const char* headers) +const char* ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, const char* path, const char* headers) { ffStrbufInitS(&state->host, host); @@ -66,22 +73,28 @@ bool ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, con ffStrbufAppendS(&state->command, "\r\n"); #ifdef FF_HAVE_THREADS + if (instance.config.general.multithreading) + { state->thread = ffThreadCreate(connectAndSendThreadMain, state); - return !!state->thread; - #else - connectAndSend(state); - return state->sockfd != -1; + return state->thread ? NULL : "ffThreadCreate(connectAndSend) failed"; + } #endif + + return connectAndSend(state); } -bool ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer, uint32_t timeout) +const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer, uint32_t timeout) { #ifdef FF_HAVE_THREADS + if (instance.config.general.multithreading) + { if (!ffThreadJoin(state->thread, timeout)) - return false; + return "ffThreadJoin() failed or timeout"; + } #endif + if(state->sockfd == -1) - return false; + return "ffNetworkingSendHttpRequest() failed"; if(timeout > 0) { @@ -100,5 +113,5 @@ bool ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer, ui } close(state->sockfd); - return ffStrbufStartsWithS(buffer, "HTTP/1.1 200 OK\r\n"); + return ffStrbufStartsWithS(buffer, "HTTP/1.1 200 OK\r\n") ? NULL : "Invalid response"; } diff --git a/src/detection/publicip/publicip.c b/src/detection/publicip/publicip.c index 5475fdb4d..8826dde04 100644 --- a/src/detection/publicip/publicip.c +++ b/src/detection/publicip/publicip.c @@ -1,12 +1,13 @@ #include "publicip.h" #include "common/networking.h" +#define FF_UNITIALIZED ((const char*)(uintptr_t) -1) static FFNetworkingState state; -static int status = -1; +static const char* status = FF_UNITIALIZED; void ffPreparePublicIp(FFPublicIpOptions* options) { - if (status != -1) + if (status != FF_UNITIALIZED) { fputs("Error: this module can only be used once due to internal limitations\n", stderr); exit(1); @@ -41,18 +42,21 @@ static inline void wrapYyjsonFree(yyjson_doc** doc) const char* ffDetectPublicIp(FFPublicIpOptions* options, FFPublicIpResult* result) { - if (status == -1) + if (status == FF_UNITIALIZED) ffPreparePublicIp(options); - if (status == 0) - return "Failed to connect to an IP detection server"; + if (status != NULL) + return status; FF_STRBUF_AUTO_DESTROY response = ffStrbufCreateA(4096); - bool success = ffNetworkingRecvHttpResponse(&state, &response, options->timeout); - if (success) ffStrbufSubstrAfterFirstS(&response, "\r\n\r\n"); + const char* error = ffNetworkingRecvHttpResponse(&state, &response, options->timeout); + if (error == NULL) + ffStrbufSubstrAfterFirstS(&response, "\r\n\r\n"); + else + return error; - if (!success || response.length == 0) - return "Failed to receive the server response"; + if (response.length == 0) + return "Empty server response received"; if (options->url.length == 0) { diff --git a/src/detection/weather/weather.c b/src/detection/weather/weather.c index 544105a62..9011bd04e 100644 --- a/src/detection/weather/weather.c +++ b/src/detection/weather/weather.c @@ -1,11 +1,12 @@ #include "weather.h" +#define FF_UNITIALIZED ((const char*)(uintptr_t) -1) static FFNetworkingState state; -static int status = -1; +static const char* status = FF_UNITIALIZED; void ffPrepareWeather(FFWeatherOptions* options) { - if (status != -1) + if (status != FF_UNITIALIZED) { fputs("Error: this module can only be used once due to internal limitations\n", stderr); exit(1); @@ -21,22 +22,24 @@ void ffPrepareWeather(FFWeatherOptions* options) const char* ffDetectWeather(FFWeatherOptions* options, FFstrbuf* result) { - if(status == -1) + if(status == FF_UNITIALIZED) ffPrepareWeather(options); - if(status == 0) - return "Failed to connect to 'wttr.in'"; + if(status != NULL) + return status; ffStrbufEnsureFree(result, 4095); - bool success = ffNetworkingRecvHttpResponse(&state, result, options->timeout); - if (success) + const char* error = ffNetworkingRecvHttpResponse(&state, result, options->timeout); + if (error == NULL) { ffStrbufSubstrAfterFirstS(result, "\r\n\r\n"); ffStrbufTrimRightSpace(result); } + else + return error; - if(!success || result->length == 0) - return "Failed to receive the server response"; + if(result->length == 0) + return "Empty server response received"; return NULL; } From 75927a87b2ea591fe5d59b1ee64784fb38f0e485 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 20 Mar 2024 14:25:59 +0800 Subject: [PATCH 10/23] Networking: add timeout support for TCP connecting --- src/common/networking.h | 4 +++- src/common/networking_linux.c | 20 +++++++++++++++++++- src/detection/publicip/publicip.c | 4 +++- src/detection/weather/weather.c | 4 +++- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/common/networking.h b/src/common/networking.h index 2137705bb..cc8285cc5 100644 --- a/src/common/networking.h +++ b/src/common/networking.h @@ -20,7 +20,9 @@ typedef struct FFNetworkingState { FFThreadType thread; #endif #endif + + uint32_t timeout; } FFNetworkingState; const char* ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, const char* path, const char* headers); -const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer, uint32_t timeout); +const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer); diff --git a/src/common/networking_linux.c b/src/common/networking_linux.c index 46719363a..67e03887d 100644 --- a/src/common/networking_linux.c +++ b/src/common/networking_linux.c @@ -5,6 +5,8 @@ #include #include #include +#include // For FreeBSD +#include static const char* connectAndSend(FFNetworkingState* state) { @@ -28,6 +30,20 @@ static const char* connectAndSend(FFNetworkingState* state) goto error; } + if (state->timeout > 0) + { + FF_MAYBE_UNUSED uint32_t sec = state->timeout / 1000; + if (sec == 0) sec = 1; + + #ifdef TCP_CONNECTIONTIMEOUT + setsockopt(state->sockfd, IPPROTO_TCP, TCP_CONNECTIONTIMEOUT, &sec, sizeof(sec)); + #elif defined(TCP_KEEPINIT) + setsockopt(state->sockfd, IPPROTO_TCP, TCP_KEEPINIT, &sec, sizeof(sec)); + #elif defined(TCP_USER_TIMEOUT) + setsockopt(state->sockfd, IPPROTO_TCP, TCP_USER_TIMEOUT, &state->timeout, sizeof(state->timeout)); + #endif + } + if(connect(state->sockfd, addr->ai_addr, addr->ai_addrlen) == -1) { close(state->sockfd); @@ -83,8 +99,10 @@ const char* ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* ho return connectAndSend(state); } -const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer, uint32_t timeout) +const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer) { + uint32_t timeout = state->timeout; + #ifdef FF_HAVE_THREADS if (instance.config.general.multithreading) { diff --git a/src/detection/publicip/publicip.c b/src/detection/publicip/publicip.c index 8826dde04..b2e1f641f 100644 --- a/src/detection/publicip/publicip.c +++ b/src/detection/publicip/publicip.c @@ -13,6 +13,8 @@ void ffPreparePublicIp(FFPublicIpOptions* options) exit(1); } + state.timeout = options->timeout; + if (options->url.length == 0) status = ffNetworkingSendHttpRequest(&state, "ipinfo.io", "/json", NULL); else @@ -49,7 +51,7 @@ const char* ffDetectPublicIp(FFPublicIpOptions* options, FFPublicIpResult* resul return status; FF_STRBUF_AUTO_DESTROY response = ffStrbufCreateA(4096); - const char* error = ffNetworkingRecvHttpResponse(&state, &response, options->timeout); + const char* error = ffNetworkingRecvHttpResponse(&state, &response); if (error == NULL) ffStrbufSubstrAfterFirstS(&response, "\r\n\r\n"); else diff --git a/src/detection/weather/weather.c b/src/detection/weather/weather.c index 9011bd04e..de3281348 100644 --- a/src/detection/weather/weather.c +++ b/src/detection/weather/weather.c @@ -12,6 +12,8 @@ void ffPrepareWeather(FFWeatherOptions* options) exit(1); } + state.timeout = options->timeout; + FF_STRBUF_AUTO_DESTROY path = ffStrbufCreateS("/"); if (options->location.length) ffStrbufAppend(&path, &options->location); @@ -29,7 +31,7 @@ const char* ffDetectWeather(FFWeatherOptions* options, FFstrbuf* result) return status; ffStrbufEnsureFree(result, 4095); - const char* error = ffNetworkingRecvHttpResponse(&state, result, options->timeout); + const char* error = ffNetworkingRecvHttpResponse(&state, result); if (error == NULL) { ffStrbufSubstrAfterFirstS(result, "\r\n\r\n"); From 44107f289e61b912121cfc73b17a3e92b8df6719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 20 Mar 2024 16:09:17 +0800 Subject: [PATCH 11/23] Network (Windows): fix compiling --- src/common/networking_windows.c | 54 +++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/src/common/networking_windows.c b/src/common/networking_windows.c index 739b27600..8c9bd96ea 100644 --- a/src/common/networking_windows.c +++ b/src/common/networking_windows.c @@ -33,21 +33,20 @@ static const char* initWsaData(WSADATA* wsaData) return NULL; } -bool ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, const char* path, const char* headers) +const char* ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, const char* path, const char* headers) { static WSADATA wsaData; if (wsaData.wVersion == 0) { - if (initWsaData(&wsaData) != NULL) + const char* error = initWsaData(&wsaData); + if (error != NULL) { wsaData.wVersion = (WORD) -1; - return false; + return error; } } else if (wsaData.wVersion == (WORD) -1) - return false; - - memset(state, 0, sizeof(*state)); + return "initWsaData() failed before"; struct addrinfo* addr; @@ -55,26 +54,27 @@ bool ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, con .ai_family = AF_INET, .ai_socktype = SOCK_STREAM, }, &addr) != 0) - return false; + return "getaddrinfo() failed"; state->sockfd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); if(state->sockfd == INVALID_SOCKET) { freeaddrinfo(addr); - return false; + return "socket() failed"; } { //ConnectEx requires the socket to be initially bound - struct sockaddr_in addr = { + if(bind(state->sockfd, (SOCKADDR *) &(struct sockaddr_in) { .sin_family = AF_INET, .sin_addr.s_addr = INADDR_ANY, .sin_port = 0, - }; - if(bind(state->sockfd, (SOCKADDR *)&addr, sizeof(addr)) != 0) + }, sizeof(struct sockaddr_in)) != 0) { - printf("bind %d\n", WSAGetLastError()); - return false; + closesocket(state->sockfd); + freeaddrinfo(addr); + state->sockfd = INVALID_SOCKET; + return "bind() failed"; } } @@ -93,25 +93,41 @@ bool ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, con if(!result && WSAGetLastError() != WSA_IO_PENDING) { closesocket(state->sockfd); - return false; + freeaddrinfo(addr); + state->sockfd = INVALID_SOCKET; + return "ConnectEx() failed"; } - return true; + return NULL; } -bool ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer, uint32_t timeout) +const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer) { + if (state->sockfd == INVALID_SOCKET) + return "ffNetworkingSendHttpRequest() failed"; + + uint32_t timeout = state->timeout; + if (timeout > 0) + { + if (WaitForSingleObject((HANDLE) state->sockfd, timeout) != WAIT_OBJECT_0) + { + CancelIo((HANDLE) state->sockfd); + closesocket(state->sockfd); + return "WaitForSingleObject(state->sockfd) failed or timeout"; + } + } + DWORD transfer, flags; if (!WSAGetOverlappedResult(state->sockfd, &state->overlapped, &transfer, TRUE, &flags)) { closesocket(state->sockfd); - return false; + return "WSAGetOverlappedResult() failed"; } if(timeout > 0) { //https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt - setsockopt(state->sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout)); + setsockopt(state->sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*) &timeout, sizeof(timeout)); } ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, (int)ffStrbufGetFree(buffer), 0); @@ -123,5 +139,5 @@ bool ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer, ui } closesocket(state->sockfd); - return ffStrbufStartsWithS(buffer, "HTTP/1.1 200 OK\r\n"); + return ffStrbufStartsWithS(buffer, "HTTP/1.1 200 OK\r\n") ? NULL : "Invalid response"; } From 79ae650c5874caead25144dd17588c8ef7bd178c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 21 Mar 2024 08:58:16 +0800 Subject: [PATCH 12/23] Networking: avoid short recv --- src/common/networking_linux.c | 11 ++++++----- src/common/networking_windows.c | 13 +++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/common/networking_linux.c b/src/common/networking_linux.c index 67e03887d..7a8054918 100644 --- a/src/common/networking_linux.c +++ b/src/common/networking_linux.c @@ -122,13 +122,14 @@ const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buf setsockopt(state->sockfd, SOL_SOCKET, SO_RCVTIMEO, &timev, sizeof(timev)); } - ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, ffStrbufGetFree(buffer), 0); - - if(received > 0) - { + uint32_t recvStart; + do { + recvStart = buffer->length; + ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, ffStrbufGetFree(buffer), 0); + if (received <= 0) break; buffer->length += (uint32_t) received; buffer->chars[buffer->length] = '\0'; - } + } while (ffStrbufGetFree(buffer) > 0 && strstr(buffer->chars + recvStart, "\r\n\r\n") == NULL); close(state->sockfd); return ffStrbufStartsWithS(buffer, "HTTP/1.1 200 OK\r\n") ? NULL : "Invalid response"; diff --git a/src/common/networking_windows.c b/src/common/networking_windows.c index 8c9bd96ea..27a884216 100644 --- a/src/common/networking_windows.c +++ b/src/common/networking_windows.c @@ -130,13 +130,14 @@ const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buf setsockopt(state->sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*) &timeout, sizeof(timeout)); } - ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, (int)ffStrbufGetFree(buffer), 0); - - if(received > 0) - { - buffer->length += (uint32_t) received; + uint32_t recvStart; + do { + recvStart = buffer->length; + ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, (int) ffStrbufGetFree(buffer), 0); + if (received <= 0) break; + buffer->length = recvStart + (uint32_t) received; buffer->chars[buffer->length] = '\0'; - } + } while (ffStrbufGetFree(buffer) > 0 && strstr(buffer->chars + recvStart, "\r\n\r\n") == NULL); closesocket(state->sockfd); return ffStrbufStartsWithS(buffer, "HTTP/1.1 200 OK\r\n") ? NULL : "Invalid response"; From 5e7baa9d0ab5c4185007effddf18b201107b25c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 21 Mar 2024 11:01:23 +0800 Subject: [PATCH 13/23] PublicIP: error out if non-http protocol is specified --- src/detection/publicip/publicip.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/detection/publicip/publicip.c b/src/detection/publicip/publicip.c index b2e1f641f..b5038e66e 100644 --- a/src/detection/publicip/publicip.c +++ b/src/detection/publicip/publicip.c @@ -20,7 +20,16 @@ void ffPreparePublicIp(FFPublicIpOptions* options) else { FF_STRBUF_AUTO_DESTROY host = ffStrbufCreateCopy(&options->url); - ffStrbufSubstrAfterFirstS(&host, "://"); + uint32_t hostStartIndex = ffStrbufFirstIndexS(&host, "://"); + if (hostStartIndex < host.length) + { + if (hostStartIndex != 4 || !ffStrbufStartsWithIgnCaseS(&host, "http")) + { + fputs("Error: only http: protocol is supported. Use `Command` module with `curl` if needed\n", stderr); + exit(1); + } + ffStrbufSubstrAfter(&host, hostStartIndex + (strlen("://") - 1)); + } uint32_t pathStartIndex = ffStrbufFirstIndexC(&host, '/'); FF_STRBUF_AUTO_DESTROY path = ffStrbufCreate(); From 6184b5ee9622b79bf5da44bcae646709d261fc98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 21 Mar 2024 11:04:53 +0800 Subject: [PATCH 14/23] Doc: update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc9d4c5e1..ebd509908 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ Bugfixes: * Ignore `chezmoi` (Terminal, Linux) * Trim trailing possible whitespaces (PublicIP) +Features: +* Improve stability; print more useful error message; avoid misuse (PublicIP / Weather) + Logo: * Fix color of Arco Linux From 588201fe4641d2f0aae5a19acf8094f04741dcee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 21 Mar 2024 16:10:08 +0800 Subject: [PATCH 15/23] Windows: update version.rc --- src/util/windows/version.rc | 66 ++++++++++++++----------------------- 1 file changed, 24 insertions(+), 42 deletions(-) diff --git a/src/util/windows/version.rc b/src/util/windows/version.rc index e130a65e9..789c0c103 100644 --- a/src/util/windows/version.rc +++ b/src/util/windows/version.rc @@ -1,54 +1,36 @@ -// -// Include the necessary resources -// +#ifdef RC_INVOKED + #include #include #include #include "fastfetch_config.h" -#ifdef RC_INVOKED - -// -// Set up debug information -// -#if DEBUG -#define VER_DEBUG VS_FF_DEBUG -#else -#define VER_DEBUG 0 -#endif - #define FF_TO_STR1(str) #str #define FF_TO_STR(str) FF_TO_STR1(str) CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "manifest.xml" -// ------- version info ------------------------------------------------------- - VS_VERSION_INFO VERSIONINFO -FILEVERSION FASTFETCH_PROJECT_VERSION_MAJOR,FASTFETCH_PROJECT_VERSION_MINOR,FASTFETCH_PROJECT_VERSION_PATCH,FASTFETCH_PROJECT_VERSION_TWEAK_NUM -PRODUCTVERSION FASTFETCH_PROJECT_VERSION_MAJOR,FASTFETCH_PROJECT_VERSION_MINOR,FASTFETCH_PROJECT_VERSION_PATCH,FASTFETCH_PROJECT_VERSION_TWEAK_NUM -FILEFLAGSMASK VS_FFI_FILEFLAGSMASK -FILEFLAGS (VER_DEBUG|VS_FF_PRERELEASE) -FILEOS VOS_NT -FILETYPE VFT_APP -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "Comments", FASTFETCH_PROJECT_HOMEPAGE_URL - VALUE "FileDescription", FF_TO_STR(FASTFETCH_TARGET_BINARY_NAME) " - " FASTFETCH_PROJECT_DESCRIPTION - VALUE "FileVersion", FASTFETCH_PROJECT_VERSION FASTFETCH_PROJECT_VERSION_TWEAK - VALUE "InternalName", FF_TO_STR(FASTFETCH_TARGET_BINARY_NAME) ".exe" - VALUE "LegalCopyright", FASTFETCH_PROJECT_LICENSE - VALUE "OriginalFilename", FF_TO_STR(FASTFETCH_TARGET_BINARY_NAME) ".exe" - VALUE "ProductName", FASTFETCH_PROJECT_NAME - VALUE "ProductVersion", FASTFETCH_PROJECT_VERSION FASTFETCH_PROJECT_VERSION_TWEAK - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0409,1252 - END -END + FILEVERSION FASTFETCH_PROJECT_VERSION_MAJOR,FASTFETCH_PROJECT_VERSION_MINOR,FASTFETCH_PROJECT_VERSION_PATCH,FASTFETCH_PROJECT_VERSION_TWEAK_NUM + PRODUCTVERSION FASTFETCH_PROJECT_VERSION_MAJOR,FASTFETCH_PROJECT_VERSION_MINOR,FASTFETCH_PROJECT_VERSION_PATCH,FASTFETCH_PROJECT_VERSION_TWEAK_NUM + FILEOS VOS_NT + FILETYPE VFT_APP +{ + BLOCK "StringFileInfo" { + BLOCK "040904b0" { + VALUE "Comments", FASTFETCH_PROJECT_DESCRIPTION + VALUE "FileDescription", FF_TO_STR(FASTFETCH_TARGET_BINARY_NAME) + VALUE "FileVersion", FASTFETCH_PROJECT_VERSION FASTFETCH_PROJECT_VERSION_TWEAK + VALUE "InternalName", FF_TO_STR(FASTFETCH_TARGET_BINARY_NAME) + VALUE "LegalCopyright", FASTFETCH_PROJECT_LICENSE + VALUE "OriginalFilename", FF_TO_STR(FASTFETCH_TARGET_BINARY_NAME) ".exe" + VALUE "ProductName", FASTFETCH_PROJECT_NAME " - " FASTFETCH_PROJECT_DESCRIPTION + VALUE "ProductVersion", FASTFETCH_PROJECT_VERSION FASTFETCH_PROJECT_VERSION_TWEAK + VALUE "CompanyName", FASTFETCH_PROJECT_HOMEPAGE_URL + } + } + BLOCK "VarFileInfo" { + VALUE "Translation", 0x0409, 1200 + } +} #endif From a6528cdfd685bf52719ee7df0789ac578b2b7385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 22 Mar 2024 08:48:24 +0800 Subject: [PATCH 16/23] Chore: simpify gitignore [ci skip] And make scc happy --- .gitignore | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 6a7a19529..9af64d1cd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,9 @@ -**/build/ -**/.vscode/ -**/.cache/ -**/.kdev4/ -**/.DS_Store -/.vs +build/ +.vs/ +.vscode/ +.cache/ +.kdev4/ +.DS_Store cscope.* tags fastfetch.kdev4 From 50da7cabd61c6c7e7930375de4920b93c41aea07 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Sat, 23 Mar 2024 17:30:13 +0800 Subject: [PATCH 17/23] GPU (Apple): always use metal to detect vmem --- src/detection/gpu/gpu_apple.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/detection/gpu/gpu_apple.c b/src/detection/gpu/gpu_apple.c index 6113dfce6..6bc0ee48e 100644 --- a/src/detection/gpu/gpu_apple.c +++ b/src/detection/gpu/gpu_apple.c @@ -63,10 +63,6 @@ const char* ffDetectGPUImpl(const FFGPUOptions* options, FFlist* gpus) ffStrbufInit(&gpu->driver); // Ok for both Apple and Intel ffCfDictGetString(properties, CFSTR("CFBundleIdentifier"), &gpu->driver); - int vram; // Supported on Intel - if(!ffCfDictGetInt(properties, CFSTR("VRAM,totalMB"), &vram)) - gpu->dedicated.total = (uint64_t) vram * 1024 * 1024; - if(ffCfDictGetInt(properties, CFSTR("gpu-core-count"), &gpu->coreCount)) // For Apple gpu->coreCount = FF_GPU_CORE_COUNT_UNSET; From 5c97c012a9b70abf71b2b7c9b5d77c3f7beb78b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 24 Mar 2024 18:32:50 +0800 Subject: [PATCH 18/23] Font (Linux): try fixing style detection --- src/common/font.c | 65 ++++++++++++++------------------------------- src/util/FFstrbuf.c | 5 ++-- src/util/FFstrbuf.h | 2 +- 3 files changed, 24 insertions(+), 48 deletions(-) diff --git a/src/common/font.c b/src/common/font.c index 2e89f1c69..80a67144c 100644 --- a/src/common/font.c +++ b/src/common/font.c @@ -2,6 +2,7 @@ #include "common/font.h" #include +#include void ffFontInit(FFfont* font) { @@ -66,59 +67,33 @@ void ffFontInitQt(FFfont* font, const char* data) //See https://doc.qt.io/qt-5/qfont.html#toString //Family - while(*data != ',' && *data != '\0') - { - ffStrbufAppendC(&font->name, *data); - ++data; - } - if(*data != '\0') - ++data; + data = ffStrbufAppendSUntilC(&font->name, data, ','); ffStrbufTrim(&font->name, ' '); + if (!data) goto exit; + data++; //Size - while(*data != ',' && *data != '\0') - { - ffStrbufAppendC(&font->size, *data); - ++data; - } - if(*data != '\0') - ++data; + data = ffStrbufAppendSUntilC(&font->size, data, ','); ffStrbufTrim(&font->size, ' '); - - #define FF_FONT_QT_SKIP_VALUE \ - while(*data != ',' && *data != '\0') \ - ++data; \ - if(*data != '\0') \ - ++data; - - FF_FONT_QT_SKIP_VALUE //Pixel size - FF_FONT_QT_SKIP_VALUE //Style hint - FF_FONT_QT_SKIP_VALUE //Font weight - FF_FONT_QT_SKIP_VALUE //Font style - FF_FONT_QT_SKIP_VALUE //Underline - FF_FONT_QT_SKIP_VALUE //Strike out - FF_FONT_QT_SKIP_VALUE //Fixed pitch - FF_FONT_QT_SKIP_VALUE //Always 0 - - #undef FF_FONT_QT_SKIP_VALUE - - while(*data != '\0') + if (!data) goto exit; + data++; + + //Style + data = strrchr(data, ','); + if (!data) goto exit; + data++; + if (isalpha(*data)) { - while(*data == ' ') - ++data; - - if(*data == '\0') - break; - - FFstrbuf* style = ffListAdd(&font->styles); - ffStrbufInit(style); - while(*data != ' ' && *data != '\0') + do { - ffStrbufAppendC(style, *data); - ++data; - } + FFstrbuf* style = ffListAdd(&font->styles); + ffStrbufInit(style); + data = ffStrbufAppendSUntilC(style, data, ' '); + if (data) data++; + } while (data); } +exit: fontInitPretty(font); } diff --git a/src/util/FFstrbuf.c b/src/util/FFstrbuf.c index d3c8bb8ec..5c045c190 100644 --- a/src/util/FFstrbuf.c +++ b/src/util/FFstrbuf.c @@ -159,16 +159,17 @@ void ffStrbufAppendVF(FFstrbuf* strbuf, const char* format, va_list arguments) strbuf->length += (uint32_t) written; } -void ffStrbufAppendSUntilC(FFstrbuf* strbuf, const char* value, char until) +const char* ffStrbufAppendSUntilC(FFstrbuf* strbuf, const char* value, char until) { if(value == NULL) - return; + return NULL; char* end = strchr(value, until); if(end == NULL) ffStrbufAppendS(strbuf, value); else ffStrbufAppendNS(strbuf, (uint32_t) (end - value), value); + return end; } void ffStrbufSetF(FFstrbuf* strbuf, const char* format, ...) diff --git a/src/util/FFstrbuf.h b/src/util/FFstrbuf.h index d26e1fff5..bf3550594 100644 --- a/src/util/FFstrbuf.h +++ b/src/util/FFstrbuf.h @@ -44,7 +44,7 @@ void ffStrbufAppendNS(FFstrbuf* strbuf, uint32_t length, const char* value); void ffStrbufAppendTransformS(FFstrbuf* strbuf, const char* value, int(*transformFunc)(int)); FF_C_PRINTF(2, 3) void ffStrbufAppendF(FFstrbuf* strbuf, const char* format, ...); void ffStrbufAppendVF(FFstrbuf* strbuf, const char* format, va_list arguments); -void ffStrbufAppendSUntilC(FFstrbuf* strbuf, const char* value, char until); +const char* ffStrbufAppendSUntilC(FFstrbuf* strbuf, const char* value, char until); void ffStrbufPrependNS(FFstrbuf* strbuf, uint32_t length, const char* value); From beb564f3743f996031e393d20495a519727c2b4b 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 09:11:23 +0800 Subject: [PATCH 19/23] CI: try fixing Windows build --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d6eb8d76c..94f3a74b7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -377,7 +377,7 @@ jobs: with: msystem: CLANG64 update: true - install: git mingw-w64-clang-x86_64-7zip mingw-w64-clang-x86_64-cmake mingw-w64-clang-x86_64-clang mingw-w64-clang-x86_64-vulkan-loader mingw-w64-clang-x86_64-opencl-icd + install: git mingw-w64-clang-x86_64-7zip mingw-w64-clang-x86_64-cmake mingw-w64-clang-x86_64-clang mingw-w64-clang-x86_64-vulkan-loader mingw-w64-clang-x86_64-vulkan-headers mingw-w64-clang-x86_64-opencl-icd - name: print msys version run: uname -a @@ -439,7 +439,7 @@ jobs: with: msystem: CLANG32 update: true - install: git mingw-w64-clang-i686-7zip mingw-w64-clang-i686-cmake mingw-w64-clang-i686-clang mingw-w64-clang-i686-vulkan-loader mingw-w64-clang-i686-opencl-icd + install: git mingw-w64-clang-i686-7zip mingw-w64-clang-i686-cmake mingw-w64-clang-i686-clang mingw-w64-clang-i686-vulkan-loader mingw-w64-clang-i686-vulkan-headers mingw-w64-clang-i686-opencl-icd - name: print msys version run: uname -a From 30813551be8094479d184e2860bb9d9df66403e4 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 09:01:47 +0800 Subject: [PATCH 20/23] Release: v2.8.10 --- CHANGELOG.md | 2 ++ CMakeLists.txt | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ebd509908..72ba71d35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ Bugfixes: * Don't detect manufactor of Qualcomm as ARM (CPU, Android) * Ignore `chezmoi` (Terminal, Linux) * Trim trailing possible whitespaces (PublicIP) +* Fix detection compatibility for KDE 6 (Font, Linux) +* Always use Metal API to detect vmem size (GPU, macOS) Features: * Improve stability; print more useful error message; avoid misuse (PublicIP / Weather) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c3100abb..64a87ad3d 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.9 + VERSION 2.8.10 LANGUAGES C DESCRIPTION "Fast neofetch-like system information tool" HOMEPAGE_URL "https://github.com/fastfetch-cli/fastfetch" From 1f8be438815007d84f9d7882b74ed0e686565545 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 10:09:05 +0800 Subject: [PATCH 21/23] Disk (Windows): use MS-DOS device name as mountFrom result, instead of useless GUID volume name --- CHANGELOG.md | 3 +++ src/detection/disk/disk_windows.c | 20 ++++++++++++-------- src/modules/disk/disk.c | 12 ++++++++++-- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 72ba71d35..583283942 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # 2.8.10 +Changes: +* Use MS-DOS device name as mountFrom result, instead of useless GUID volume name (Windows, Disk) + Bugfixes: * Don't display 0.00 GHz (CPU, FreeBSD) * Don't detect manufactor of Qualcomm as ARM (CPU, Android) diff --git a/src/detection/disk/disk_windows.c b/src/detection/disk/disk_windows.c index 24a1651ba..cf951f294 100644 --- a/src/detection/disk/disk_windows.c +++ b/src/detection/disk/disk_windows.c @@ -15,7 +15,7 @@ const char* ffDetectDisksImpl(FFlist* disks) for(uint32_t i = 0; i < length; i++) { - const wchar_t* mountpoint = buf + i; + wchar_t* mountpoint = buf + i; UINT driveType = GetDriveTypeW(mountpoint); if(driveType == DRIVE_NO_ROOT_DIR) @@ -25,13 +25,6 @@ const char* ffDetectDisksImpl(FFlist* disks) } FFDisk* disk = ffListAdd(disks); - ffStrbufInitWS(&disk->mountpoint, mountpoint); - - wchar_t volumeName[64]; - if(GetVolumeNameForVolumeMountPointW(mountpoint, volumeName, sizeof(volumeName) / sizeof(*volumeName))) - ffStrbufInitWS(&disk->mountFrom, volumeName); - else - ffStrbufInit(&disk->mountFrom); if(!GetDiskFreeSpaceExW( mountpoint, @@ -78,6 +71,17 @@ const char* ffDetectDisksImpl(FFlist* disks) disk->type |= FF_DISK_VOLUME_TYPE_READONLY_BIT; } + ffStrbufInitWS(&disk->mountpoint, mountpoint); + if (mountpoint[2] == L'\\' && mountpoint[3] == L'\0') + { + wchar_t volumeName[MAX_PATH + 1]; + mountpoint[2] = L'\0'; + if(QueryDosDeviceW(mountpoint, volumeName, sizeof(volumeName) / sizeof(*volumeName))) + ffStrbufInitWS(&disk->mountFrom, volumeName); + else + ffStrbufInit(&disk->mountFrom); + } + //Unsupported disk->filesUsed = 0; disk->filesTotal = 0; diff --git a/src/modules/disk/disk.c b/src/modules/disk/disk.c index b5137fa95..20c53f980 100644 --- a/src/modules/disk/disk.c +++ b/src/modules/disk/disk.c @@ -422,8 +422,16 @@ void ffGenerateDiskJsonResult(FFDiskOptions* options, yyjson_mut_doc* doc, yyjso yyjson_mut_obj_add_uint(doc, bytes, "used", item->bytesUsed); yyjson_mut_val* files = yyjson_mut_obj_add_obj(doc, obj, "files"); - yyjson_mut_obj_add_uint(doc, files, "total", item->filesTotal); - yyjson_mut_obj_add_uint(doc, files, "used", item->filesUsed); + if (item->filesTotal == 0 && item->filesUsed == 0) + { + yyjson_mut_obj_add_null(doc, files, "total"); + yyjson_mut_obj_add_null(doc, files, "used"); + } + else + { + yyjson_mut_obj_add_uint(doc, files, "total", item->filesTotal); + yyjson_mut_obj_add_uint(doc, files, "used", item->filesUsed); + } yyjson_mut_obj_add_strbuf(doc, obj, "filesystem", &item->filesystem); yyjson_mut_obj_add_strbuf(doc, obj, "mountpoint", &item->mountpoint); From 9681e176b3f6abf33992d518dd65f6d39478c24e 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 11:12:30 +0800 Subject: [PATCH 22/23] Terminal (Windows): don't use wininit as terminal --- src/detection/terminalshell/terminalshell_windows.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/detection/terminalshell/terminalshell_windows.c b/src/detection/terminalshell/terminalshell_windows.c index cce353c29..053c62a7f 100644 --- a/src/detection/terminalshell/terminalshell_windows.c +++ b/src/detection/terminalshell/terminalshell_windows.c @@ -313,7 +313,8 @@ static uint32_t getTerminalInfo(FFTerminalResult* result, uint32_t pid) ffStrbufSubstrBefore(&result->prettyName, result->prettyName.length - 4); if(ffStrbufIgnCaseEqualS(&result->prettyName, "sihost") || - ffStrbufIgnCaseEqualS(&result->prettyName, "explorer") + ffStrbufIgnCaseEqualS(&result->prettyName, "explorer") || + ffStrbufIgnCaseEqualS(&result->prettyName, "wininit") ) { // A CUI program created by Windows Explorer will spawn a conhost as its child. // However the conhost process is just a placeholder; From 0a8056d835792377bc0621a43dbde042d80ac7a7 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 14:09:53 +0800 Subject: [PATCH 23/23] TerminalShell (Windows): adjustments 1. Don't pretty print CMD 2. Print conhost as Windows Console --- CHANGELOG.md | 4 ++++ src/detection/terminalshell/terminalshell_windows.c | 8 +++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 583283942..6c534c9c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,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) diff --git a/src/detection/terminalshell/terminalshell_windows.c b/src/detection/terminalshell/terminalshell_windows.c index 053c62a7f..bd92f0829 100644 --- a/src/detection/terminalshell/terminalshell_windows.c +++ b/src/detection/terminalshell/terminalshell_windows.c @@ -143,7 +143,7 @@ static void setShellInfoDetails(FFShellResult* result) ffStrbufSetS(&result->prettyName, "Windows PowerShell ISE"); else if(ffStrbufIgnCaseEqualS(&result->prettyName, "cmd")) { - ffStrbufClear(&result->prettyName); + ffStrbufSetS(&result->prettyName, "CMD"); FF_AUTO_CLOSE_FD HANDLE snapshot = NULL; while(!(snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, result->pid)) && GetLastError() == ERROR_BAD_LENGTH) {} @@ -156,15 +156,13 @@ static void setShellInfoDetails(FFShellResult* result) { if(wcsncmp(module.szModule, L"clink_dll_", strlen("clink_dll_")) == 0) { - ffStrbufAppendS(&result->prettyName, "CMD (with Clink "); + ffStrbufAppendS(&result->prettyName, " (with Clink "); getProductVersion(module.szExePath, &result->prettyName); ffStrbufAppendC(&result->prettyName, ')'); break; } } } - if(result->prettyName.length == 0) - ffStrbufAppendS(&result->prettyName, "Command Prompt"); } else if(ffStrbufIgnCaseEqualS(&result->prettyName, "nu")) ffStrbufSetS(&result->prettyName, "nushell"); @@ -345,7 +343,7 @@ static void setTerminalInfoDetails(FFTerminalResult* result) : "Windows Terminal" ); else if(ffStrbufIgnCaseEqualS(&result->prettyName, "conhost")) - ffStrbufSetStatic(&result->prettyName, "Console Window Host"); + ffStrbufSetStatic(&result->prettyName, "Windows Console"); else if(ffStrbufIgnCaseEqualS(&result->prettyName, "Code")) ffStrbufSetStatic(&result->prettyName, "Visual Studio Code"); else if(ffStrbufIgnCaseEqualS(&result->prettyName, "explorer"))