master ohmu/fastfetch-openbsd / src / detection / users / users_obsd.c
ohmu  ·  2026-10-15
 1#include "fastfetch.h"
 2#include "users.h"
 3#include "common/debug.h"
 4#include "common/io.h"
 5
 6#include <errno.h>
 7#include <string.h>
 8
 9#include <utmp.h>
10
11const char* ffDetectUsers([[maybe_unused]] FFUsersOptions* options, FFlist* users) {
12    FF_AUTO_CLOSE_FILE FILE* fp = fopen(_PATH_UTMP, "r");
13    if (!fp) {
14        FF_DEBUG("fopen(\"%s\", \"r\") failed: %s", _PATH_UTMP, strerror(errno));
15        return "fopen(_PATH_UTMP, r) failed";
16    }
17
18    struct utmp n;
19next:
20    while (fread(&n, sizeof(n), 1, fp) == 1) {
21        if (!n.ut_name[0]) {
22            continue;
23        }
24
25        if (options->myselfOnly && !ffStrbufEqualS(&instance.state.platform.userName, n.ut_name)) {
26            continue;
27        }
28
29        FF_LIST_FOR_EACH (FFUserResult, user, *users) {
30            if (ffStrbufEqualS(&user->name, n.ut_name)) {
31                goto next;
32            }
33        }
34
35        FFUserResult* user = FF_LIST_ADD(FFUserResult, *users);
36        ffStrbufInitS(&user->name, n.ut_name);
37        ffStrbufInitS(&user->hostName, n.ut_host);
38        ffStrbufInitS(&user->sessionName, n.ut_line);
39        ffStrbufInit(&user->clientIp);
40        user->loginTime = (uint64_t) n.ut_time * 1000;
41    }
42
43    return nullptr;
44}