From 85050f7ff159580ee128ae63b50fc6f9d79ccb7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 17 Jan 2025 10:39:41 +0800 Subject: [PATCH] Packages: add pkgsrc; code refactor Fix #1515 --- src/detection/packages/packages.c | 47 +++++++++++++++++++++++++ src/detection/packages/packages.h | 5 +++ src/detection/packages/packages_apple.c | 26 ++------------ src/detection/packages/packages_linux.c | 26 ++------------ src/detection/packages/packages_obsd.c | 35 ++++-------------- src/detection/packages/packages_sunos.c | 3 ++ src/modules/packages/option.h | 1 + src/modules/packages/packages.c | 7 ++++ 8 files changed, 74 insertions(+), 76 deletions(-) diff --git a/src/detection/packages/packages.c b/src/detection/packages/packages.c index 1a12bc328..c4706eafe 100644 --- a/src/detection/packages/packages.c +++ b/src/detection/packages/packages.c @@ -85,3 +85,50 @@ bool ffPackagesWriteCache(FFstrbuf* cacheDir, FFstrbuf* cacheContent, uint32_t n ffStrbufAppendF(cacheContent, "%" PRIu32, num_elements); return ffWriteFileBuffer(cacheDir->chars, cacheContent); } + +#ifndef _WIN32 +uint32_t ffPackagesGetNumElements(const char* dirname, uint8_t type) +{ + FF_AUTO_CLOSE_DIR DIR* dirp = opendir(dirname); + if(dirp == NULL) + return 0; + + uint32_t num_elements = 0; + + struct dirent *entry; + while((entry = readdir(dirp)) != NULL) + { + bool ok = false; + +#ifndef __sun + if(entry->d_type != DT_UNKNOWN && entry->d_type != DT_LNK) + ok = entry->d_type == type; + else +#endif + { + struct stat stbuf; + if (fstatat(dirfd(dirp), entry->d_name, &stbuf, 0) == 0) + { + switch (stbuf.st_mode & S_IFMT) + { + case S_IFDIR: ok = type == DT_DIR; break; + case S_IFREG: ok = type == DT_REG; break; + case S_IFLNK: ok = type == DT_LNK; break; + case S_IFSOCK: ok = type == DT_SOCK; break; + case S_IFBLK: ok = type == DT_BLK; break; + case S_IFCHR: ok = type == DT_CHR; break; + case S_IFIFO: ok = type == DT_FIFO; break; + default: break; + } + } + } + + if(ok) ++num_elements; + } + + if(type == DT_DIR && num_elements >= 2) + num_elements -= 2; // accounting for . and .. + + return num_elements; +} +#endif diff --git a/src/detection/packages/packages.h b/src/detection/packages/packages.h index 24ce9748c..144fd7e55 100644 --- a/src/detection/packages/packages.h +++ b/src/detection/packages/packages.h @@ -31,6 +31,7 @@ typedef struct FFPackagesResult uint32_t pacstall; uint32_t paludis; uint32_t pkg; + uint32_t pkgsrc; uint32_t pkgtool; uint32_t qi; uint32_t rpm; @@ -48,3 +49,7 @@ typedef struct FFPackagesResult const char* ffDetectPackages(FFPackagesResult* result, FFPackagesOptions* options); bool ffPackagesReadCache(FFstrbuf* cacheDir, FFstrbuf* cacheContent, const char* filePath, const char* packageId, uint32_t* result); bool ffPackagesWriteCache(FFstrbuf* cacheDir, FFstrbuf* cacheContent, uint32_t num_elements); + +#ifndef _WIN32 +uint32_t ffPackagesGetNumElements(const char* dirname, uint8_t type); +#endif diff --git a/src/detection/packages/packages_apple.c b/src/detection/packages/packages_apple.c index 350426dea..d8a0edd9e 100644 --- a/src/detection/packages/packages_apple.c +++ b/src/detection/packages/packages_apple.c @@ -4,26 +4,6 @@ #include "common/processing.h" #include "util/stringUtils.h" -static uint32_t getNumElements(const char* dirname, unsigned char type) -{ - FF_AUTO_CLOSE_DIR DIR* dirp = opendir(dirname); - if(dirp == NULL) - return 0; - - uint32_t num_elements = 0; - - struct dirent *entry; - while((entry = readdir(dirp)) != NULL) { - if(entry->d_type == type) - ++num_elements; - } - - if(type == DT_DIR) - num_elements -= 2; // accounting for . and .. - - return num_elements; -} - static void countBrewPackages(const char* dirname, FFPackagesResult* result) { FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateS(dirname); @@ -31,11 +11,11 @@ static void countBrewPackages(const char* dirname, FFPackagesResult* result) uint32_t baseDirLength = baseDir.length; ffStrbufAppendS(&baseDir, "/Caskroom"); - result->brewCask += getNumElements(baseDir.chars, DT_DIR); + result->brewCask += ffPackagesGetNumElements(baseDir.chars, DT_DIR); ffStrbufSubstrBefore(&baseDir, baseDirLength); ffStrbufAppendS(&baseDir, "/Cellar"); - result->brew += getNumElements(baseDir.chars, DT_DIR); + result->brew += ffPackagesGetNumElements(baseDir.chars, DT_DIR); ffStrbufSubstrBefore(&baseDir, baseDirLength); } @@ -54,7 +34,7 @@ static uint32_t countMacPortsPackages(const char* dirname) FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateS(dirname); ffStrbufAppendS(&baseDir, "/var/macports/software"); - return getNumElements(baseDir.chars, DT_DIR); + return ffPackagesGetNumElements(baseDir.chars, DT_DIR); } static uint32_t getMacPortsPackages() diff --git a/src/detection/packages/packages_linux.c b/src/detection/packages/packages_linux.c index 1242f1238..045f329af 100644 --- a/src/detection/packages/packages_linux.c +++ b/src/detection/packages/packages_linux.c @@ -7,33 +7,11 @@ #include "detection/os/os.h" #include "util/stringUtils.h" -#include - -static uint32_t getNumElementsImpl(const char* dirname, unsigned char type) -{ - FF_AUTO_CLOSE_DIR DIR* dirp = opendir(dirname); - if(dirp == NULL) - return 0; - - uint32_t num_elements = 0; - - struct dirent *entry; - while((entry = readdir(dirp)) != NULL) { - if(entry->d_type == type) - ++num_elements; - } - - if(type == DT_DIR && num_elements >= 2) - num_elements -= 2; // accounting for . and .. - - return num_elements; -} - static uint32_t getNumElements(FFstrbuf* baseDir, const char* dirname, unsigned char type) { uint32_t baseDirLength = baseDir->length; ffStrbufAppendS(baseDir, dirname); - uint32_t num_elements = getNumElementsImpl(baseDir->chars, type); + uint32_t num_elements = ffPackagesGetNumElements(baseDir->chars, type); ffStrbufSubstrBefore(baseDir, baseDirLength); return num_elements; } @@ -550,7 +528,7 @@ static uint32_t getFlatpakPackages(FFstrbuf* baseDir, const char* dirname) uint32_t flatpakDirLength = baseDir->length; ffStrbufAppendS(baseDir, "app"); - num_elements += getNumElementsImpl(baseDir->chars, DT_DIR); + num_elements += ffPackagesGetNumElements(baseDir->chars, DT_DIR); ffStrbufSubstrBefore(baseDir, flatpakDirLength); num_elements += getFlatpakRuntimePackages(baseDir); diff --git a/src/detection/packages/packages_obsd.c b/src/detection/packages/packages_obsd.c index 00d85120b..ff64a606a 100644 --- a/src/detection/packages/packages_obsd.c +++ b/src/detection/packages/packages_obsd.c @@ -2,36 +2,13 @@ #include "common/io/io.h" -static uint32_t getNumElementsImpl(const char* dirname, unsigned char type) -{ - FF_AUTO_CLOSE_DIR DIR* dirp = opendir(dirname); - if(dirp == NULL) - return 0; - - uint32_t num_elements = 0; - - struct dirent *entry; - while((entry = readdir(dirp)) != NULL) { - if(entry->d_type == type) - ++num_elements; - } - - if(type == DT_DIR && num_elements >= 2) - num_elements -= 2; // accounting for . and .. - - return num_elements; -} - void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) { + #if __OpenBSD__ if (!(options->disabled & FF_PACKAGES_FLAG_PKG_BIT)) - { - result->pkg = getNumElementsImpl(FASTFETCH_TARGET_DIR_ROOT - #if __OpenBSD__ - "/var/db/pkg" - #else - "/usr/pkg/pkgdb" - #endif - , DT_DIR); - } + result->pkg = ffPackagesGetNumElements(FASTFETCH_TARGET_DIR_ROOT "/var/db/pkg", DT_DIR); + #elif __NetBSD__ + if (!(options->disabled & FF_PACKAGES_FLAG_PKGSRC_BIT)) + result->pkgsrc = ffPackagesGetNumElements(FASTFETCH_TARGET_DIR_ROOT "/usr/pkg/pkgdb", DT_DIR); + #endif } diff --git a/src/detection/packages/packages_sunos.c b/src/detection/packages/packages_sunos.c index a295f9ae8..61659a2d2 100644 --- a/src/detection/packages/packages_sunos.c +++ b/src/detection/packages/packages_sunos.c @@ -1,4 +1,5 @@ #include "packages.h" +#include void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) { @@ -12,4 +13,6 @@ void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) result->pkg = (uint32_t) yyjson_get_uint(packageCount); } } + if (!(options->disabled & FF_PACKAGES_FLAG_PKGSRC_BIT)) + result->pkgsrc = ffPackagesGetNumElements(FASTFETCH_TARGET_DIR_ROOT "/usr/pkg/pkgdb", DT_DIR); } diff --git a/src/modules/packages/option.h b/src/modules/packages/option.h index cab933592..726d74bb1 100644 --- a/src/modules/packages/option.h +++ b/src/modules/packages/option.h @@ -35,6 +35,7 @@ typedef enum __attribute__((__packed__)) FFPackagesFlags FF_PACKAGES_FLAG_PACSTALL_BIT = 1 << 25, FF_PACKAGES_FLAG_MPORT_BIT = 1 << 26, FF_PACKAGES_FLAG_QI_BIT = 1 << 27, + FF_PACKAGES_FLAG_PKGSRC_BIT = 1 << 28, FF_PACKAGES_FLAG_FORCE_UNSIGNED = UINT32_MAX, } FFPackagesFlags; static_assert(sizeof(FFPackagesFlags) == sizeof(uint32_t), ""); diff --git a/src/modules/packages/packages.c b/src/modules/packages/packages.c index 6a9e3af73..6788d37dd 100644 --- a/src/modules/packages/packages.c +++ b/src/modules/packages/packages.c @@ -50,6 +50,7 @@ void ffPrintPackages(FFPackagesOptions* options) FF_PRINT_PACKAGE_NAME(nixDefault, "nix-default") FF_PRINT_PACKAGE(apk) FF_PRINT_PACKAGE(pkg) + FF_PRINT_PACKAGE(pkgsrc) FF_PRINT_PACKAGE_NAME(flatpakSystem, counts.flatpakUser ? "flatpak-system" : "flatpak") FF_PRINT_PACKAGE_NAME(flatpakUser, "flatpak-user") FF_PRINT_PACKAGE(snap) @@ -121,6 +122,7 @@ void ffPrintPackages(FFPackagesOptions* options) FF_FORMAT_ARG(counts.mport, "mport"), FF_FORMAT_ARG(counts.qi, "qi"), FF_FORMAT_ARG(counts.amUser, "am-user"), + FF_FORMAT_ARG(counts.pkgsrc, "pkgsrc"), FF_FORMAT_ARG(nixAll, "nix-all"), FF_FORMAT_ARG(flatpakAll, "flatpak-all"), FF_FORMAT_ARG(brewAll, "brew-all"), @@ -197,6 +199,7 @@ bool ffParsePackagesCommandOptions(FFPackagesOptions* options, const char* key, FF_TEST_PACKAGE_NAME(PALUDIS) FF_TEST_PACKAGE_NAME(PKG) FF_TEST_PACKAGE_NAME(PKGTOOL) + FF_TEST_PACKAGE_NAME(PKGSRC) break; case 'Q': if (false); FF_TEST_PACKAGE_NAME(QI) @@ -311,6 +314,7 @@ void ffParsePackagesJsonObject(FFPackagesOptions* options, yyjson_val* module) FF_TEST_PACKAGE_NAME(PALUDIS) FF_TEST_PACKAGE_NAME(PKG) FF_TEST_PACKAGE_NAME(PKGTOOL) + FF_TEST_PACKAGE_NAME(PKGSRC) break; case 'Q': if (false); FF_TEST_PACKAGE_NAME(QI) @@ -373,6 +377,7 @@ void ffGeneratePackagesJsonConfig(FFPackagesOptions* options, yyjson_mut_doc* do FF_TEST_PACKAGE_NAME(PALUDIS) FF_TEST_PACKAGE_NAME(PKG) FF_TEST_PACKAGE_NAME(PKGTOOL) + FF_TEST_PACKAGE_NAME(PKGSRC) FF_TEST_PACKAGE_NAME(QI) FF_TEST_PACKAGE_NAME(RPM) FF_TEST_PACKAGE_NAME(SCOOP) @@ -427,6 +432,7 @@ void ffGeneratePackagesJsonResult(FF_MAYBE_UNUSED FFPackagesOptions* options, yy FF_APPEND_PACKAGE_COUNT(paludis) FF_APPEND_PACKAGE_COUNT(pkg) FF_APPEND_PACKAGE_COUNT(pkgtool) + FF_APPEND_PACKAGE_COUNT(pkgsrc) FF_APPEND_PACKAGE_COUNT(qi) FF_APPEND_PACKAGE_COUNT(macports) FF_APPEND_PACKAGE_COUNT(rpm) @@ -484,6 +490,7 @@ static FFModuleBaseInfo ffModuleInfo = { {"Number of mport packages", "mport"}, {"Number of qi packages", "qi"}, {"Number of am-user (aka appman) packages", "am-user"}, + {"Number of pkgsrc packages", "pkgsrc"}, {"Total number of all nix packages", "nix-all"}, {"Total number of all flatpak app packages", "flatpak-all"}, {"Total number of all brew packages", "brew-all"},