From 2de4f2321d6427c95d2676e01b961ca8c8945240 Mon Sep 17 00:00:00 2001 From: It_is_Sean Date: Fri, 16 Jan 2026 23:01:55 +0800 Subject: [PATCH 1/4] Packages(Linux): Auto detect the DBPath directory for pacman on archlinux Replace the original hardcoded pacman database path. Now it will auto detect the DBPath directory configured by `/etc/pacman.conf`. If `DBPath` is not set, it will fall back to the default `/var/lib/pacman/local`. --- src/detection/packages/packages_linux.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/detection/packages/packages_linux.c b/src/detection/packages/packages_linux.c index e2f4a6b232..df21d99559 100644 --- a/src/detection/packages/packages_linux.c +++ b/src/detection/packages/packages_linux.c @@ -412,6 +412,25 @@ static uint32_t getFlatpakPackages(FFstrbuf* baseDir, const char* dirname) return num_elements; } + +static uint32_t getPacmanPackages(FFstrbuf* baseDir) +{ + FF_STRBUF_AUTO_DESTROY pacmanDir = ffStrbufCreate(); + + uint32_t baseDirLen = baseDir->length; + ffStrbufAppendS(&pacmanDir, "/etc/pacman.conf"); + + if (!ffParsePropFile(baseDir->chars, "DBPath =", &pacmanDir)) + ffStrbufSetS(&pacmanDir, "/var/lib/pacman"); + + ffStrbufSubstrBefore(&pacmanDir, baseDirLen); + + ffStrbufTrimRight(&pacmanDir, '/'); + ffStrbufAppendS(&pacmanDir, "/local"); + + return getNumElements(baseDir, pacmanDir.chars, true); +} + 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", "apk"); @@ -426,7 +445,7 @@ static void getPackageCounts(FFstrbuf* baseDir, FFPackagesResult* packageCounts, packageCounts->nixDefault += ffPackagesGetNix(baseDir, "/nix/var/nix/profiles/default"); packageCounts->nixSystem += ffPackagesGetNix(baseDir, "/run/current-system"); } - if (!(options->disabled & FF_PACKAGES_FLAG_PACMAN_BIT)) packageCounts->pacman += getNumElements(baseDir, "/var/lib/pacman/local", true); + if (!(options->disabled & FF_PACKAGES_FLAG_PACMAN_BIT)) packageCounts->pacman += getPacmanPackages(baseDir); if (!(options->disabled & FF_PACKAGES_FLAG_LPKGBUILD_BIT)) packageCounts->lpkgbuild += getNumElements(baseDir, "/opt/Loc-OS-LPKG/lpkgbuild/remove", false); if (!(options->disabled & FF_PACKAGES_FLAG_PKGTOOL_BIT)) packageCounts->pkgtool += getNumElements(baseDir, "/var/log/packages", false); if (!(options->disabled & FF_PACKAGES_FLAG_RPM_BIT)) From 1dbaad5bf832eae3ba499dfdd0ff19f13a7b9e3c Mon Sep 17 00:00:00 2001 From: It_is_Sean Date: Sat, 17 Jan 2026 00:13:29 +0800 Subject: [PATCH 2/4] fix(packages): auto-detect pacman DBPath from /etc/pacman.conf --- src/detection/packages/packages_linux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/detection/packages/packages_linux.c b/src/detection/packages/packages_linux.c index df21d99559..fbe230f010 100644 --- a/src/detection/packages/packages_linux.c +++ b/src/detection/packages/packages_linux.c @@ -418,12 +418,12 @@ static uint32_t getPacmanPackages(FFstrbuf* baseDir) FF_STRBUF_AUTO_DESTROY pacmanDir = ffStrbufCreate(); uint32_t baseDirLen = baseDir->length; - ffStrbufAppendS(&pacmanDir, "/etc/pacman.conf"); + ffStrbufAppendS(baseDir, "/etc/pacman.conf"); if (!ffParsePropFile(baseDir->chars, "DBPath =", &pacmanDir)) ffStrbufSetS(&pacmanDir, "/var/lib/pacman"); - ffStrbufSubstrBefore(&pacmanDir, baseDirLen); + ffStrbufSubstrBefore(baseDir, baseDirLen); ffStrbufTrimRight(&pacmanDir, '/'); ffStrbufAppendS(&pacmanDir, "/local"); From 28e798ae7362c85b3e11904e3cb77f0df3221b6e Mon Sep 17 00:00:00 2001 From: It_is_Sean Date: Sun, 18 Jan 2026 00:50:39 +0800 Subject: [PATCH 3/4] fix(packages): Add detection for `RootDir` specified in `pacman.conf` --- src/detection/packages/packages_linux.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/detection/packages/packages_linux.c b/src/detection/packages/packages_linux.c index fbe230f010..30643d7dc6 100644 --- a/src/detection/packages/packages_linux.c +++ b/src/detection/packages/packages_linux.c @@ -416,13 +416,21 @@ static uint32_t getFlatpakPackages(FFstrbuf* baseDir, const char* dirname) static uint32_t getPacmanPackages(FFstrbuf* baseDir) { FF_STRBUF_AUTO_DESTROY pacmanDir = ffStrbufCreate(); - + // Get path to pacman.conf uint32_t baseDirLen = baseDir->length; ffStrbufAppendS(baseDir, "/etc/pacman.conf"); - if (!ffParsePropFile(baseDir->chars, "DBPath =", &pacmanDir)) - ffStrbufSetS(&pacmanDir, "/var/lib/pacman"); + // Get DBPath for packages + // If DBpath is specified + if (!ffParsePropFile(baseDir->chars, "DBPath =", &pacmanDir)){ + // If DBpath is not specified and RootDir is specified + if (!ffParsePropFile(baseDir->chars, "RootDir =", &pacmanDir)) + // If both are not specified + ffStrbufClear(&pacmanDir); + ffStrbufTrimRight(&pacmanDir, '/'); + ffStrbufAppendS(&pacmanDir, "/var/lib/pacman"); + } ffStrbufSubstrBefore(baseDir, baseDirLen); ffStrbufTrimRight(&pacmanDir, '/'); From 46efa93d9ff76c8e8398f7c0902d9d8d2575f578 Mon Sep 17 00:00:00 2001 From: It_is_Sean Date: Sun, 18 Jan 2026 23:43:14 +0800 Subject: [PATCH 4/4] fix(packages): updated logic to detect DBPath and RootPath --- src/detection/packages/packages_linux.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/detection/packages/packages_linux.c b/src/detection/packages/packages_linux.c index 30643d7dc6..ad1ed82508 100644 --- a/src/detection/packages/packages_linux.c +++ b/src/detection/packages/packages_linux.c @@ -412,7 +412,6 @@ static uint32_t getFlatpakPackages(FFstrbuf* baseDir, const char* dirname) return num_elements; } - static uint32_t getPacmanPackages(FFstrbuf* baseDir) { FF_STRBUF_AUTO_DESTROY pacmanDir = ffStrbufCreate(); @@ -421,13 +420,14 @@ static uint32_t getPacmanPackages(FFstrbuf* baseDir) ffStrbufAppendS(baseDir, "/etc/pacman.conf"); // Get DBPath for packages - // If DBpath is specified - if (!ffParsePropFile(baseDir->chars, "DBPath =", &pacmanDir)){ + ffParsePropFile(baseDir->chars, "DBPath =", &pacmanDir); + // If DBPath is specified + if (pacmanDir.length == 0) { + ffParsePropFile(baseDir->chars, "RootDir =", &pacmanDir); // If DBpath is not specified and RootDir is specified - if (!ffParsePropFile(baseDir->chars, "RootDir =", &pacmanDir)) - // If both are not specified + if (pacmanDir.length ==0) + // If both are not specified ffStrbufClear(&pacmanDir); - ffStrbufTrimRight(&pacmanDir, '/'); ffStrbufAppendS(&pacmanDir, "/var/lib/pacman"); }