Skip to content

Commit b282ac5

Browse files
committed
Packages (Linux): support am-user
Fix #771
1 parent 6577884 commit b282ac5

File tree

4 files changed

+51
-22
lines changed

4 files changed

+51
-22
lines changed

src/detection/packages/packages.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
typedef struct FFPackagesResult
66
{
7-
uint32_t am;
7+
uint32_t amSystem;
8+
uint32_t amUser;
89
uint32_t apk;
910
uint32_t brew;
1011
uint32_t brewCask;

src/detection/packages/packages_linux.c

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,29 @@ static uint32_t getRpmFromLibrpm(void)
386386

387387
#endif //FF_HAVE_RPM
388388

389-
static uint32_t getAM(FFstrbuf* baseDir)
389+
static uint32_t getAMPackages(FFstrbuf* baseDir)
390+
{
391+
uint32_t baseLength = baseDir->length;
392+
FF_AUTO_CLOSE_DIR DIR* dirp = opendir(baseDir->chars);
393+
if (!dirp) return 0;
394+
395+
uint32_t result = 0;
396+
struct dirent *entry;
397+
while ((entry = readdir(dirp)) != NULL)
398+
{
399+
if (entry->d_name[0] == '.') continue;
400+
if (entry->d_type == DT_DIR)
401+
{
402+
ffStrbufAppendF(baseDir, "/%s/remove", entry->d_name);
403+
if (ffPathExists(baseDir->chars, FF_PATHTYPE_FILE))
404+
++result;
405+
ffStrbufSubstrBefore(baseDir, baseLength);
406+
}
407+
}
408+
return result;
409+
}
410+
411+
static uint32_t getAMSystem(FFstrbuf* baseDir)
390412
{
391413
// #771
392414
uint32_t baseDirLength = baseDir->length;
@@ -401,28 +423,26 @@ static uint32_t getAM(FFstrbuf* baseDir)
401423
{
402424
++result; // `am` itself is counted as a package too
403425
ffStrbufSubstrBefore(baseDir, optDirLength);
404-
FF_AUTO_CLOSE_DIR DIR* dirp = opendir(baseDir->chars);
405-
if(dirp)
406-
{
407-
struct dirent *entry;
408-
while ((entry = readdir(dirp)) != NULL)
409-
{
410-
if (entry->d_name[0] == '.') continue;
411-
if (entry->d_type == DT_DIR)
412-
{
413-
ffStrbufAppendF(baseDir, "/%s/AM-updater", entry->d_name);
414-
if (ffPathExists(baseDir->chars, FF_PATHTYPE_FILE))
415-
++result;
416-
ffStrbufSubstrBefore(baseDir, optDirLength);
417-
}
418-
}
419-
}
426+
result = getAMPackages(baseDir);
420427
}
421428

422429
ffStrbufSubstrBefore(baseDir, baseDirLength);
423430
return result;
424431
}
425432

433+
static uint32_t getAMUser(void)
434+
{
435+
// check if $XDG_CONFIG_HOME/appman/appman-config exists
436+
FFstrbuf* baseDir = FF_LIST_GET(FFstrbuf, instance.state.platform.configDirs, 0);
437+
uint32_t baseLen = baseDir->length;
438+
ffStrbufAppendS(baseDir, "appman/appman-config");
439+
FF_STRBUF_AUTO_DESTROY packagesPath = ffStrbufCreate();
440+
ffReadFileBuffer(baseDir->chars, &packagesPath);
441+
ffStrbufSubstrBefore(baseDir, baseLen);
442+
443+
return packagesPath.length > 0 ? getAMPackages(&packagesPath) : 0;
444+
}
445+
426446
static int compareHash(const void* a, const void* b)
427447
{
428448
return memcmp(a, b, 32);
@@ -565,7 +585,7 @@ static void getPackageCounts(FFstrbuf* baseDir, FFPackagesResult* packageCounts,
565585
}
566586
if (!(options->disabled & FF_PACKAGES_FLAG_PALUDIS_BIT)) packageCounts->paludis += countFilesRecursive(baseDir, "/var/db/paludis/repositories", "environment.bz2");
567587
if (!(options->disabled & FF_PACKAGES_FLAG_OPKG_BIT)) packageCounts->opkg += getNumStrings(baseDir, "/usr/lib/opkg/status", "Package:", "opkg"); // openwrt
568-
if (!(options->disabled & FF_PACKAGES_FLAG_AM_BIT)) packageCounts->am = getAM(baseDir);
588+
if (!(options->disabled & FF_PACKAGES_FLAG_AM_BIT)) packageCounts->amSystem = getAMSystem(baseDir);
569589
if (!(options->disabled & FF_PACKAGES_FLAG_SORCERY_BIT)) packageCounts->sorcery += getNumStrings(baseDir, "/var/state/sorcery/packages", ":installed:", "sorcery");
570590
if (!(options->disabled & FF_PACKAGES_FLAG_GUIX_BIT))
571591
{
@@ -678,4 +698,8 @@ void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options)
678698

679699
if (!(options->disabled & FF_PACKAGES_FLAG_FLATPAK_BIT))
680700
result->flatpakUser = getFlatpakPackages(&baseDir, "/.local/share");
701+
702+
if (!(options->disabled & FF_PACKAGES_FLAG_AM_BIT))
703+
result->amUser = getAMUser();
704+
681705
}

src/modules/packages/packages.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ void ffPrintPackages(FFPackagesOptions* options)
6262
FF_PRINT_PACKAGE(paludis)
6363
FF_PRINT_PACKAGE(winget)
6464
FF_PRINT_PACKAGE(opkg)
65-
FF_PRINT_PACKAGE(am)
65+
FF_PRINT_PACKAGE_NAME(amSystem, counts.amUser ? "am-system" : "am")
66+
FF_PRINT_PACKAGE_NAME(amUser, "am-user")
6667
FF_PRINT_PACKAGE(sorcery)
6768
FF_PRINT_PACKAGE(lpkg)
6869
FF_PRINT_PACKAGE(lpkgbuild)
@@ -108,7 +109,7 @@ void ffPrintPackages(FFPackagesOptions* options)
108109
FF_FORMAT_ARG(counts.paludis, "paludis"),
109110
FF_FORMAT_ARG(counts.winget, "winget"),
110111
FF_FORMAT_ARG(counts.opkg, "opkg"),
111-
FF_FORMAT_ARG(counts.am, "am"),
112+
FF_FORMAT_ARG(counts.amSystem, "am-system"),
112113
FF_FORMAT_ARG(counts.sorcery, "sorcery"),
113114
FF_FORMAT_ARG(counts.lpkg, "lpkg"),
114115
FF_FORMAT_ARG(counts.lpkgbuild, "lpkgbuild"),
@@ -119,6 +120,7 @@ void ffPrintPackages(FFPackagesOptions* options)
119120
FF_FORMAT_ARG(counts.pacstall, "pacstall"),
120121
FF_FORMAT_ARG(counts.mport, "mport"),
121122
FF_FORMAT_ARG(counts.qi, "qi"),
123+
FF_FORMAT_ARG(counts.amUser, "am-user"),
122124
FF_FORMAT_ARG(nixAll, "nix-all"),
123125
FF_FORMAT_ARG(flatpakAll, "flatpak-all"),
124126
FF_FORMAT_ARG(brewAll, "brew-all"),
@@ -400,7 +402,8 @@ void ffGeneratePackagesJsonResult(FF_MAYBE_UNUSED FFPackagesOptions* options, yy
400402
#define FF_APPEND_PACKAGE_COUNT(name) yyjson_mut_obj_add_uint(doc, obj, #name, counts.name);
401403

402404
FF_APPEND_PACKAGE_COUNT(all)
403-
FF_APPEND_PACKAGE_COUNT(am)
405+
FF_APPEND_PACKAGE_COUNT(amSystem)
406+
FF_APPEND_PACKAGE_COUNT(amUser)
404407
FF_APPEND_PACKAGE_COUNT(apk)
405408
FF_APPEND_PACKAGE_COUNT(brew)
406409
FF_APPEND_PACKAGE_COUNT(brewCask)

src/util/platform/FFPlatform_unix.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ static void getCacheDir(FFPlatform* platform)
109109

110110
static void getConfigDirs(FFPlatform* platform)
111111
{
112+
// Always make sure `${XDG_CONFIG_HOME:-$HOME/.config}` is the first entry
112113
platformPathAddEnv(&platform->configDirs, "XDG_CONFIG_HOME");
113114
ffPlatformPathAddHome(&platform->configDirs, platform, ".config/");
114115

0 commit comments

Comments
 (0)