summaryrefslogtreecommitdiffstats
path: root/src/common/impl/FFPlatform.c
blob: ff4c45cd2193b8941c5dbc64656d4e64a34af2c7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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);
    }
}