]> git.ipfire.org Git - thirdparty/squid.git/blame - src/snmp/Inquirer.cc
Renamed squid.h to squid-old.h and config.h to squid.h
[thirdparty/squid.git] / src / snmp / Inquirer.cc
CommitLineData
51ea0904
CT
1/*
2 * $Id$
3 *
4 * DEBUG: section 49 SNMP Interface
5 *
6 */
7
f7f3304a 8#include "squid.h"
51ea0904
CT
9#include "base/TextException.h"
10#include "CommCalls.h"
1b76e6c1
AJ
11#include "comm.h"
12#include "comm/Connection.h"
51ea0904
CT
13#include "ipc/UdsOp.h"
14#include "snmp_core.h"
d6e3ad20
CT
15#include "snmp/Inquirer.h"
16#include "snmp/Response.h"
17#include "snmp/Request.h"
51ea0904
CT
18
19
20CBDATA_NAMESPACED_CLASS_INIT(Snmp, Inquirer);
21
22
23Snmp::Inquirer::Inquirer(const Request& aRequest, const Ipc::StrandCoords& coords):
24 Ipc::Inquirer(aRequest.clone(), coords, 2),
1b76e6c1 25 aggrPdu(aRequest.pdu)
51ea0904 26{
1b76e6c1
AJ
27 conn = new Comm::Connection;
28 conn->fd = aRequest.fd;
29 ImportFdIntoComm(conn, SOCK_DGRAM, IPPROTO_UDP, Ipc::fdnInSnmpSocket);
30
51ea0904 31 debugs(49, 5, HERE);
933a6aed 32 closer = asyncCall(49, 5, "Snmp::Inquirer::noteCommClosed",
51ea0904 33 CommCbMemFunT<Inquirer, CommCloseCbParams>(this, &Inquirer::noteCommClosed));
1b76e6c1 34 comm_add_close_handler(conn->fd, closer);
51ea0904
CT
35}
36
37/// closes our copy of the client connection socket
38void
39Snmp::Inquirer::cleanup()
40{
1b76e6c1 41 if (Comm::IsConnOpen(conn)) {
51ea0904 42 if (closer != NULL) {
1b76e6c1 43 comm_remove_close_handler(conn->fd, closer);
51ea0904
CT
44 closer = NULL;
45 }
1b76e6c1 46 conn->close();
51ea0904 47 }
1b76e6c1 48 conn = NULL;
51ea0904
CT
49}
50
51void
52Snmp::Inquirer::start()
53{
54 debugs(49, 5, HERE);
55 Ipc::Inquirer::start();
1b76e6c1 56 Must(Comm::IsConnOpen(conn));
51ea0904
CT
57 inquire();
58}
59
60void
61Snmp::Inquirer::handleException(const std::exception& e)
62{
63 aggrPdu.errstat = SNMP_ERR_GENERR;
64 Ipc::Inquirer::handleException(e);
65}
66
67bool
68Snmp::Inquirer::aggregate(Response::Pointer aResponse)
69{
70 Snmp::Response& response = static_cast<Snmp::Response&>(*aResponse);
71 bool error = response.pdu.errstat != SNMP_ERR_NOERROR;
72 if (error) {
73 aggrPdu = response.pdu;
74 } else {
75 aggrPdu.aggregate(response.pdu);
76 }
5654a599 77 return !error;
51ea0904
CT
78}
79
80/// called when the some external force closed our socket
81void
82Snmp::Inquirer::noteCommClosed(const CommCloseCbParams& params)
83{
84 debugs(49, 5, HERE);
1b76e6c1
AJ
85 Must(!Comm::IsConnOpen(conn) || conn->fd == params.conn->fd);
86 conn = NULL;
51ea0904
CT
87 mustStop("commClosed");
88}
89
90bool
91Snmp::Inquirer::doneAll() const
92{
93 return !writer && Ipc::Inquirer::doneAll();
94}
95
96void
97Snmp::Inquirer::sendResponse()
98{
99 debugs(49, 5, HERE);
e26257b2 100 aggrPdu.fixAggregate();
51ea0904
CT
101 aggrPdu.command = SNMP_PDU_RESPONSE;
102 u_char buffer[SNMP_REQUEST_SIZE];
103 int len = sizeof(buffer);
104 Snmp::Request& req = static_cast<Snmp::Request&>(*request);
105 snmp_build(&req.session, &aggrPdu, buffer, &len);
1b76e6c1 106 comm_udp_sendto(conn->fd, req.address, buffer, len);
51ea0904 107}