X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=secnet.git;a=blobdiff_plain;f=resolver.c;h=15b8e765c88f44a56601152308fa1bfe6ab4297c;hp=282db8008800b34644a68a41fc64ee3dab6c56ea;hb=76f7ef9c6d027f024d432c7d06c278a3e5efae33;hpb=d3fe100dfc120244d316e083ce87b1eb130fe4fd diff --git a/resolver.c b/resolver.c index 282db80..15b8e76 100644 --- a/resolver.c +++ b/resolver.c @@ -6,6 +6,8 @@ #error secnet requires ADNS version 1.0 or above #endif #include +#include +#include struct adns { @@ -21,32 +23,52 @@ struct query { adns_query query; }; -static bool_t resolve_request(void *sst, string_t name, +static resolve_request_fn resolve_request; +static bool_t resolve_request(void *sst, cstring_t name, resolve_answer_fn *cb, void *cst) { struct adns *st=sst; struct query *q; int rv; + const int maxlitlen=50; + + ssize_t l=strlen(name); + if (name[0]=='[' && l2 && name[l-1]==']') { + 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); + else + cb(cst,0); + return True; + } q=safe_malloc(sizeof *q,"resolve_request"); q->cst=cst; q->answer=cb; rv=adns_submit(st->ast, name, adns_r_a, 0, q, &q->query); + if (rv) { + Message(M_WARNING, + "resolver: failed to submit lookup for %s: %s",name, + adns_strerror(rv)); + free(q); + return False; + } - return rv==0; + return True; } static int resolver_beforepoll(void *sst, struct pollfd *fds, int *nfds_io, - int *timeout_io, const struct timeval *tv_now, - uint64_t *now) + int *timeout_io) { struct adns *st=sst; return adns_beforepoll(st->ast, fds, nfds_io, timeout_io, tv_now); } -static void resolver_afterpoll(void *sst, struct pollfd *fds, int nfds, - const struct timeval *tv_now, uint64_t *now) +static void resolver_afterpoll(void *sst, struct pollfd *fds, int nfds) { struct adns *st=sst; adns_query aq; @@ -74,7 +96,7 @@ static void resolver_afterpoll(void *sst, struct pollfd *fds, int nfds, } else if (rv==EAGAIN || rv==ESRCH) { break; } else { - fatal("resolver_afterpoll: adns_check() returned %d\n",rv); + fatal("resolver_afterpoll: adns_check() returned %d",rv); } } @@ -122,7 +144,6 @@ static list_t *adnsresolver_apply(closure_t *self, struct cloc loc, return new_closure(&st->cl); } -init_module resolver_module; void resolver_module(dict_t *dict) { add_closure(dict,"adns",adnsresolver_apply);