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}