X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=blobdiff_plain;f=resolver.c;h=d6bc61901085d78d3492bfa411f99c32957d9b56;hp=15b8e765c88f44a56601152308fa1bfe6ab4297c;hb=2093fb5ca832669236d9e4e8b6475a14b96b3d2a;hpb=75829536d59e3efdb592aee1effcedb72d9a8cc6 diff --git a/resolver.c b/resolver.c index 15b8e76..d6bc619 100644 --- a/resolver.c +++ b/resolver.c @@ -2,6 +2,7 @@ #include #include "secnet.h" +#include "util.h" #ifndef HAVE_LIBADNS #error secnet requires ADNS version 1.0 or above #endif @@ -19,12 +20,15 @@ struct adns { struct query { void *cst; + int port; + struct comm_if *comm; resolve_answer_fn *answer; adns_query query; }; static resolve_request_fn resolve_request; static bool_t resolve_request(void *sst, cstring_t name, + int port, struct comm_if *comm, resolve_answer_fn *cb, void *cst) { struct adns *st=sst; @@ -37,19 +41,24 @@ static bool_t resolve_request(void *sst, cstring_t name, char trimmed[maxlitlen+1]; memcpy(trimmed,name+1,l-2); trimmed[l-2]=0; - struct in_addr ia; - if (inet_aton(trimmed,&ia)) - cb(cst,&ia); + struct comm_addr ca; + ca.comm=comm; + ca.ia.sin.sin_family=AF_INET; + ca.ia.sin.sin_port=htons(port); + if (inet_aton(trimmed,&ca.ia.sin.sin_addr)) + cb(cst,&ca,1,1); else - cb(cst,0); + cb(cst,0,0,0); return True; } q=safe_malloc(sizeof *q,"resolve_request"); q->cst=cst; + q->comm=comm; + q->port=port; q->answer=cb; - rv=adns_submit(st->ast, name, adns_r_a, 0, q, &q->query); + rv=adns_submit(st->ast, name, adns_r_addr, 0, q, &q->query); if (rv) { Message(M_WARNING, "resolver: failed to submit lookup for %s: %s",name, @@ -85,11 +94,33 @@ static void resolver_afterpoll(void *sst, struct pollfd *fds, int nfds) if (rv==0) { q=qp; if (ans->status!=adns_s_ok) { - q->answer(q->cst,NULL); /* Failure */ + q->answer(q->cst,NULL,0,0); /* Failure */ free(q); free(ans); } else { - q->answer(q->cst,ans->rrs.inaddr); + int rslot, wslot, total; + int ca_len=MIN(ans->nrrs,MAX_PEER_ADDRS); + struct comm_addr ca_buf[ca_len]; + for (rslot=0, wslot=0, total=0; + rslotnrrs; + rslot++) { + total++; + if (!(wslotrrs.addr[rslot]; + struct comm_addr *ca=&ca_buf[wslot]; + ca->comm=q->comm; + switch (ra->addr.sa.sa_family) { + case AF_INET: + assert(ra->len == sizeof(ca->ia.sin)); + break; + default: + /* silently skip unexpected AFs from adns */ + continue; + } + memcpy(&ca->ia,&ra->addr,ra->len); + wslot++; + } + q->answer(q->cst,ca_buf,wslot,total); free(q); free(ans); }