From c78ef6b49aa03b4a2fbc0a0491abad910a6d9919 Mon Sep 17 00:00:00 2001 From: Suyun Date: Sun, 5 Jul 2026 17:03:04 +0800 Subject: [PATCH 1/2] Packages (pkgsrc): add dynamic prefix discovery --- CMakeLists.txt | 6 +++++ src/detection/packages/packages.h | 3 +++ src/detection/packages/packages_apple.c | 4 +++ src/detection/packages/packages_linux.c | 2 +- src/detection/packages/packages_nbsd.c | 5 ++-- src/detection/packages/packages_pkgsrc.c | 34 ++++++++++++++++++++++++ src/detection/packages/packages_sunos.c | 3 ++- 7 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 src/detection/packages/packages_pkgsrc.c diff --git a/CMakeLists.txt b/CMakeLists.txt index a6f5db24de..b39d5ea0a4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -617,6 +617,7 @@ if(LINUX) src/detection/os/os_linux.c src/detection/packages/packages_linux.c src/detection/packages/packages_nix.c + src/detection/packages/packages_pkgsrc.c src/detection/poweradapter/poweradapter_linux.c src/detection/processes/processes_linux.c src/detection/gtk_qt/qt.c @@ -692,6 +693,7 @@ elseif(ANDROID) src/detection/os/os_android.c src/detection/packages/packages_linux.c src/detection/packages/packages_nix.c + src/detection/packages/packages_pkgsrc.c src/detection/poweradapter/poweradapter_nosupport.c src/detection/processes/processes_linux.c src/detection/sound/sound_linux.c @@ -869,6 +871,7 @@ elseif(NetBSD) src/detection/opengl/opengl_linux.c src/detection/os/os_nbsd.c src/detection/packages/packages_nbsd.c + src/detection/packages/packages_pkgsrc.c src/detection/poweradapter/poweradapter_nosupport.c src/detection/processes/processes_nbsd.c src/detection/gtk_qt/qt.c @@ -1024,6 +1027,7 @@ elseif(APPLE) src/detection/os/os_apple.m src/detection/packages/packages_apple.c src/detection/packages/packages_nix.c + src/detection/packages/packages_pkgsrc.c src/detection/poweradapter/poweradapter_apple.c src/detection/processes/processes_bsd.c src/detection/sound/sound_apple.c @@ -1197,6 +1201,7 @@ elseif(SunOS) src/detection/opengl/opengl_linux.c src/detection/os/os_sunos.c src/detection/packages/packages_sunos.c + src/detection/packages/packages_pkgsrc.c src/detection/poweradapter/poweradapter_nosupport.c src/detection/processes/processes_linux.c src/detection/gtk_qt/qt.c @@ -1345,6 +1350,7 @@ elseif(GNU) src/detection/os/os_linux.c src/detection/packages/packages_linux.c src/detection/packages/packages_nix.c + src/detection/packages/packages_pkgsrc.c src/detection/poweradapter/poweradapter_nosupport.c src/detection/processes/processes_linux.c src/detection/gtk_qt/qt.c diff --git a/src/detection/packages/packages.h b/src/detection/packages/packages.h index 2119349323..cb2d7da96a 100644 --- a/src/detection/packages/packages.h +++ b/src/detection/packages/packages.h @@ -72,3 +72,6 @@ uint32_t ffPackagesGetNix(FFstrbuf* baseDir, const char* dirname); #ifndef _WIN32 uint32_t ffPackagesGetNumElements(const char* dirname, bool isdir); #endif +#if defined(__linux__) || defined(__NetBSD__) || defined(__sun) || defined(__APPLE__) +uint32_t ffPackagesGetPkgsrc(FFstrbuf* baseDir); +#endif diff --git a/src/detection/packages/packages_apple.c b/src/detection/packages/packages_apple.c index 43de97df8f..3f4e89565c 100644 --- a/src/detection/packages/packages_apple.c +++ b/src/detection/packages/packages_apple.c @@ -53,4 +53,8 @@ void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) ffStrbufSet(&baseDir, &instance.state.platform.homeDir); result->nixUser = ffPackagesGetNix(&baseDir, "/.nix-profile"); } + if (FF_PACKAGES_IS_ENABLED(options, PKGSRC)) { + ffStrbufSetS(&baseDir, FASTFETCH_TARGET_DIR_ROOT); + result->pkgsrc = ffPackagesGetPkgsrc(&baseDir); + } } diff --git a/src/detection/packages/packages_linux.c b/src/detection/packages/packages_linux.c index ee4efbe4ce..50b8d0d02d 100644 --- a/src/detection/packages/packages_linux.c +++ b/src/detection/packages/packages_linux.c @@ -560,7 +560,7 @@ static void getPackageCounts(FFstrbuf* baseDir, FFPackagesResult* packageCounts, packageCounts->pisi += getNumElements(baseDir, "/var/lib/pisi/package", true); } if (FF_PACKAGES_IS_ENABLED(options, PKGSRC)) { - packageCounts->pkgsrc += getNumElements(baseDir, "/usr/pkg/pkgdb", DT_DIR); + packageCounts->pkgsrc += ffPackagesGetPkgsrc(baseDir); } if (FF_PACKAGES_IS_ENABLED(options, MOSS)) { packageCounts->moss += getSQLite3Int(baseDir, "/.moss/db/state", "SELECT COUNT(*) FROM state_selections WHERE state_id = (SELECT MAX(id) FROM state)", "moss"); diff --git a/src/detection/packages/packages_nbsd.c b/src/detection/packages/packages_nbsd.c index 2f7912684d..aa7828fdeb 100644 --- a/src/detection/packages/packages_nbsd.c +++ b/src/detection/packages/packages_nbsd.c @@ -1,9 +1,8 @@ #include "packages.h" -#include "common/io.h" - void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) { if (FF_PACKAGES_IS_ENABLED(options, PKGSRC)) { - result->pkgsrc = ffPackagesGetNumElements(FASTFETCH_TARGET_DIR_ROOT "/usr/pkg/pkgdb", true); + FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateStatic(FASTFETCH_TARGET_DIR_ROOT); + result->pkgsrc = ffPackagesGetPkgsrc(&baseDir); } } diff --git a/src/detection/packages/packages_pkgsrc.c b/src/detection/packages/packages_pkgsrc.c new file mode 100644 index 0000000000..a32424a24e --- /dev/null +++ b/src/detection/packages/packages_pkgsrc.c @@ -0,0 +1,34 @@ +#include "packages.h" +#include "common/io.h" +#include "common/path.h" +#include "common/properties.h" + +uint32_t ffPackagesGetPkgsrc(FFstrbuf* baseDir) { + uint32_t baseDirLength = baseDir->length; + FF_STRBUF_AUTO_DESTROY pkginPath = ffStrbufCreate(); + + if (ffFindExecutableInPath("pkgin", &pkginPath) != NULL) { + ffStrbufSubstrBefore(baseDir, baseDirLength); + return 0; + } + + ffStrbufSubstrBeforeLastC(&pkginPath, '/'); // remove /pkgin + ffStrbufSubstrBeforeLastC(&pkginPath, '/'); // remove /bin + + FF_STRBUF_AUTO_DESTROY mkconf = ffStrbufCreateCopy(&pkginPath); + ffStrbufAppendS(&mkconf, "/etc/mk.conf"); + + FF_STRBUF_AUTO_DESTROY dbdir = ffStrbufCreate(); + ffParsePropFile(mkconf.chars, "PKG_DBDIR=", &dbdir); + + if (dbdir.length > 0) { + ffStrbufAppendS(baseDir, dbdir.chars); + } else { + ffStrbufAppendF(baseDir, "%s/pkgdb", pkginPath.chars); + } + + uint32_t result = ffPackagesGetNumElements(baseDir->chars, true); + ffStrbufSubstrBefore(baseDir, baseDirLength); + + return result; +} diff --git a/src/detection/packages/packages_sunos.c b/src/detection/packages/packages_sunos.c index 16b8cd7cd9..62736804cf 100644 --- a/src/detection/packages/packages_sunos.c +++ b/src/detection/packages/packages_sunos.c @@ -12,6 +12,7 @@ void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) } } if (FF_PACKAGES_IS_ENABLED(options, PKGSRC)) { - result->pkgsrc = ffPackagesGetNumElements(FASTFETCH_TARGET_DIR_ROOT "/usr/pkg/pkgdb", true); + FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateStatic(FASTFETCH_TARGET_DIR_ROOT); + result->pkgsrc = ffPackagesGetPkgsrc(&baseDir); } } From bc76a3d31b0a9103fa40aff55bd8248b9e385396 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Sun, 5 Jul 2026 21:58:00 -0500 Subject: [PATCH 2/2] Refactor pkgsrc package path retrieval logic --- src/detection/packages/packages_pkgsrc.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/detection/packages/packages_pkgsrc.c b/src/detection/packages/packages_pkgsrc.c index a32424a24e..05bea4df22 100644 --- a/src/detection/packages/packages_pkgsrc.c +++ b/src/detection/packages/packages_pkgsrc.c @@ -1,5 +1,4 @@ #include "packages.h" -#include "common/io.h" #include "common/path.h" #include "common/properties.h" @@ -8,27 +7,28 @@ uint32_t ffPackagesGetPkgsrc(FFstrbuf* baseDir) { FF_STRBUF_AUTO_DESTROY pkginPath = ffStrbufCreate(); if (ffFindExecutableInPath("pkgin", &pkginPath) != NULL) { - ffStrbufSubstrBefore(baseDir, baseDirLength); return 0; } ffStrbufSubstrBeforeLastC(&pkginPath, '/'); // remove /pkgin ffStrbufSubstrBeforeLastC(&pkginPath, '/'); // remove /bin + uint32_t pkginPathLength = pkginPath.length; - FF_STRBUF_AUTO_DESTROY mkconf = ffStrbufCreateCopy(&pkginPath); - ffStrbufAppendS(&mkconf, "/etc/mk.conf"); + ffStrbufAppendS(&pkginPath, "/etc/mk.conf"); FF_STRBUF_AUTO_DESTROY dbdir = ffStrbufCreate(); - ffParsePropFile(mkconf.chars, "PKG_DBDIR=", &dbdir); + ffParsePropFile(pkginPath.chars, "PKG_DBDIR=", &dbdir); + ffStrbufSubstrBefore(&pkginPath, pkginPathLength); // remove /etc/mk.conf if (dbdir.length > 0) { - ffStrbufAppendS(baseDir, dbdir.chars); + ffStrbufAppend(baseDir, &dbdir); } else { - ffStrbufAppendF(baseDir, "%s/pkgdb", pkginPath.chars); + ffStrbufAppend(baseDir, &pkginPath); + ffStrbufAppendS(baseDir, "/pkgdb"); } uint32_t result = ffPackagesGetNumElements(baseDir->chars, true); ffStrbufSubstrBefore(baseDir, baseDirLength); - + return result; }