diff --git a/net/darkstat/patches/101-allow-multiple-local-interfaces.patch b/net/darkstat/patches/101-allow-multiple-local-interfaces.patch new file mode 100644 index 000000000..b2b22faa5 --- /dev/null +++ b/net/darkstat/patches/101-allow-multiple-local-interfaces.patch @@ -0,0 +1,70 @@ +--- a/acct.c ++++ b/acct.c +@@ -37,8 +37,9 @@ + + uint64_t acct_total_packets = 0, acct_total_bytes = 0; + ++#define LOCAL_NET_MAX 10 + static int using_localnet4 = 0, using_localnet6 = 0; +-static struct addr localnet4, localmask4, localnet6, localmask6; ++static struct addr localnet4[LOCAL_NET_MAX], localmask4[LOCAL_NET_MAX], localnet6[LOCAL_NET_MAX], localmask6[LOCAL_NET_MAX]; + + /* Parse the net/mask specification into two IPs or die trying. */ + void +@@ -120,13 +121,19 @@ acct_init_localnet(const char *spec) + /* Register the correct netmask and calculate the correct net. */ + addr_mask(&localnet, &localmask); + if (localnet.family == IPv6) { +- using_localnet6 = 1; +- localnet6 = localnet; +- localmask6 = localmask; ++ if(using_localnet6 >= LOCAL_NET_MAX){ ++ errx(1, "Exceeded maximum IPv6 local networks"); ++ } ++ localnet6[using_localnet6] = localnet; ++ localmask6[using_localnet6] = localmask; ++ using_localnet6++; + } else { +- using_localnet4 = 1; +- localnet4 = localnet; +- localmask4 = localmask; ++ if(using_localnet4 >= LOCAL_NET_MAX){ ++ errx(1, "Exceeded maximum IPv4 local networks"); ++ } ++ localnet4[using_localnet4] = localnet; ++ localmask4[using_localnet4] = localmask; ++ using_localnet4++; + } + + verbosef("local network address: %s", addr_to_str(&localnet)); +@@ -138,11 +145,15 @@ static int addr_is_local(const struct addr * const a, + if (is_localip(a, local_ips)) + return 1; + if (a->family == IPv4 && using_localnet4) { +- if (addr_inside(a, &localnet4, &localmask4)) +- return 1; ++ for (int i=0; i < using_localnet4; i++){ ++ if (addr_inside(a, &localnet4[i], &localmask4[i])) ++ return 1; ++ } + } else if (a->family == IPv6 && using_localnet6) { +- if (addr_inside(a, &localnet6, &localmask6)) +- return 1; ++ for (int i=0; i < using_localnet6; i++){ ++ if (addr_inside(a, &localnet6[i], &localmask6[i])) ++ return 1; ++ } + } + return 0; + } +--- a/darkstat.c ++++ b/darkstat.c +@@ -193,7 +193,7 @@ static struct cmdline_arg cmdline_args[] = { + {"-r", "capfile", cb_capfile, 0}, + {"-p", "port", cb_port, 0}, + {"-b", "bindaddr", cb_bindaddr, -1}, +- {"-l", "network/netmask", cb_local, 0}, ++ {"-l", "network/netmask", cb_local, -1}, + {"--base", "path", cb_base, 0}, + {"--local-only", NULL, cb_local_only, 0}, + {"--snaplen", "bytes", cb_snaplen, 0},