implement evdns_cancel_request; test one of the new evdns_base functions

svn:r980
This commit is contained in:
Niels Provos 2008-12-25 16:25:37 +00:00
parent 49f4c0ef88
commit 87be18daa1
3 changed files with 69 additions and 9 deletions

15
evdns.c
View File

@ -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,

View 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.

View 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);
}