Hi,
We are using evdns for RBL requests and I think it may be useful to have
support of TXT records in evdns. I've made a patch to current trunk.
Regression test for TXT records asks a record from google.com (just for
testing), this can be a point to change.
--- evdns.c.orig 2008-09-10 19:40:25.344885214 +0400
+++ evdns.c 2008-09-10 20:01:01.516463201 +0400
@@ -155,6 +155,7 @@
#define TYPE_CNAME 5
#define TYPE_PTR EVDNS_TYPE_PTR
#define TYPE_AAAA EVDNS_TYPE_AAAA
+#define TYPE_TXT EVDNS_TYPE_TXT
#define CLASS_INET EVDNS_CLASS_INET
@@ -207,6 +208,10 @@
struct {
char name[HOST_NAME_MAX];
} ptr;
+ /* TXT field may be longer than 508 bytes, but UDP packets are limited to 512 octets */
+ struct {
+ char data[508];
+ } txt;
} data;
};
@@ -687,6 +692,16 @@
else
req->user_callback(err, 0, 0, 0, NULL, req->user_pointer);
return;
+ case TYPE_TXT:
+ if (reply) {
+ char *data = reply->data.txt.data;
+ req->user_callback(DNS_ERR_NONE, DNS_TXT, 1, ttl,
+ &data, req->user_pointer);
+ }
+ else {
+ req->user_callback(err, 0, 0, 0, NULL, req->user_pointer);
+ }
+ return;
}
assert(0);
}
@@ -950,6 +965,16 @@
j += 16*addrtocopy;
reply.have_answer = 1;
if (reply.data.aaaa.addrcount == MAX_ADDRS) break;
+ } else if (type == TYPE_TXT) {
+ if (req->request_type != TYPE_TXT) {
+ j += datalength;
+ continue;
+ }
+ memcpy(&reply.data.txt.data, packet + j + 1, MIN(sizeof(reply.data.txt.data), datalength - 1));
+ j += datalength;
+ ttl_r = MIN(ttl_r, ttl);
+ reply.have_answer = 1;
+ break;
} else {
/* skip over any other type of resource */
j += datalength;
@@ -2437,6 +2462,23 @@
? 0 : -1;
}
+struct evdns_request *
+evdns_base_resolve_txt(struct evdns_base *base, const char *in, int flags, evdns_callback_type callback, void *ptr) {
+ struct evdns_request *req;
+ assert(in);
+ log(EVDNS_LOG_DEBUG, "Resolve requested for %s (txt)", in);
+ req = request_new(base, TYPE_TXT, in, flags, callback, ptr);
+ if (!req) return NULL;
+ request_submit(req);
+ return req;
+}
+
+int
+evdns_resolve_txt(const char *in, int flags, evdns_callback_type callback, void *ptr) {
+ return evdns_base_resolve_txt(current_base, in, flags, callback, ptr)
+ ? 0 : -1;
+}
+
/*/////////////////////////////////////////////////////////////////// */
/* Search support */
/* */
--- evdns.h.orig 2008-09-10 19:50:32.380908466 +0400
+++ evdns.h 2008-09-10 19:52:58.009929005 +0400
@@ -193,6 +193,7 @@
#define DNS_IPv4_A 1
#define DNS_PTR 2
#define DNS_IPv6_AAAA 3
+#define DNS_TXT 4
#define DNS_QUERY_NO_SEARCH 1
@@ -376,6 +377,16 @@
int evdns_resolve_reverse_ipv6(struct in6_addr *in, int flags, evdns_callback_type callback, void *ptr);
struct evdns_request *evdns_base_resolve_reverse_ipv6(struct evdns_base *base, struct in6_addr *in, int flags, evdns_callback_type callback, void *ptr);
+/**
+ Lookup a TXT entry for a specified DNS name.
+ @param name a DNS name
+ @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
+*/
+int evdns_resolve_txt(const char *in, int flags, evdns_callback_type callback, void *ptr);
+struct evdns_request* evdns_base_resolve_txt(struct evdns_base *base, const char *in, int flags, evdns_callback_type callback, void *ptr);
/**
Set the value of a configuration option.
--- test/regress_dns.c.orig 2008-09-10 19:53:19.632882605 +0400
+++ test/regress_dns.c 2008-09-10 19:57:35.593441882 +0400
@@ -118,6 +118,7 @@
break;
}
case DNS_PTR:
+ case DNS_TXT:
/* may get at most one PTR */
if (count != 1)
goto out;
@@ -186,6 +187,22 @@
}
}
+static void
+dns_gettxtrec(void)
+{
+ fprintf(stdout, "Simple TXT DNS lookup: ");
+ dns_ok = 0;
+ evdns_resolve_txt("google.com", 0, dns_gethostbyname_cb, NULL);
+ event_dispatch();
+
+ if (dns_ok == DNS_TXT) {
+ fprintf(stdout, "OK\n");
+ } else {
+ fprintf(stdout, "FAILED\n");
+ exit(1);
+ }
+}
+
static int n_server_responses = 0;
static void
@@ -282,6 +299,10 @@
}
break;
}
+ case DNS_TXT: {
+ fprintf (stdout, "Got TXT record for google.com: %s\n", *(char **)addresses);
+ break;
+ }
default:
fprintf(stdout, "Bad response type %d. ", type);
dns_ok = 0;
@@ -372,6 +393,7 @@
dns_gethostbyname();
dns_gethostbyname6();
dns_gethostbyaddr();
+ dns_gettxtrec();
evdns_shutdown(0);
}
_______________________________________________
Libevent-users mailing list
[email protected]
http://monkeymail.org/mailman/listinfo/libevent-users