hare

The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

commit 081ba3c1923b29b9af5ef5871cdd903c90b0eecb
parent 5fa89b1c48e0e97d97c22fadf458ca6e6571fb46
Author: Drew DeVault <sir@cmpwn.com>
Date:   Wed, 23 Jun 2021 10:01:54 -0400

net::dns: handle server errors in query

Signed-off-by: Drew DeVault <sir@cmpwn.com>

Diffstat:
Mnet/dns/error.ha | 10++++++++++
Mnet/dns/query.ha | 3++-
2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/net/dns/error.ha b/net/dns/error.ha @@ -41,3 +41,13 @@ export fn strerror(err: error) const str = { err: net::error => net::strerror(err), }; }; + +fn check_rcode(rcode: rcode) (void | error) = switch (rcode) { + rcode::NO_ERROR => void, + rcode::FMT_ERROR => format, + rcode::SERVER_FAILURE => server_failure, + rcode::NAME_ERROR => name_error, + rcode::NOT_IMPLEMENTED => not_implemented, + rcode::REFUSED => refused, + * => rcode: unknown_error, +}; diff --git a/net/dns/query.ha b/net/dns/query.ha @@ -20,6 +20,7 @@ export fn query(query: *message, addr: ip::addr...) (*message | error) = { // TODO: Query multiple servers udp::sendto(socket, sendbuf[..z], addr[0], 53)?; + let header = header { ... }; let recvbuf: [512]u8 = [0...]; for (true) { // TODO: Add timeout @@ -29,7 +30,6 @@ export fn query(query: *message, addr: ip::addr...) (*message | error) = { continue; }; - let header = header { ... }; let dec = decoder_init(recvbuf[..z]); decode_header(&dec, &header)?; if (header.id != query.header.id || header.op.qr != qr::RESPONSE) { @@ -39,5 +39,6 @@ export fn query(query: *message, addr: ip::addr...) (*message | error) = { break; }; + check_rcode(header.op.rcode)?; return decode(recvbuf[..z])?; };