master ohmu/fastfetch-openbsd / src / detection / netio / netio_apple.c
ohmu  ·  2026-10-15
 1#include "netio.h"
 2
 3#include "common/debug.h"
 4#include "common/netif.h"
 5#include "common/mallocHelper.h"
 6
 7#include <errno.h>
 8#include <net/if.h>
 9#include <net/if_mib.h>
10#include <sys/sysctl.h>
11
12const char* ffNetIOGetIoCounters(FFlist* result, FFNetIOOptions* options) {
13    int mib[] = { CTL_NET, PF_LINK, NETLINK_GENERIC, options->defaultRouteOnly ? IFMIB_IFDATA : IFMIB_IFALLDATA, options->defaultRouteOnly ? (int) ffNetifGetDefaultRouteV4()->ifIndex : 0, IFDATA_GENERAL };
14
15    size_t bufSize = 0;
16    if (sysctl(mib, ARRAY_SIZE(mib), nullptr, &bufSize, 0, 0) < 0) {
17        FF_DEBUG("sysctl(mib, ARRAY_SIZE(mib), nullptr, &bufSize, 0, 0) failed: %s", strerror(errno));
18        return "sysctl(mib, ARRAY_SIZE(mib), nullptr, &bufSize, 0, 0) failed";
19    }
20
21    assert(bufSize % sizeof(struct ifmibdata) == 0);
22
23    FF_AUTO_FREE struct ifmibdata* buf = (struct ifmibdata*) malloc(bufSize);
24    if (sysctl(mib, ARRAY_SIZE(mib), buf, &bufSize, 0, 0) < 0) {
25        FF_DEBUG("sysctl(mib, ARRAY_SIZE(mib), buf, &bufSize, 0, 0) failed: %s", strerror(errno));
26        return "sysctl(mib, ARRAY_SIZE(mib), buf, &bufSize, 0, 0) failed";
27    }
28
29    size_t ifCount = bufSize / sizeof(struct ifmibdata);
30
31    const char* defaultRouteIfName = ffNetifGetDefaultRouteV4()->ifName;
32
33    for (size_t i = 0; i < ifCount; i++) {
34        struct ifmibdata* mibdata = &buf[i];
35        if (!(mibdata->ifmd_flags & IFF_RUNNING) || (mibdata->ifmd_flags & IFF_NOARP)) {
36            continue;
37        }
38
39        if (options->namePrefix.length && strncmp(mibdata->ifmd_name, options->namePrefix.chars, options->namePrefix.length) != 0) {
40            continue;
41        }
42
43        FFNetIOResult* counters = FF_LIST_ADD(FFNetIOResult, *result);
44        *counters = (FFNetIOResult) {
45            .name = ffStrbufCreateS(mibdata->ifmd_name),
46            .txBytes = mibdata->ifmd_data.ifi_obytes,
47            .rxBytes = mibdata->ifmd_data.ifi_ibytes,
48            .txPackets = mibdata->ifmd_data.ifi_opackets,
49            .rxPackets = mibdata->ifmd_data.ifi_ipackets,
50            .txErrors = mibdata->ifmd_data.ifi_oerrors,
51            .rxErrors = mibdata->ifmd_data.ifi_ierrors,
52            .txDrops = mibdata->ifmd_snd_drops,
53            .rxDrops = mibdata->ifmd_data.ifi_iqdrops,
54            .defaultRoute = strncmp(mibdata->ifmd_name, defaultRouteIfName, IFNAMSIZ) == 0,
55        };
56    }
57
58    return nullptr;
59}