Skip to content

Commit 85050f7

Browse files
committed
Packages: add pkgsrc; code refactor
Fix #1515
1 parent 0b39d6f commit 85050f7

File tree

8 files changed

+74
-76
lines changed

8 files changed

+74
-76
lines changed

src/detection/packages/packages.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,50 @@ bool ffPackagesWriteCache(FFstrbuf* cacheDir, FFstrbuf* cacheContent, uint32_t n
8585
ffStrbufAppendF(cacheContent, "%" PRIu32, num_elements);
8686
return ffWriteFileBuffer(cacheDir->chars, cacheContent);
8787
}
88+
89+
#ifndef _WIN32
90+
uint32_t ffPackagesGetNumElements(const char* dirname, uint8_t type)
91+
{
92+
FF_AUTO_CLOSE_DIR DIR* dirp = opendir(dirname);
93+
if(dirp == NULL)
94+
return 0;
95+
96+
uint32_t num_elements = 0;
97+
98+
struct dirent *entry;
99+
while((entry = readdir(dirp)) != NULL)
100+
{
101+
bool ok = false;
102+
103+
#ifndef __sun
104+
if(entry->d_type != DT_UNKNOWN && entry->d_type != DT_LNK)
105+
ok = entry->d_type == type;
106+
else
107+
#endif
108+
{
109+
struct stat stbuf;
110+
if (fstatat(dirfd(dirp), entry->d_name, &stbuf, 0) == 0)
111+
{
112+
switch (stbuf.st_mode & S_IFMT)
113+
{
114+
case S_IFDIR: ok = type == DT_DIR; break;
115+
case S_IFREG: ok = type == DT_REG; break;
116+
case S_IFLNK: ok = type == DT_LNK; break;
117+
case S_IFSOCK: ok = type == DT_SOCK; break;
118+
case S_IFBLK: ok = type == DT_BLK; break;
119+
case S_IFCHR: ok = type == DT_CHR; break;
120+
case S_IFIFO: ok = type == DT_FIFO; break;
121+
default: break;
122+
}
123+
}
124+
}
125+
126+
if(ok) ++num_elements;
127+
}
128+
129+
if(type == DT_DIR && num_elements >= 2)
130+
num_elements -= 2; // accounting for . and ..
131+
132+
return num_elements;
133+
}
134+
#endif

src/detection/packages/packages.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ typedef struct FFPackagesResult
3131
uint32_t pacstall;
3232
uint32_t paludis;
3333
uint32_t pkg;
34+
uint32_t pkgsrc;
3435
uint32_t pkgtool;
3536
uint32_t qi;
3637
uint32_t rpm;
@@ -48,3 +49,7 @@ typedef struct FFPackagesResult
4849
const char* ffDetectPackages(FFPackagesResult* result, FFPackagesOptions* options);
4950
bool ffPackagesReadCache(FFstrbuf* cacheDir, FFstrbuf* cacheContent, const char* filePath, const char* packageId, uint32_t* result);
5051
bool ffPackagesWriteCache(FFstrbuf* cacheDir, FFstrbuf* cacheContent, uint32_t num_elements);
52+
53+
#ifndef _WIN32
54+
uint32_t ffPackagesGetNumElements(const char* dirname, uint8_t type);
55+
#endif

src/detection/packages/packages_apple.c

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,38 +4,18 @@
44
#include "common/processing.h"
55
#include "util/stringUtils.h"
66

7-
static uint32_t getNumElements(const char* dirname, unsigned char type)
8-
{
9-
FF_AUTO_CLOSE_DIR DIR* dirp = opendir(dirname);
10-
if(dirp == NULL)
11-
return 0;
12-
13-
uint32_t num_elements = 0;
14-
15-
struct dirent *entry;
16-
while((entry = readdir(dirp)) != NULL) {
17-
if(entry->d_type == type)
18-
++num_elements;
19-
}
20-
21-
if(type == DT_DIR)
22-
num_elements -= 2; // accounting for . and ..
23-
24-
return num_elements;
25-
}
26-
277
static void countBrewPackages(const char* dirname, FFPackagesResult* result)
288
{
299
FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateS(dirname);
3010

3111
uint32_t baseDirLength = baseDir.length;
3212

3313
ffStrbufAppendS(&baseDir, "/Caskroom");
34-
result->brewCask += getNumElements(baseDir.chars, DT_DIR);
14+
result->brewCask += ffPackagesGetNumElements(baseDir.chars, DT_DIR);
3515
ffStrbufSubstrBefore(&baseDir, baseDirLength);
3616

3717
ffStrbufAppendS(&baseDir, "/Cellar");
38-
result->brew += getNumElements(baseDir.chars, DT_DIR);
18+
result->brew += ffPackagesGetNumElements(baseDir.chars, DT_DIR);
3919
ffStrbufSubstrBefore(&baseDir, baseDirLength);
4020
}
4121

@@ -54,7 +34,7 @@ static uint32_t countMacPortsPackages(const char* dirname)
5434
FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateS(dirname);
5535
ffStrbufAppendS(&baseDir, "/var/macports/software");
5636

57-
return getNumElements(baseDir.chars, DT_DIR);
37+
return ffPackagesGetNumElements(baseDir.chars, DT_DIR);
5838
}
5939

6040
static uint32_t getMacPortsPackages()

src/detection/packages/packages_linux.c

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,11 @@
77
#include "detection/os/os.h"
88
#include "util/stringUtils.h"
99

10-
#include <dirent.h>
11-
12-
static uint32_t getNumElementsImpl(const char* dirname, unsigned char type)
13-
{
14-
FF_AUTO_CLOSE_DIR DIR* dirp = opendir(dirname);
15-
if(dirp == NULL)
16-
return 0;
17-
18-
uint32_t num_elements = 0;
19-
20-
struct dirent *entry;
21-
while((entry = readdir(dirp)) != NULL) {
22-
if(entry->d_type == type)
23-
++num_elements;
24-
}
25-
26-
if(type == DT_DIR && num_elements >= 2)
27-
num_elements -= 2; // accounting for . and ..
28-
29-
return num_elements;
30-
}
31-
3210
static uint32_t getNumElements(FFstrbuf* baseDir, const char* dirname, unsigned char type)
3311
{
3412
uint32_t baseDirLength = baseDir->length;
3513
ffStrbufAppendS(baseDir, dirname);
36-
uint32_t num_elements = getNumElementsImpl(baseDir->chars, type);
14+
uint32_t num_elements = ffPackagesGetNumElements(baseDir->chars, type);
3715
ffStrbufSubstrBefore(baseDir, baseDirLength);
3816
return num_elements;
3917
}
@@ -550,7 +528,7 @@ static uint32_t getFlatpakPackages(FFstrbuf* baseDir, const char* dirname)
550528
uint32_t flatpakDirLength = baseDir->length;
551529

552530
ffStrbufAppendS(baseDir, "app");
553-
num_elements += getNumElementsImpl(baseDir->chars, DT_DIR);
531+
num_elements += ffPackagesGetNumElements(baseDir->chars, DT_DIR);
554532
ffStrbufSubstrBefore(baseDir, flatpakDirLength);
555533

556534
num_elements += getFlatpakRuntimePackages(baseDir);

src/detection/packages/packages_obsd.c

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,13 @@
22

33
#include "common/io/io.h"
44

5-
static uint32_t getNumElementsImpl(const char* dirname, unsigned char type)
6-
{
7-
FF_AUTO_CLOSE_DIR DIR* dirp = opendir(dirname);
8-
if(dirp == NULL)
9-
return 0;
10-
11-
uint32_t num_elements = 0;
12-
13-
struct dirent *entry;
14-
while((entry = readdir(dirp)) != NULL) {
15-
if(entry->d_type == type)
16-
++num_elements;
17-
}
18-
19-
if(type == DT_DIR && num_elements >= 2)
20-
num_elements -= 2; // accounting for . and ..
21-
22-
return num_elements;
23-
}
24-
255
void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options)
266
{
7+
#if __OpenBSD__
278
if (!(options->disabled & FF_PACKAGES_FLAG_PKG_BIT))
28-
{
29-
result->pkg = getNumElementsImpl(FASTFETCH_TARGET_DIR_ROOT
30-
#if __OpenBSD__
31-
"/var/db/pkg"
32-
#else
33-
"/usr/pkg/pkgdb"
34-
#endif
35-
, DT_DIR);
36-
}
9+
result->pkg = ffPackagesGetNumElements(FASTFETCH_TARGET_DIR_ROOT "/var/db/pkg", DT_DIR);
10+
#elif __NetBSD__
11+
if (!(options->disabled & FF_PACKAGES_FLAG_PKGSRC_BIT))
12+
result->pkgsrc = ffPackagesGetNumElements(FASTFETCH_TARGET_DIR_ROOT "/usr/pkg/pkgdb", DT_DIR);
13+
#endif
3714
}

src/detection/packages/packages_sunos.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "packages.h"
2+
#include <dirent.h>
23

34
void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options)
45
{
@@ -12,4 +13,6 @@ void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options)
1213
result->pkg = (uint32_t) yyjson_get_uint(packageCount);
1314
}
1415
}
16+
if (!(options->disabled & FF_PACKAGES_FLAG_PKGSRC_BIT))
17+
result->pkgsrc = ffPackagesGetNumElements(FASTFETCH_TARGET_DIR_ROOT "/usr/pkg/pkgdb", DT_DIR);
1518
}

src/modules/packages/option.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ typedef enum __attribute__((__packed__)) FFPackagesFlags
3535
FF_PACKAGES_FLAG_PACSTALL_BIT = 1 << 25,
3636
FF_PACKAGES_FLAG_MPORT_BIT = 1 << 26,
3737
FF_PACKAGES_FLAG_QI_BIT = 1 << 27,
38+
FF_PACKAGES_FLAG_PKGSRC_BIT = 1 << 28,
3839
FF_PACKAGES_FLAG_FORCE_UNSIGNED = UINT32_MAX,
3940
} FFPackagesFlags;
4041
static_assert(sizeof(FFPackagesFlags) == sizeof(uint32_t), "");

src/modules/packages/packages.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ void ffPrintPackages(FFPackagesOptions* options)
5050
FF_PRINT_PACKAGE_NAME(nixDefault, "nix-default")
5151
FF_PRINT_PACKAGE(apk)
5252
FF_PRINT_PACKAGE(pkg)
53+
FF_PRINT_PACKAGE(pkgsrc)
5354
FF_PRINT_PACKAGE_NAME(flatpakSystem, counts.flatpakUser ? "flatpak-system" : "flatpak")
5455
FF_PRINT_PACKAGE_NAME(flatpakUser, "flatpak-user")
5556
FF_PRINT_PACKAGE(snap)
@@ -121,6 +122,7 @@ void ffPrintPackages(FFPackagesOptions* options)
121122
FF_FORMAT_ARG(counts.mport, "mport"),
122123
FF_FORMAT_ARG(counts.qi, "qi"),
123124
FF_FORMAT_ARG(counts.amUser, "am-user"),
125+
FF_FORMAT_ARG(counts.pkgsrc, "pkgsrc"),
124126
FF_FORMAT_ARG(nixAll, "nix-all"),
125127
FF_FORMAT_ARG(flatpakAll, "flatpak-all"),
126128
FF_FORMAT_ARG(brewAll, "brew-all"),
@@ -197,6 +199,7 @@ bool ffParsePackagesCommandOptions(FFPackagesOptions* options, const char* key,
197199
FF_TEST_PACKAGE_NAME(PALUDIS)
198200
FF_TEST_PACKAGE_NAME(PKG)
199201
FF_TEST_PACKAGE_NAME(PKGTOOL)
202+
FF_TEST_PACKAGE_NAME(PKGSRC)
200203
break;
201204
case 'Q': if (false);
202205
FF_TEST_PACKAGE_NAME(QI)
@@ -311,6 +314,7 @@ void ffParsePackagesJsonObject(FFPackagesOptions* options, yyjson_val* module)
311314
FF_TEST_PACKAGE_NAME(PALUDIS)
312315
FF_TEST_PACKAGE_NAME(PKG)
313316
FF_TEST_PACKAGE_NAME(PKGTOOL)
317+
FF_TEST_PACKAGE_NAME(PKGSRC)
314318
break;
315319
case 'Q': if (false);
316320
FF_TEST_PACKAGE_NAME(QI)
@@ -373,6 +377,7 @@ void ffGeneratePackagesJsonConfig(FFPackagesOptions* options, yyjson_mut_doc* do
373377
FF_TEST_PACKAGE_NAME(PALUDIS)
374378
FF_TEST_PACKAGE_NAME(PKG)
375379
FF_TEST_PACKAGE_NAME(PKGTOOL)
380+
FF_TEST_PACKAGE_NAME(PKGSRC)
376381
FF_TEST_PACKAGE_NAME(QI)
377382
FF_TEST_PACKAGE_NAME(RPM)
378383
FF_TEST_PACKAGE_NAME(SCOOP)
@@ -427,6 +432,7 @@ void ffGeneratePackagesJsonResult(FF_MAYBE_UNUSED FFPackagesOptions* options, yy
427432
FF_APPEND_PACKAGE_COUNT(paludis)
428433
FF_APPEND_PACKAGE_COUNT(pkg)
429434
FF_APPEND_PACKAGE_COUNT(pkgtool)
435+
FF_APPEND_PACKAGE_COUNT(pkgsrc)
430436
FF_APPEND_PACKAGE_COUNT(qi)
431437
FF_APPEND_PACKAGE_COUNT(macports)
432438
FF_APPEND_PACKAGE_COUNT(rpm)
@@ -484,6 +490,7 @@ static FFModuleBaseInfo ffModuleInfo = {
484490
{"Number of mport packages", "mport"},
485491
{"Number of qi packages", "qi"},
486492
{"Number of am-user (aka appman) packages", "am-user"},
493+
{"Number of pkgsrc packages", "pkgsrc"},
487494
{"Total number of all nix packages", "nix-all"},
488495
{"Total number of all flatpak app packages", "flatpak-all"},
489496
{"Total number of all brew packages", "brew-all"},

0 commit comments

Comments
 (0)