Changeset View
Changeset View
Standalone View
Standalone View
usr.bin/netstat/nhops.c
Show First 20 Lines • Show All 55 Lines • ▼ Show 20 Lines | |||||
#include <stdbool.h> | #include <stdbool.h> | ||||
#include <stdint.h> | #include <stdint.h> | ||||
#include <stdio.h> | #include <stdio.h> | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <stdbool.h> | #include <stdbool.h> | ||||
#include <string.h> | #include <string.h> | ||||
#include <sysexits.h> | #include <sysexits.h> | ||||
#include <unistd.h> | #include <unistd.h> | ||||
#include <err.h> | |||||
#include <libxo/xo.h> | #include <libxo/xo.h> | ||||
#include "netstat.h" | #include "netstat.h" | ||||
#include "common.h" | #include "common.h" | ||||
/* column widths; each followed by one space */ | /* column widths; each followed by one space */ | ||||
#ifndef INET6 | #ifndef INET6 | ||||
#define WID_DST_DEFAULT(af) 18 /* width of destination column */ | #define WID_DST_DEFAULT(af) 18 /* width of destination column */ | ||||
#define WID_GW_DEFAULT(af) 18 /* width of gateway column */ | #define WID_GW_DEFAULT(af) 18 /* width of gateway column */ | ||||
▲ Show 20 Lines • Show All 139 Lines • ▼ Show 20 Lines | if (map->size == 0) | ||||
new_size = 32; | new_size = 32; | ||||
else | else | ||||
new_size = map->size * 2; | new_size = map->size * 2; | ||||
if (new_size <= idx) | if (new_size <= idx) | ||||
new_size = roundup2(idx + 1, 32); | new_size = roundup2(idx + 1, 32); | ||||
sz = new_size * (sizeof(struct nhop_entry)); | sz = new_size * (sizeof(struct nhop_entry)); | ||||
if ((map->ptr = realloc(map->ptr, sz)) == NULL) | if ((map->ptr = realloc(map->ptr, sz)) == NULL) | ||||
errx(2, "realloc(%zu) failed", sz); | xo_errx(EX_OSERR, "realloc(%zu) failed", sz); | ||||
des: `EX_OSERR` | |||||
memset(&map->ptr[map->size], 0, (new_size - map->size) * sizeof(struct nhop_entry)); | memset(&map->ptr[map->size], 0, (new_size - map->size) * sizeof(struct nhop_entry)); | ||||
map->size = new_size; | map->size = new_size; | ||||
} | } | ||||
strlcpy(map->ptr[idx].ifname, ifname, sizeof(map->ptr[idx].ifname)); | strlcpy(map->ptr[idx].ifname, ifname, sizeof(map->ptr[idx].ifname)); | ||||
strlcpy(map->ptr[idx].gw, gw, sizeof(map->ptr[idx].gw)); | strlcpy(map->ptr[idx].gw, gw, sizeof(map->ptr[idx].gw)); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 122 Lines • ▼ Show 20 Lines | dump_nhops_sysctl(int fibnum, int af, struct nhops_dump *nd) | ||||
mib[0] = CTL_NET; | mib[0] = CTL_NET; | ||||
mib[1] = PF_ROUTE; | mib[1] = PF_ROUTE; | ||||
mib[2] = 0; | mib[2] = 0; | ||||
mib[3] = af; | mib[3] = af; | ||||
mib[4] = NET_RT_NHOP; | mib[4] = NET_RT_NHOP; | ||||
mib[5] = 0; | mib[5] = 0; | ||||
mib[6] = fibnum; | mib[6] = fibnum; | ||||
if (sysctl(mib, nitems(mib), NULL, &needed, NULL, 0) < 0) | if (sysctl(mib, nitems(mib), NULL, &needed, NULL, 0) < 0) | ||||
err(EX_OSERR, "sysctl: net.route.0.%d.nhdump.%d estimate", af, | xo_err(EX_OSERR, "sysctl: net.route.0.%d.nhdump.%d estimate", af, | ||||
fibnum); | fibnum); | ||||
if ((buf = malloc(needed)) == NULL) | if ((buf = malloc(needed)) == NULL) | ||||
errx(2, "malloc(%lu)", (unsigned long)needed); | xo_errx(EX_OSERR, "malloc(%lu)", (unsigned long)needed); | ||||
Not Done Inline ActionsEX_OSERR des: `EX_OSERR` | |||||
if (sysctl(mib, nitems(mib), buf, &needed, NULL, 0) < 0) | if (sysctl(mib, nitems(mib), buf, &needed, NULL, 0) < 0) | ||||
err(1, "sysctl: net.route.0.%d.nhdump.%d", af, fibnum); | xo_err(EX_OSERR, "sysctl: net.route.0.%d.nhdump.%d", af, fibnum); | ||||
Not Done Inline ActionsEX_OSERR des: `EX_OSERR` | |||||
lim = buf + needed; | lim = buf + needed; | ||||
/* | /* | ||||
* nexhops are received unsorted. Collect everything first, sort and then display | * nexhops are received unsorted. Collect everything first, sort and then display | ||||
* sorted. | * sorted. | ||||
*/ | */ | ||||
nh_count = 0; | nh_count = 0; | ||||
nh_size = 16; | nh_size = 16; | ||||
▲ Show 20 Lines • Show All 89 Lines • ▼ Show 20 Lines | nhops_print(int fibnum, int af) | ||||
intsize = sizeof(int); | intsize = sizeof(int); | ||||
if (fibnum == -1 && | if (fibnum == -1 && | ||||
sysctlbyname("net.my_fibnum", &fibnum, &intsize, NULL, 0) == -1) | sysctlbyname("net.my_fibnum", &fibnum, &intsize, NULL, 0) == -1) | ||||
fibnum = 0; | fibnum = 0; | ||||
if (sysctlbyname("net.fibs", &numfibs, &intsize, NULL, 0) == -1) | if (sysctlbyname("net.fibs", &numfibs, &intsize, NULL, 0) == -1) | ||||
numfibs = 1; | numfibs = 1; | ||||
if (fibnum < 0 || fibnum > numfibs - 1) | if (fibnum < 0 || fibnum > numfibs - 1) | ||||
errx(EX_USAGE, "%d: invalid fib", fibnum); | xo_errx(EX_USAGE, "%d: invalid fib", fibnum); | ||||
ifmap = prepare_ifmap(&ifmap_size); | ifmap = prepare_ifmap(&ifmap_size); | ||||
xo_open_container("route-nhop-information"); | xo_open_container("route-nhop-information"); | ||||
xo_emit("{T:Nexthop data}"); | xo_emit("{T:Nexthop data}"); | ||||
if (fibnum) | if (fibnum) | ||||
xo_emit(" ({L:fib}: {:fib/%d})", fibnum); | xo_emit(" ({L:fib}: {:fib/%d})", fibnum); | ||||
xo_emit("\n"); | xo_emit("\n"); | ||||
print_nhops_sysctl(fibnum, af); | print_nhops_sysctl(fibnum, af); | ||||
xo_close_container("route-nhop-information"); | xo_close_container("route-nhop-information"); | ||||
} | } | ||||
EX_OSERR