diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 21:14:49 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 21:14:49 +0000 |
commit | 2f230033794fafdf10822568e763d4db68cf6c6b (patch) | |
tree | 39ca5c2325b7b43c9a28ca6d4ad4026a61e7eb97 /snmp-agent.cc | |
parent | Adding debian version 1.8.3-3. (diff) | |
download | dnsdist-2f230033794fafdf10822568e763d4db68cf6c6b.tar.xz dnsdist-2f230033794fafdf10822568e763d4db68cf6c6b.zip |
Merging upstream version 1.9.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'snmp-agent.cc')
-rw-r--r-- | snmp-agent.cc | 58 |
1 files changed, 22 insertions, 36 deletions
diff --git a/snmp-agent.cc b/snmp-agent.cc index f00bf6d..a335f31 100644 --- a/snmp-agent.cc +++ b/snmp-agent.cc @@ -25,8 +25,7 @@ # include <net-snmp/library/large_fd_set.h> #endif -const oid SNMPAgent::snmpTrapOID[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 }; -const size_t SNMPAgent::snmpTrapOIDLen = OID_LENGTH(SNMPAgent::snmpTrapOID); +const std::array<oid, 11> SNMPAgent::snmpTrapOID = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 }; int SNMPAgent::setCounter64Value(netsnmp_request_info* request, uint64_t value) @@ -41,32 +40,31 @@ int SNMPAgent::setCounter64Value(netsnmp_request_info* request, return SNMP_ERR_NOERROR; } -bool SNMPAgent::sendTrap(int fd, +bool SNMPAgent::sendTrap(pdns::channel::Sender<netsnmp_variable_list, void(*)(netsnmp_variable_list*)>& sender, netsnmp_variable_list* varList) { - ssize_t written = write(fd, &varList, sizeof(varList)); - - if (written != sizeof(varList)) { - snmp_free_varbind(varList); + try { + auto obj = std::unique_ptr<netsnmp_variable_list, void(*)(netsnmp_variable_list*)>(varList, snmp_free_varbind); + return sender.send(std::move(obj)); + } + catch (...) { return false; } - return true; } void SNMPAgent::handleTrapsEvent() { - netsnmp_variable_list* varList = nullptr; - ssize_t got = 0; - - do { - got = read(d_trapPipe[0], &varList, sizeof(varList)); - - if (got == sizeof(varList)) { - send_v2trap(varList); - snmp_free_varbind(varList); + try { + while (true) { + auto obj = d_receiver.receive(snmp_free_varbind); + if (!obj) { + break; + } + send_v2trap(obj->get()); } } - while (got > 0); + catch (const std::exception& e) { + } } void SNMPAgent::handleSNMPQueryEvent(int fd) @@ -78,7 +76,7 @@ void SNMPAgent::handleSNMPQueryEvent(int fd) snmp_read2(&fdset); } -void SNMPAgent::handleTrapsCB(int fd, FDMultiplexer::funcparam_t& var) +void SNMPAgent::handleTrapsCB(int /* fd */, FDMultiplexer::funcparam_t& var) { SNMPAgent** agent = boost::any_cast<SNMPAgent*>(&var); if (!agent || !*agent) @@ -121,7 +119,7 @@ void SNMPAgent::worker() /* we want to be notified if a trap is waiting to be sent */ - mplexer->addReadFD(d_trapPipe[0], &handleTrapsCB, this); + mplexer->addReadFD(d_receiver.getDescriptor(), &handleTrapsCB, this); while(true) { netsnmp_large_fd_set_init(&fdset, FD_SETSIZE); @@ -161,7 +159,7 @@ void SNMPAgent::worker() #endif /* HAVE_NET_SNMP */ } -SNMPAgent::SNMPAgent(const std::string& name, const std::string& daemonSocket) +SNMPAgent::SNMPAgent([[maybe_unused]] const std::string& name, [[maybe_unused]] const std::string& daemonSocket) { #ifdef HAVE_NET_SNMP netsnmp_enable_subagent(); @@ -187,20 +185,8 @@ SNMPAgent::SNMPAgent(const std::string& name, const std::string& daemonSocket) init_snmp(name.c_str()); - if (pipe(d_trapPipe) < 0) - unixDie("Creating pipe"); - - if (!setNonBlocking(d_trapPipe[0])) { - close(d_trapPipe[0]); - close(d_trapPipe[1]); - unixDie("Setting pipe non-blocking"); - } - - if (!setNonBlocking(d_trapPipe[1])) { - close(d_trapPipe[0]); - close(d_trapPipe[1]); - unixDie("Setting pipe non-blocking"); - } - + auto [sender, receiver] = pdns::channel::createObjectQueue<netsnmp_variable_list, void(*)(netsnmp_variable_list*)>(); + d_sender = std::move(sender); + d_receiver = std::move(receiver); #endif /* HAVE_NET_SNMP */ } |