From 7fcd6a9d4f9faf24172cd44f753d2c7d3181466f Mon Sep 17 00:00:00 2001 From: Alastair Poole Date: Tue, 2 Mar 2021 22:15:01 +0000 Subject: [PATCH] freebsd: network. --- src/bin/system/machine/network.bogox | 29 +++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/bin/system/machine/network.bogox b/src/bin/system/machine/network.bogox index 4c1b16e..563b6fa 100644 --- a/src/bin/system/machine/network.bogox +++ b/src/bin/system/machine/network.bogox @@ -15,9 +15,8 @@ */ #if defined(__MacOS__) || defined(__FreeBSD__) || defined(__DragonFly__) -static void -_freebsd_generic_network_status(uint64_t *in, - uint64_t *out) +static net_iface_t ** +_freebsd_generic_network_status(int *n) { struct ifmibdata *ifmd; size_t len; @@ -25,11 +24,13 @@ _freebsd_generic_network_status(uint64_t *in, len = sizeof(count); if (sysctlbyname("net.link.generic.system.ifcount", &count, &len, NULL, 0) == -1) - return; + return NULL; ifmd = malloc(sizeof(struct ifmibdata)); if (!ifmd) - return; + return NULL; + + net_iface_t **ifaces = NULL; for (i = 1; i <= count; i++) { int mib[] = { @@ -39,10 +40,22 @@ _freebsd_generic_network_status(uint64_t *in, if (sysctl(mib, 6, ifmd, &len, NULL, 0) < 0) continue; if (!strcmp(ifmd->ifmd_name, "lo0")) continue; - *in += ifmd->ifmd_data.ifi_ibytes; - *out += ifmd->ifmd_data.ifi_obytes; + + net_iface_t *iface = malloc(sizeof(net_iface_t)); + if (iface) + { + snprintf(iface->name, sizeof(iface->name), "%s", + ifmd->ifmd_name); + iface->xfer.in = ifmd->ifmd_data.ifi_ibytes; + iface->xfer.out = ifmd->ifmd_data.ifi_obytes; + void *t = realloc(ifaces, (1 + 1 + *n) * sizeof(net_iface_t *)); + ifaces = t; + ifaces[(*n)++] = iface; + } } free(ifmd); + + return ifaces; } #endif @@ -158,6 +171,8 @@ system_network_ifaces_get(int *n) *n = 0; #if defined(__linux__) return _linux_generic_network_status(n); +#elif defined(__MacOS__) || defined(__FreeBSD__) || defined(__DragonFly__) + return _freebsd_generic_network_status(n); #elif defined(__OpenBSD__) return _openbsd_generic_network_status(n); #else