pike.git
/
lib
/
modules
/
Protocols.pmod
/
DNS.pmod
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/lib/modules/Protocols.pmod/DNS.pmod:1023:
} //! Handle a query response (stub). //! //! Overload this function to handle responses to possible recursive queries. protected void handle_response(mapping r, mapping m, Stdio.UDP|object udp) { // This is a stub intended to simplify servers which allow recursion }
+
//! Report a failure to decode a DNS request.
+
//!
+
//! The default implementation writes a backtrace to stderr. This
+
//! method exists so that derived servers can replace it with more
+
//! appropriate error handling for their environment.
+
protected void report_decode_error(mixed err, mapping m, Stdio.UDP|object udp)
+
{
+
werror("DNS: Failed to read %s packet.\n%s\n",
+
udp->tcp_connection ? "TCP" : "UDP",
+
describe_backtrace(err));
+
}
+
+
//! Respond to a query that cannot be decoded.
+
//!
+
//! This method exists so that servers can override the default behaviour.
+
protected void handle_decode_error(mapping err, mapping m,
+
Stdio.UDP|object udp)
+
{
+
if(m && m->data && sizeof(m->data)>=2)
+
send_reply((["rcode":1]),
+
mkmapping(({"id"}), array_sscanf(m->data, "%2c")), m, udp);
+
}
+
//! Low-level DNS-data receiver. //! //! This function receives the raw DNS-data from the @[Stdio.UDP] socket //! or TCP connection object @[udp], decodes it, and dispatches the decoded //! DNS request to @[handle_query()] and @[handle_response()]. protected void rec_data(mapping m, Stdio.UDP|object udp) { mixed err; mapping q; if (err = catch { q=decode_res(m->data); }) {
-
werror("DNS: Failed to read %s packet.\n%s\n",
-
udp->tcp
_
connection ? "TCP" : "UDP",
-
describe
_
backtrace
(err
));
-
if(
m
&& m->data && sizeof(m->data
)
>=2)
-
send
_
reply((["rcode":1]),
-
mkmapping(({"id"}), array
_
sscanf
(
m->data
,
"%2c")),
m, udp);
+
report
_
decode
_
error
(err
,
m
,
udp
)
;
+
handle
_
decode
_
error
(
err
, m, udp);
} else if(q->qr) handle_response(q, m, udp); else handle_query(q, m, udp); } protected void send_reply(mapping r, mapping q, mapping m, Stdio.UDP|object con);