summaryrefslogtreecommitdiffstats
path: root/src/detection/users/users_obsd.c
blob: 97a22f039b8ffe6af2faec8b686160e2057a8f34 (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
#include "fastfetch.h"
#include "users.h"
#include "common/io.h"

#include <utmp.h>

const char* ffDetectUsers(FF_A_UNUSED FFUsersOptions* options, FFlist* users) {
    FF_AUTO_CLOSE_FILE FILE* fp = fopen(_PATH_UTMP, "r");
    if (!fp) {
        return "fopen(_PATH_UTMP, r) failed";
    }

    struct utmp n;
next:
    while (fread(&n, sizeof(n), 1, fp) == 1) {
        if (!n.ut_name[0]) {
            continue;
        }

        if (options->myselfOnly && !ffStrbufEqualS(&instance.state.platform.userName, n.ut_name)) {
            continue;
        }

        FF_LIST_FOR_EACH (FFUserResult, user, *users) {
            if (ffStrbufEqualS(&user->name, n.ut_name)) {
                goto next;
            }
        }

        FFUserResult* user = FF_LIST_ADD(FFUserResult, *users);
        ffStrbufInitS(&user->name, n.ut_name);
        ffStrbufInitS(&user->hostName, n.ut_host);
        ffStrbufInitS(&user->sessionName, n.ut_line);
        ffStrbufInit(&user->clientIp);
        user->loginTime = (uint64_t) n.ut_time * 1000;
    }

    return NULL;
}