From 7cbc733b9d2e9792b0fd96aecc3cfe2106a1c35c Mon Sep 17 00:00:00 2001 From: keremgokcek Date: Sat, 20 Jun 2026 15:29:13 +0300 Subject: [PATCH 1/2] Packages (Linux): Improve emerge detection speed --- src/detection/packages/packages_linux.c | 31 ++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/detection/packages/packages_linux.c b/src/detection/packages/packages_linux.c index 79de8cb3e3..4df9e1494f 100644 --- a/src/detection/packages/packages_linux.c +++ b/src/detection/packages/packages_linux.c @@ -458,6 +458,35 @@ static uint32_t getPacmanPackages(FFstrbuf* baseDir) { return getNumElements(baseDir, dbPath.chars, true); } +static uint32_t getEmergePackagesImpl(FFstrbuf* baseDir) +{ + FF_AUTO_CLOSE_DIR DIR* dirp = opendir(baseDir->chars); + if (dirp == NULL) + return 0; + + uint32_t result = 0; + + struct dirent *entry; + while ((entry = readdir(dirp)) != NULL) + { + if (entry->d_type != DT_DIR || entry->d_name[0] == '.') + continue; + + result += getNumElements(baseDir, entry->d_name, true); + } + return result; +} + +static uint32_t getEmergePackages(FFstrbuf* baseDir, const char* dirname) +{ + uint32_t baseDirLength = baseDir->length; + ffStrbufAppendS(baseDir, dirname); + ffStrbufAppendC(baseDir, '/'); + uint32_t result = getEmergePackagesImpl(baseDir); + ffStrbufSubstrBefore(baseDir, baseDirLength); + return result; +} + static void getPackageCounts(FFstrbuf* baseDir, FFPackagesResult* packageCounts, FFPackagesOptions* options) { if (FF_PACKAGES_IS_ENABLED(options, APK)) { packageCounts->apk += getNumStrings(baseDir, "/lib/apk/db/installed", "C:Q", "apk"); @@ -469,7 +498,7 @@ static void getPackageCounts(FFstrbuf* baseDir, FFPackagesResult* packageCounts, packageCounts->lpkg += getNumStrings(baseDir, "/opt/Loc-OS-LPKG/installed-lpkg/Listinstalled-lpkg.list", "\n", "lpkg"); } if (FF_PACKAGES_IS_ENABLED(options, EMERGE)) { - packageCounts->emerge += countFilesRecursive(baseDir, "/var/db/pkg", "SIZE"); + packageCounts->emerge += getEmergePackages(baseDir, "/var/db/pkg"); } if (FF_PACKAGES_IS_ENABLED(options, EOPKG)) { packageCounts->eopkg += getNumElements(baseDir, "/var/lib/eopkg/package", true); From 281e90c892b9f56c48de279a0c9898f21c8bfab5 Mon Sep 17 00:00:00 2001 From: keremgokcek Date: Sat, 20 Jun 2026 16:34:40 +0300 Subject: [PATCH 2/2] Fix code styling --- src/detection/packages/packages_linux.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/detection/packages/packages_linux.c b/src/detection/packages/packages_linux.c index 4df9e1494f..5d4d262bd4 100644 --- a/src/detection/packages/packages_linux.c +++ b/src/detection/packages/packages_linux.c @@ -458,8 +458,7 @@ static uint32_t getPacmanPackages(FFstrbuf* baseDir) { return getNumElements(baseDir, dbPath.chars, true); } -static uint32_t getEmergePackagesImpl(FFstrbuf* baseDir) -{ +static uint32_t getEmergePackagesImpl(FFstrbuf* baseDir) { FF_AUTO_CLOSE_DIR DIR* dirp = opendir(baseDir->chars); if (dirp == NULL) return 0; @@ -477,8 +476,7 @@ static uint32_t getEmergePackagesImpl(FFstrbuf* baseDir) return result; } -static uint32_t getEmergePackages(FFstrbuf* baseDir, const char* dirname) -{ +static uint32_t getEmergePackages(FFstrbuf* baseDir, const char* dirname) { uint32_t baseDirLength = baseDir->length; ffStrbufAppendS(baseDir, dirname); ffStrbufAppendC(baseDir, '/');