Skip to content

Commit a77d972

Browse files
committed
Packages (Linux): count flatpak runtime packages
Fix #1085
1 parent 10868ed commit a77d972

File tree

1 file changed

+74
-2
lines changed

1 file changed

+74
-2
lines changed

src/detection/packages/packages_linux.c

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -467,14 +467,86 @@ static uint32_t getGuixPackages(FFstrbuf* baseDir, const char* dirname)
467467
return num_elements;
468468
}
469469

470+
static inline uint32_t getFlatpakRuntimePackagesArch(FFstrbuf* baseDir)
471+
{
472+
FF_AUTO_CLOSE_DIR DIR* dirp = opendir(baseDir->chars);
473+
if (dirp == NULL)
474+
return 0;
475+
476+
uint32_t num_elements = 0;
477+
478+
struct dirent *entry;
479+
while ((entry = readdir(dirp)) != NULL)
480+
{
481+
if(entry->d_type == DT_DIR && entry->d_name[0] != '.')
482+
{
483+
num_elements += getNumElements(baseDir, entry->d_name, DT_DIR);
484+
}
485+
}
486+
487+
return num_elements;
488+
}
489+
490+
static inline uint32_t getFlatpakRuntimePackages(FFstrbuf* baseDir)
491+
{
492+
ffStrbufAppendS(baseDir, "runtime/");
493+
FF_AUTO_CLOSE_DIR DIR* dirp = opendir(baseDir->chars);
494+
if (dirp == NULL)
495+
return 0;
496+
497+
uint32_t runtimeDirLength = baseDir->length;
498+
uint32_t num_elements = 0;
499+
500+
struct dirent *entry;
501+
while ((entry = readdir(dirp)) != NULL)
502+
{
503+
if(entry->d_type == DT_DIR && entry->d_name[0] != '.')
504+
{
505+
// `flatpak list` ignores `.Locale` and `.Debug` packages, and maybe others
506+
const char* dot = strrchr(entry->d_name, '.');
507+
if (__builtin_expect(!dot, false)) continue;
508+
dot++;
509+
510+
if (ffStrEquals(dot, "Locale") || ffStrEquals(dot, "Debug"))
511+
continue;
512+
513+
ffStrbufAppendS(baseDir, entry->d_name);
514+
ffStrbufAppendC(baseDir, '/');
515+
num_elements += getFlatpakRuntimePackagesArch(baseDir);
516+
ffStrbufSubstrBefore(baseDir, runtimeDirLength);
517+
}
518+
}
519+
520+
return num_elements;
521+
}
522+
523+
static uint32_t getFlatpakPackages(FFstrbuf* baseDir, const char* dirname)
524+
{
525+
uint32_t num_elements = 0;
526+
uint32_t baseDirLength = baseDir->length;
527+
ffStrbufAppendS(baseDir, dirname);
528+
ffStrbufAppendS(baseDir, "/flatpak/");
529+
uint32_t flatpakDirLength = baseDir->length;
530+
531+
ffStrbufAppendS(baseDir, "app");
532+
num_elements += getNumElementsImpl(baseDir->chars, DT_DIR);
533+
ffStrbufSubstrBefore(baseDir, flatpakDirLength);
534+
535+
num_elements += getFlatpakRuntimePackages(baseDir);
536+
537+
ffStrbufSubstrBefore(baseDir, baseDirLength);
538+
539+
return num_elements;
540+
}
541+
470542
static void getPackageCounts(FFstrbuf* baseDir, FFPackagesResult* packageCounts, FFPackagesOptions* options)
471543
{
472544
if (!(options->disabled & FF_PACKAGES_FLAG_APK_BIT)) packageCounts->apk += getNumStrings(baseDir, "/lib/apk/db/installed", "C:Q", "apk");
473545
if (!(options->disabled & FF_PACKAGES_FLAG_DPKG_BIT)) packageCounts->dpkg += getNumStrings(baseDir, "/var/lib/dpkg/status", "Status: install ok installed", "dpkg");
474546
if (!(options->disabled & FF_PACKAGES_FLAG_LPKG_BIT)) packageCounts->lpkg += getNumStrings(baseDir, "/opt/Loc-OS-LPKG/installed-lpkg/Listinstalled-lpkg.list", "\n", "lpkg");
475547
if (!(options->disabled & FF_PACKAGES_FLAG_EMERGE_BIT)) packageCounts->emerge += countFilesRecursive(baseDir, "/var/db/pkg", "SIZE");
476548
if (!(options->disabled & FF_PACKAGES_FLAG_EOPKG_BIT)) packageCounts->eopkg += getNumElements(baseDir, "/var/lib/eopkg/package", DT_DIR);
477-
if (!(options->disabled & FF_PACKAGES_FLAG_FLATPAK_BIT)) packageCounts->flatpakSystem += getNumElements(baseDir, "/var/lib/flatpak/app", DT_DIR);
549+
if (!(options->disabled & FF_PACKAGES_FLAG_FLATPAK_BIT)) packageCounts->flatpakSystem += getFlatpakPackages(baseDir, "/var/lib");
478550
if (!(options->disabled & FF_PACKAGES_FLAG_NIX_BIT))
479551
{
480552
packageCounts->nixDefault += getNixPackages(baseDir, "/nix/var/nix/profiles/default");
@@ -603,5 +675,5 @@ void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options)
603675
}
604676

605677
if (!(options->disabled & FF_PACKAGES_FLAG_FLATPAK_BIT))
606-
result->flatpakUser = getNumElements(&baseDir, "/.local/share/flatpak/app", DT_DIR);
678+
result->flatpakUser = getFlatpakPackages(&baseDir, "/.local/share");
607679
}

0 commit comments

Comments
 (0)