i noticed the list *after* sending the patch on a private email addy, apologize to the owner.
diffed against 1.4.1-beta, regress tests included -- adrian ilarion ciobanu (cia) http://pub.mud.ro/~cia/
-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.7 (FreeBSD) mQGiBEeDA88RBADj6/6ogFf7XLKuoFUZf8RkzSk+DUoZ4q1/hheyEiqIss0ixuWz RphMxo5iUL32sUMB+apjLhZQN0xaSnoxFyEOzRGKNv+VooSiLx89YpXRCJrBTjXT 56tFw0uIFm2bi4W+tl/UcK7E2lAC+pIhfm0Y0kTKeA7a69wwcPDwBi57NwCg9yYO zW4e/QHvan6HA+mOZOu73NsEAOOV9PW5k1rKswwQhYdzGFNn4ESe3BqV2MF1UFTc IJlPWQk0BLDv4U9shVIfbKMt7yPriFIThHx7kQrG+p8/S5W/hE9pgf9hV+uYImrv TMR04Jk0nh8atWAyrEN2TAdKRf8BUY+PQ3QcXyCrkHKOxamx86FoMKAPIbjAZOO/ puu3A/9qJ+HrUgcqr5z2ySZ6oJ1J/j8jlNevGuqG80aFyhUFQq35mjfuE4r16EoV AWTV7ykuRQ5bsuuFMs2q8C//Q8axBYAlShL7vdj8Up3GYh5k/5V8jyoWr3TbaV3u pI+08BeqkZGgROsWElNlzs5DQ5mTnv1fRlgpyUX/GtibCYZX67QjYWRyaWFuIGls YXJpb24gY2lvYmFudSA8Y2lhQG11ZC5ybz6IYAQTEQIAIAUCR4MDzwIbAwYLCQgH AwIEFQIIAwQWAgMBAh4BAheAAAoJEKJkaij4DxHn8z0AoLbr1chzsY81Ok8JRGrs R3GI/4dAAKCjduS70wfDpfxCU1RN59W3oOr/j9HRA9EBARAAAQEAAAAAAAAAAAAA AAD/2P/gABBKRklGAAEBAQBIAEgAAP/hABZFeGlmAABNTQAqAAAACAAAAAAAAP/+ AB1hZHJpYW4uaWxhcmlvbkBjaW9iYW51Lm5hbWX/2wBDAAEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCABGADIDASIAAhEBAxEB/8QAHQAA AgIDAQEBAAAAAAAAAAAAAAgHCQUGCgQCA//EAC4QAAIDAAEDBAIBAwQDAQAAAAID AQQFBgcREgAIEyEUFSMiMVEJMkFxFiRCof/EABsBAAICAwEAAAAAAAAAAAAAAAcI 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 =5rWz -----END PGP PUBLIC KEY BLOCK-----
diff -Nru libevent-1.4.1-beta/evdns.c libevent-1.4.1-beta-dnsmx/evdns.c
--- libevent-1.4.1-beta/evdns.c 2007-12-22 05:03:54.000000000 +0200
+++ libevent-1.4.1-beta-dnsmx/evdns.c 2008-01-17 09:22:44.000000000 +0200
@@ -49,6 +49,7 @@
/* #define NDEBUG */
+
#ifndef DNS_USE_CPU_CLOCK_FOR_ID
#ifndef DNS_USE_GETTIMEOFDAY_FOR_ID
#ifndef DNS_USE_OPENSSL_FOR_ID
@@ -162,7 +163,7 @@
#define TYPE_CNAME 5
#define TYPE_PTR EVDNS_TYPE_PTR
#define TYPE_AAAA EVDNS_TYPE_AAAA
-
+#define TYPE_MX EVDNS_TYPE_MX
#define CLASS_INET EVDNS_CLASS_INET
struct request {
@@ -196,7 +197,12 @@
u8 s6_addr[16];
};
#endif
-
+/*
+struct mx_rr {
+ u16 pri;
+ char host[HOST_NAME_MAX];
+};
+*/
struct reply {
unsigned int type;
unsigned int have_answer;
@@ -212,6 +218,10 @@
struct {
char name[HOST_NAME_MAX];
} ptr;
+ struct {
+ u32 mxcount;
+ struct mx_rr mxnames[MAX_ADDRS];
+ } mx;
} data;
};
@@ -668,6 +678,16 @@
else
req->user_callback(err, 0, 0, 0, NULL, req->user_pointer);
return;
+ case TYPE_MX:
+ if (reply) {
+ req->user_callback(DNS_ERR_NONE, DNS_MX,
+ reply->data.mx.mxcount, ttl,
+ reply->data.mx.mxnames,
+ req->user_pointer);
+ } else {
+ req->user_callback(err, 0, 0, 0, NULL, req->user_pointer);
+ }
+ return;
case TYPE_PTR:
if (reply) {
char *name = reply->data.ptr.name;
@@ -751,7 +771,6 @@
reply_callback(req, 0, error, NULL);
request_finished(req, &req_head);
} else {
- /* all ok, tell the user */
reply_callback(req, ttl, 0, reply);
nameserver_up(req->ns);
request_finished(req, &req_head);
@@ -873,7 +892,6 @@
/* now we have the answer section which looks like
* <label:name><u16:type><u16:class><u32:ttl><u16:len><data...>
*/
-
for (i = 0; i < answers; ++i) {
u16 type, class;
@@ -902,6 +920,24 @@
reply.data.a.addrcount += addrtocopy;
reply.have_answer = 1;
if (reply.data.a.addrcount == MAX_ADDRS) break;
+ } else if (type == TYPE_MX && class == CLASS_INET) {
+ if (req->request_type != TYPE_MX) {
+ printf("warning: type mx but we have request_type=%d\n", req->request_type);
+ j += datalength; continue;
+ }
+ ttl_r = MIN(ttl_r,ttl);
+ GET16(reply.data.mx.mxnames[reply.data.mx.mxcount].pri);
+ if (name_parse(packet, length, &j, reply.data.mx.mxnames[reply.data.mx.mxcount].host,
+ sizeof(reply.data.mx.mxnames[reply.data.mx.mxcount].host))<0) {
+ fprintf(stdout, "name_parse() error!\n");
+ goto err;
+ }
+ reply.data.mx.mxcount +=1;
+ reply.have_answer = 1;
+ if (reply.data.mx.mxcount == MAX_ADDRS) {
+ printf("reached MAX_ADDRS , skipping the next answers\n");
+ break;
+ }
} else if (type == TYPE_PTR && class == CLASS_INET) {
if (req->request_type != TYPE_PTR) {
j += datalength; continue;
@@ -936,7 +972,6 @@
j += datalength;
}
}
-
reply_handle(req, flags, ttl_r, &reply);
return 0;
err:
@@ -1554,7 +1589,14 @@
req, EVDNS_ANSWER_SECTION, name, TYPE_A, CLASS_INET,
ttl, n*4, 0, addrs);
}
-
+/* exported function */
+int
+evdns_server_request_add_mx_reply(struct evdns_server_request *req, const char *name, int n, void *addrs, int ttl)
+{
+ return evdns_server_request_add_reply(
+ req, EVDNS_ANSWER_SECTION,name,TYPE_MX, CLASS_INET,
+ ttl,n,0,addrs);
+}
/* exported function */
int
evdns_server_request_add_aaaa_reply(struct evdns_server_request *req, const char *name, int n, void *addrs, int ttl)
@@ -2286,6 +2328,22 @@
}
}
+/* exported function */
+int evdns_resolve_mx(const char *name, int flags,
+ evdns_callback_type callback, void *ptr) {
+ log(EVDNS_LOG_DEBUG, "Resolve requested for %s", name);
+ if (flags & DNS_QUERY_NO_SEARCH) {
+ struct request *const req =
+ request_new(TYPE_MX, name, flags, callback, ptr);
+ if (req == NULL)
+ return (1);
+ request_submit(req);
+ return (0);
+ } else {
+ return (search_request_new(TYPE_MX,name,flags,callback,ptr));
+ }
+}
+
int evdns_resolve_reverse(struct in_addr *in, int flags, evdns_callback_type callback, void *ptr) {
char buf[32];
struct request *req;
@@ -2485,7 +2543,7 @@
static int
search_request_new(int type, const char *const name, int flags, evdns_callback_type user_callback, void *user_arg) {
- assert(type == TYPE_A || type == TYPE_AAAA);
+ assert(type == TYPE_A || type == TYPE_AAAA || type == TYPE_MX);
if ( ((flags & DNS_QUERY_NO_SEARCH) == 0) &&
global_search_state &&
global_search_state->num_domains) {
diff -Nru libevent-1.4.1-beta/evdns.h libevent-1.4.1-beta-dnsmx/evdns.h
--- libevent-1.4.1-beta/evdns.h 2007-11-12 04:37:32.000000000 +0200
+++ libevent-1.4.1-beta-dnsmx/evdns.h 2008-01-17 09:19:17.000000000 +0200
@@ -193,7 +193,7 @@
#define DNS_IPv4_A 1
#define DNS_PTR 2
#define DNS_IPv6_AAAA 3
-
+#define DNS_MX 4
#define DNS_QUERY_NO_SEARCH 1
#define DNS_OPTION_SEARCH 1
@@ -201,6 +201,16 @@
#define DNS_OPTION_MISC 4
#define DNS_OPTIONS_ALL 7
+/*
+#ifndef HOST_NAME_MAX
+#define HOST_NAME_MAX 255
+#endif
+*/
+struct mx_rr {
+ uint16_t pri;
+ char host[255];
+};
+
/**
* The callback that contains the results from a lookup.
* - type is either DNS_IPv4_A or DNS_PTR or DNS_IPv6_AAAA
@@ -320,6 +330,17 @@
*/
int evdns_resolve_ipv4(const char *name, int flags, evdns_callback_type callback, void *ptr);
+/**
+ Lookup an MX record for a given name.
+
+ @param name a DNS hostname
+ @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()
+ */
+int evdns_resolve_mx(const char *name, int flags, evdns_callback_type callback, void *ptr);
/**
Lookup an AAAA record for a given name.
@@ -512,6 +533,7 @@
int evdns_server_request_add_reply(struct evdns_server_request *req, int section, const char *name, int type, int dns_class, int ttl, int datalen, int is_name, const char *data);
int evdns_server_request_add_a_reply(struct evdns_server_request *req, const char *name, int n, void *addrs, int ttl);
+int evdns_server_request_add_mx_reply(struct evdns_server_request *req, const char *name, int n, void *addrs, int ttl);
int evdns_server_request_add_aaaa_reply(struct evdns_server_request *req, const char *name, int n, void *addrs, int ttl);
int evdns_server_request_add_ptr_reply(struct evdns_server_request *req, struct in_addr *in, const char *inaddr_name, const char *hostname, int ttl);
int evdns_server_request_add_cname_reply(struct evdns_server_request *req, const char *name, const char *cname, int ttl);
diff -Nru libevent-1.4.1-beta/test/regress_dns.c libevent-1.4.1-beta-dnsmx/test/regress_dns.c
--- libevent-1.4.1-beta/test/regress_dns.c 2007-12-18 19:18:40.000000000 +0200
+++ libevent-1.4.1-beta-dnsmx/test/regress_dns.c 2008-01-17 09:46:41.000000000 +0200
@@ -73,7 +73,6 @@
void *addresses, void *arg)
{
dns_ok = dns_err = 0;
-
if (result == DNS_ERR_TIMEOUT) {
fprintf(stdout, "[Timed out] ");
dns_err = result;
@@ -116,6 +115,14 @@
fprintf(stderr, "%s ", inet_ntoa(in_addrs[i]));
break;
}
+ case DNS_MX: {
+ struct mx_rr *mxinf = addresses;
+ if (ttl < 0 || count < 1 )
+ goto out;
+ fprintf(stderr, "test_domain=%s,rr_count=%d, first rr: pri=%d,mxhost=%s ",
+ (char *)arg,count,mxinf[0].pri,mxinf[0].host);
+ break;
+ }
case DNS_PTR:
/* may get at most one PTR */
if (count != 1)
@@ -148,7 +155,21 @@
exit(1);
}
}
-
+static void
+dns_gethostmx(void)
+{
+ fprintf(stdout,"MX DNS resolve: ");
+ evdns_resolve_mx("aol.com",0,dns_gethostbyname_cb,"aol.com");
+ event_dispatch();
+ if (dns_ok == DNS_MX) {
+ fprintf(stdout,"OK\n");
+ } else if (!dns_ok && dns_err == DNS_ERR_TIMEOUT) {
+ fprintf(stdout, "SKIPPED\n");
+ } else {
+ fprintf(stdout, "FAILED (%d)\n", dns_ok);
+ exit(1);
+ }
+}
static void
dns_gethostbyname6(void)
{
@@ -217,6 +238,22 @@
"ZZ.EXAMPLE.COM", 54321);
if (r<0)
dns_ok = 0;
+ } else if (req->questions[i]->type == EVDNS_TYPE_MX &&
+ req->questions[i]->dns_question_class == EVDNS_CLASS_INET &&
+ !strcmp(req->questions[i]->name,"example.com")) {
+ uint32_t datalen = 9;
+ uint8_t len = 2;
+ char *addrs = (char *)malloc(/*mxpri*/ 2 + /*length of 2 labels */ 2 + /*c1.xx*/ 4);
+ bzero(addrs, 9);
+ /*let pri 0 */
+ /*len(c1)*/
+ memcpy(addrs+2,&len,1);
+ memcpy(addrs+3,"c1",2);
+ memcpy(addrs+5,&len,1);
+ memcpy(addrs+6,"xx",2);
+ r = evdns_server_request_add_mx_reply(req,"example.com",datalen,addrs,300);
+ if (r<0)
+ dns_ok = 0;
} else {
fprintf(stdout, "Unexpected question %d %d \"%s\" ",
req->questions[i]->type,
@@ -281,11 +318,21 @@
}
break;
}
+ case DNS_MX: {
+ struct mx_rr *mxinf = (struct mx_rr *)addresses;
+ if (mxinf[0].pri != 0 || strcmp(mxinf[0].host,"c1.xx") != 0) {
+ fprintf(stdout, "Unexpected MX reply pri=%d,mxhost=%s!\n",mxinf[0].pri,mxinf[0].host);
+ dns_ok = 0;
+ goto out;
+ } /*else {
+ fprintf(stderr, "MX_REPLY: %d %s [OK]\n", mxinf[0].pri,mxinf[0].host);
+ } */
+ break;
+ }
default:
fprintf(stdout, "Bad response type %d. ", type);
dns_ok = 0;
}
-
out:
if (++n_server_responses == 3) {
event_loopexit(NULL);
@@ -343,7 +390,8 @@
resolve_addr.s_addr = htonl(0xc0a80b0bUL); /* 192.168.11.11 */
evdns_resolve_reverse(&resolve_addr, 0,
dns_server_gethostbyname_cb, NULL);
-
+ evdns_resolve_mx("example.com",DNS_QUERY_NO_SEARCH,
+ dns_server_gethostbyname_cb,NULL);
event_dispatch();
if (dns_ok) {
@@ -371,6 +419,7 @@
dns_gethostbyname();
dns_gethostbyname6();
dns_gethostbyaddr();
+ dns_gethostmx();
evdns_shutdown(0);
}
pgpeLvHUolX4I.pgp
Description: PGP signature
_______________________________________________ Libevent-users mailing list [email protected] http://monkeymail.org/mailman/listinfo/libevent-users
