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..05bea4df22 --- /dev/null +++ b/src/detection/packages/packages_pkgsrc.c @@ -0,0 +1,34 @@ +#include "packages.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) { + return 0; + } + + ffStrbufSubstrBeforeLastC(&pkginPath, '/'); // remove /pkgin + ffStrbufSubstrBeforeLastC(&pkginPath, '/'); // remove /bin + uint32_t pkginPathLength = pkginPath.length; + + ffStrbufAppendS(&pkginPath, "/etc/mk.conf"); + + FF_STRBUF_AUTO_DESTROY dbdir = ffStrbufCreate(); + ffParsePropFile(pkginPath.chars, "PKG_DBDIR=", &dbdir); + ffStrbufSubstrBefore(&pkginPath, pkginPathLength); // remove /etc/mk.conf + + if (dbdir.length > 0) { + ffStrbufAppend(baseDir, &dbdir); + } else { + ffStrbufAppend(baseDir, &pkginPath); + ffStrbufAppendS(baseDir, "/pkgdb"); + } + + 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); } }