From 87be18daa192bdb2e75e56f1ef5226a0df6b2f73 Mon Sep 17 00:00:00 2001 From: Niels Provos Date: Thu, 25 Dec 2008 16:25:37 +0000 Subject: [PATCH] implement evdns_cancel_request; test one of the new evdns_base functions svn:r980 --- evdns.c | 15 +++++++++++++++ include/event2/dns.h | 24 ++++++++++++++++-------- test/regress_dns.c | 39 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 69 insertions(+), 9 deletions(-) diff --git a/evdns.c b/evdns.c index ab309848..f56f41ca 100644 --- a/evdns.c +++ b/evdns.c @@ -2401,6 +2401,21 @@ request_submit(struct evdns_request *const req) { } } +/* exported function */ +void +evdns_cancel_request(struct evdns_base *base, struct evdns_request *req) +{ + if (req->ns) { + /* remove from inflight queue */ + evdns_request_remove(req, &REQ_HEAD(base, req->trans_id)); + --base->global_requests_inflight; + } else { + /* remove from global_waiting head */ + evdns_request_remove(req, &base->req_waiting_head); + --base->global_requests_waiting; + } +} + /* exported function */ struct evdns_request * evdns_base_resolve_ipv4(struct evdns_base *base, const char *name, int flags, diff --git a/include/event2/dns.h b/include/event2/dns.h index bfebcb73..2aea49fd 100644 --- a/include/event2/dns.h +++ b/include/event2/dns.h @@ -326,8 +326,8 @@ struct evdns_request; @param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query. @param callback a callback function to invoke when the request is completed @param ptr an argument to pass to the callback function - @return 0 if successful, or -1 if an error occurred - @see evdns_resolve_ipv6(), evdns_resolve_reverse(), evdns_resolve_reverse_ipv6() + @return an evdns_request object if successful, or NULL if an error occurred. + @see evdns_resolve_ipv6(), evdns_resolve_reverse(), evdns_resolve_reverse_ipv6(), evdns_cancel_request() */ struct evdns_request *evdns_base_resolve_ipv4(struct evdns_base *base, const char *name, int flags, evdns_callback_type callback, void *ptr); @@ -339,8 +339,8 @@ struct evdns_request *evdns_base_resolve_ipv4(struct evdns_base *base, const cha @param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query. @param callback a callback function to invoke when the request is completed @param ptr an argument to pass to the callback function - @return 0 if successful, or -1 if an error occurred - @see evdns_resolve_ipv4(), evdns_resolve_reverse(), evdns_resolve_reverse_ipv6() + @return an evdns_request object if successful, or NULL if an error occurred. + @see evdns_resolve_ipv4(), evdns_resolve_reverse(), evdns_resolve_reverse_ipv6(), evdns_cancel_request() */ struct evdns_request *evdns_base_resolve_ipv6(struct evdns_base *base, const char *name, int flags, evdns_callback_type callback, void *ptr); @@ -355,8 +355,8 @@ struct in6_addr; @param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query. @param callback a callback function to invoke when the request is completed @param ptr an argument to pass to the callback function - @return 0 if successful, or -1 if an error occurred - @see evdns_resolve_reverse_ipv6() + @return an evdns_request object if successful, or NULL if an error occurred. + @see evdns_resolve_reverse_ipv6(), evdns_cancel_request() */ struct evdns_request *evdns_base_resolve_reverse(struct evdns_base *base, struct in_addr *in, int flags, evdns_callback_type callback, void *ptr); @@ -369,11 +369,19 @@ struct evdns_request *evdns_base_resolve_reverse(struct evdns_base *base, struct @param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query. @param callback a callback function to invoke when the request is completed @param ptr an argument to pass to the callback function - @return 0 if successful, or -1 if an error occurred - @see evdns_resolve_reverse_ipv6() + @return an evdns_request object if successful, or NULL if an error occurred. + @see evdns_resolve_reverse_ipv6(), evdns_cancel_request() */ struct evdns_request *evdns_base_resolve_reverse_ipv6(struct evdns_base *base, struct in6_addr *in, int flags, evdns_callback_type callback, void *ptr); +/** + Cancels a pending DNS resolution request. + + @param base the evdns_base that was used to make the request + @param req the evdns_request that was returned by calling a resolve function + @see evdns_base_resolve_ip4(), evdns_base_resolve_ipv6, evdns_base_resolve_reverse +*/ +void evdns_cancel_request(struct evdns_base *base, struct evdns_request *req); /** Set the value of a configuration option. diff --git a/test/regress_dns.c b/test/regress_dns.c index 0e48eef7..66eb8810 100644 --- a/test/regress_dns.c +++ b/test/regress_dns.c @@ -131,7 +131,10 @@ dns_gethostbyname_cb(int result, char type, int count, int ttl, dns_ok = type; out: - event_loopexit(NULL); + if (arg == NULL) + event_loopexit(NULL); + else + event_base_loopexit((struct event_base *)arg, NULL); } static void @@ -186,6 +189,38 @@ dns_gethostbyaddr(void) } } +static void +dns_resolve_reverse(void) +{ + struct in_addr in; + struct event_base *base = event_base_new(); + struct evdns_base *dns = evdns_base_new(base, 1/* init name servers */); + struct evdns_request *req = NULL; + + in.s_addr = htonl(0x7f000001ul); /* 127.0.0.1 */ + fprintf(stdout, "Simple reverse DNS resolve (base): "); + dns_ok = 0; + + req = evdns_base_resolve_reverse( + dns, &in, 0, dns_gethostbyname_cb, base); + if (req == NULL) { + fprintf(stdout, "FAILED\n"); + exit(1); + } + + event_base_dispatch(base); + + if (dns_ok == DNS_PTR) { + fprintf(stdout, "OK\n"); + } else { + fprintf(stdout, "FAILED\n"); + exit(1); + } + + evdns_base_free(dns, 0); + event_base_free(base); +} + static int n_server_responses = 0; static void @@ -376,5 +411,7 @@ dns_suite(void) dns_gethostbyname6(); dns_gethostbyaddr(); + dns_resolve_reverse(); + evdns_shutdown(0); } -- 2.50.1