master ohmu/fastfetch-openbsd / src / detection / processes / processes_bsd.c
ohmu  ·  2026-10-15
 1#include "processes.h"
 2#include "common/debug.h"
 3#include "common/mallocHelper.h"
 4
 5#include <errno.h>
 6#include <string.h>
 7#include <sys/sysctl.h>
 8#include <sys/types.h>
 9#include <sys/user.h>
10
11const char* ffDetectProcesses(const FFProcessesOptions* options, FFProcessesResult* result) {
12    int request[] = { CTL_KERN, KERN_PROC, KERN_PROC_PROC };
13    size_t length;
14    if (sysctl(request, ARRAY_SIZE(request), nullptr, &length, nullptr, 0) != 0) {
15        FF_DEBUG("sysctl({CTL_KERN, KERN_PROC, KERN_PROC_PROC}) failed: %s", strerror(errno));
16        return "sysctl({CTL_KERN, KERN_PROC, KERN_PROC_PROC}) failed";
17    }
18
19    // The process table may change between the two sysctl calls; retry with a larger buffer.
20    length += length / 8 + sizeof(struct kinfo_proc);
21    FF_AUTO_FREE struct kinfo_proc* procs = malloc(length);
22    if (sysctl(request, ARRAY_SIZE(request), procs, &length, nullptr, 0) != 0) {
23        FF_DEBUG("sysctl({CTL_KERN, KERN_PROC, KERN_PROC_PROC}) failed: %s", strerror(errno));
24        return "sysctl({CTL_KERN, KERN_PROC, KERN_PROC_PROC}) failed";
25    }
26    
27    uint32_t count = (uint32_t) (length / sizeof(struct kinfo_proc));
28    for (uint32_t i = 0; i < count; ++i) {
29        const struct kinfo_proc* proc = &procs[i];
30
31        if (!options->countKprocs && (proc->ki_flag & P_KPROC)) {
32            continue;
33        }
34
35        result->processes++;
36        result->threads += (uint32_t) proc->ki_numthreads;
37    }
38
39    return nullptr;
40}