master ohmu/fastfetch-openbsd / src / common / impl / FFPlatform.c
ohmu  ·  2026-10-15
 1#include "FFPlatform_private.h"
 2#include "common/strutil.h"
 3#include "common/io.h"
 4#include "detection/version/version.h"
 5
 6void ffPlatformInit(FFPlatform* platform) {
 7    ffStrbufInit(&platform->homeDir);
 8    ffStrbufInit(&platform->cacheDir);
 9    ffListInit(&platform->configDirs);
10    ffListInit(&platform->dataDirs);
11    ffStrbufInit(&platform->exePath);
12    ffStrbufInit(&platform->cwd);
13
14    ffStrbufInit(&platform->userName);
15    ffStrbufInit(&platform->fullUserName);
16    ffStrbufInit(&platform->hostName);
17    ffStrbufInit(&platform->userShell);
18
19#ifdef _WIN32
20    ffStrbufInit(&platform->sid);
21    platform->initCP = 0;
22#endif
23
24    FFPlatformSysinfo* info = &platform->sysinfo;
25
26    ffStrbufInit(&info->name);
27    ffStrbufInit(&info->release);
28    ffStrbufInit(&info->version);
29    ffStrbufInit(&info->architecture);
30    info->pageSizeShift = 12; // 4096, reasonable fallback
31
32    ffPlatformInitImpl(platform);
33
34    if (info->name.length == 0) {
35        ffStrbufSetStatic(&info->name, ffVersionResult.sysName);
36    }
37
38    if (info->architecture.length == 0) {
39        ffStrbufSetStatic(&info->architecture, ffVersionResult.architecture);
40    }
41}
42
43void ffPlatformDestroy(FFPlatform* platform) {
44    ffStrbufDestroy(&platform->homeDir);
45    ffStrbufDestroy(&platform->cacheDir);
46
47    FF_LIST_FOR_EACH (FFstrbuf, dir, platform->configDirs) {
48        ffStrbufDestroy(dir);
49    }
50    ffListDestroy(&platform->configDirs);
51
52    FF_LIST_FOR_EACH (FFstrbuf, dir, platform->dataDirs) {
53        ffStrbufDestroy(dir);
54    }
55    ffListDestroy(&platform->dataDirs);
56    ffStrbufDestroy(&platform->exePath);
57    ffStrbufDestroy(&platform->cwd);
58
59    ffStrbufDestroy(&platform->userName);
60    ffStrbufDestroy(&platform->hostName);
61    ffStrbufDestroy(&platform->userShell);
62    ffStrbufDestroy(&platform->fullUserName);
63
64#ifdef _WIN32
65    ffStrbufDestroy(&platform->sid);
66#endif
67
68    FFPlatformSysinfo* info = &platform->sysinfo;
69    ffStrbufDestroy(&info->architecture);
70    ffStrbufDestroy(&info->name);
71    ffStrbufDestroy(&info->release);
72    ffStrbufDestroy(&info->version);
73}
74
75void ffPlatformPathAddAbsolute(FFlist* dirs, const char* path) {
76    if (!ffPathExists(path, FF_PATHTYPE_DIRECTORY)) {
77        return;
78    }
79
80    FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreateS(path);
81    ffStrbufEnsureEndsWithC(&buffer, '/');
82    if (!FF_LIST_CONTAINS(*dirs, &buffer, ffStrbufEqual)) {
83        ffStrbufInitMove(FF_LIST_ADD(FFstrbuf, *dirs), &buffer);
84    }
85}
86
87void ffPlatformPathAddHome(FFlist* dirs, const FFPlatform* platform, const char* suffix) {
88    FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreateA(64);
89    ffStrbufAppend(&buffer, &platform->homeDir);
90    ffStrbufAppendS(&buffer, suffix);
91    ffStrbufEnsureEndsWithC(&buffer, '/');
92    if (ffPathExists(buffer.chars, FF_PATHTYPE_DIRECTORY) && !FF_LIST_CONTAINS(*dirs, &buffer, ffStrbufEqual)) {
93        ffStrbufInitMove(FF_LIST_ADD(FFstrbuf, *dirs), &buffer);
94    }
95}