]> granicus.if.org Git - libevent/commitdiff
implement evdns_cancel_request; test one of the new evdns_base functions
authorNiels Provos <provos@gmail.com>
Thu, 25 Dec 2008 16:25:37 +0000 (16:25 +0000)
committerNiels Provos <provos@gmail.com>
Thu, 25 Dec 2008 16:25:37 +0000 (16:25 +0000)
svn:r980

evdns.c
include/event2/dns.h
test/regress_dns.c

diff --git a/evdns.c b/evdns.c
index ab309848ab5e369ad8b610d0d75447d3f44db5cc..f56f41ca0a5965eaacbcc466d7c093acaddc22b8 100644 (file)
--- 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,
index bfebcb73f39799c101740ffb293ce1a07cd6c15f..2aea49fd80e537081ce226a8a0d2dbb0c92ce309 100644 (file)
@@ -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.
index 0e48eef7508c3ae08514f8f9dd3aab51edb9f61a..66eb8810b96d7172a505379da2d1fefa7de43b30 100644 (file)
@@ -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);
 }