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}