From bb53bb8ee5ec7f13a0e6658e8399542f338c477e Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 13 Mar 2020 08:38:08 -0700 Subject: [PATCH] fix pvxvct Actually apply PV name and host/network filters. --- tools/pvxvct.cpp | 50 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/tools/pvxvct.cpp b/tools/pvxvct.cpp index 699ab79..699283b 100644 --- a/tools/pvxvct.cpp +++ b/tools/pvxvct.cpp @@ -31,7 +31,7 @@ namespace { DEFINE_LOGGER(out, "pvxvct"); // parse hostname, IP, or IP+netmask -std::tuple +std::pair parsePeer(const char *optarg) { // nameorip @@ -72,7 +72,7 @@ parsePeer(const char *optarg) // 1.2.3.4/24 === 1.2.3.0/24 addr.s_addr &= mask.s_addr; - return std::make_tuple(addr.s_addr, mask.s_addr); + return std::make_pair(addr.s_addr, mask.s_addr); } void usage(const char *name) @@ -100,18 +100,32 @@ int main(int argc, char *argv[]) try { // group options used from callback struct { + bool verbose = false; bool client = false, server = false; - // IP, netmask, port + // IP, netmask // stored in network byte order - std::vector> peers; + std::vector> peers; std::set pvnames; + + bool allowPeer(const pva::SockAddr& peer) { + if(peers.empty()) + return true; + if(peer.family()!=AF_INET) + return false; + for(auto& pair : peers) { + if((peer->in.sin_addr.s_addr & pair.second) == pair.first) { + return true; + } + } + return false; + } } opts; std::vector bindaddrs; { int opt; - while ((opt = getopt(argc, argv, "hCSH:B:P:")) != -1) { + while ((opt = getopt(argc, argv, "hvCSH:B:P:")) != -1) { switch(opt) { case 'h': usage(argv[0]); @@ -120,6 +134,9 @@ int main(int argc, char *argv[]) usage(argv[0]); std::cerr<<"\nUnknown argument: "<