summaryrefslogtreecommitdiffstats
path: root/src/common/impl/FFPlatform.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/impl/FFPlatform.c')
-rw-r--r--src/common/impl/FFPlatform.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/common/impl/FFPlatform.c b/src/common/impl/FFPlatform.c
new file mode 100644
index 0000000..ff4c45c
--- /dev/null
+++ b/src/common/impl/FFPlatform.c
@@ -0,0 +1,94 @@
+#include "FFPlatform_private.h"
+#include "common/strutil.h"
+#include "common/io.h"
+#include "detection/version/version.h"
+
+void ffPlatformInit(FFPlatform* platform) {
+ ffStrbufInit(&platform->homeDir);
+ ffStrbufInit(&platform->cacheDir);
+ ffListInit(&platform->configDirs);
+ ffListInit(&platform->dataDirs);
+ ffStrbufInit(&platform->exePath);
+ ffStrbufInit(&platform->cwd);
+
+ ffStrbufInit(&platform->userName);
+ ffStrbufInit(&platform->fullUserName);
+ ffStrbufInit(&platform->hostName);
+ ffStrbufInit(&platform->userShell);
+
+#ifdef _WIN32
+ ffStrbufInit(&platform->sid);
+#endif
+
+ FFPlatformSysinfo* info = &platform->sysinfo;
+
+ ffStrbufInit(&info->name);
+ ffStrbufInit(&info->release);
+ ffStrbufInit(&info->version);
+ ffStrbufInit(&info->architecture);
+ info->pageSize = 0;
+
+ ffPlatformInitImpl(platform);
+
+ if (info->name.length == 0) {
+ ffStrbufSetStatic(&info->name, ffVersionResult.sysName);
+ }
+
+ if (info->architecture.length == 0) {
+ ffStrbufSetStatic(&info->architecture, ffVersionResult.architecture);
+ }
+}
+
+void ffPlatformDestroy(FFPlatform* platform) {
+ ffStrbufDestroy(&platform->homeDir);
+ ffStrbufDestroy(&platform->cacheDir);
+
+ FF_LIST_FOR_EACH (FFstrbuf, dir, platform->configDirs) {
+ ffStrbufDestroy(dir);
+ }
+ ffListDestroy(&platform->configDirs);
+
+ FF_LIST_FOR_EACH (FFstrbuf, dir, platform->dataDirs) {
+ ffStrbufDestroy(dir);
+ }
+ ffListDestroy(&platform->dataDirs);
+ ffStrbufDestroy(&platform->exePath);
+ ffStrbufDestroy(&platform->cwd);
+
+ ffStrbufDestroy(&platform->userName);
+ ffStrbufDestroy(&platform->hostName);
+ ffStrbufDestroy(&platform->userShell);
+ ffStrbufDestroy(&platform->fullUserName);
+
+#ifdef _WIN32
+ ffStrbufDestroy(&platform->sid);
+#endif
+
+ FFPlatformSysinfo* info = &platform->sysinfo;
+ ffStrbufDestroy(&info->architecture);
+ ffStrbufDestroy(&info->name);
+ ffStrbufDestroy(&info->release);
+ ffStrbufDestroy(&info->version);
+}
+
+void ffPlatformPathAddAbsolute(FFlist* dirs, const char* path) {
+ if (!ffPathExists(path, FF_PATHTYPE_DIRECTORY)) {
+ return;
+ }
+
+ FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreateS(path);
+ ffStrbufEnsureEndsWithC(&buffer, '/');
+ if (!FF_LIST_CONTAINS(*dirs, &buffer, ffStrbufEqual)) {
+ ffStrbufInitMove(FF_LIST_ADD(FFstrbuf, *dirs), &buffer);
+ }
+}
+
+void ffPlatformPathAddHome(FFlist* dirs, const FFPlatform* platform, const char* suffix) {
+ FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreateA(64);
+ ffStrbufAppend(&buffer, &platform->homeDir);
+ ffStrbufAppendS(&buffer, suffix);
+ ffStrbufEnsureEndsWithC(&buffer, '/');
+ if (ffPathExists(buffer.chars, FF_PATHTYPE_DIRECTORY) && !FF_LIST_CONTAINS(*dirs, &buffer, ffStrbufEqual)) {
+ ffStrbufInitMove(FF_LIST_ADD(FFstrbuf, *dirs), &buffer);
+ }
+}